00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef header_transparent_blitter
00018 #define header_transparent_blitter
00019
00020 #include "blitters.h"
00021 #include "colormap.h"
00022
00023 class CL_DisplayCard_Generic;
00024 class CL_SurfaceProvider;
00025 class CL_Blit_AlphaMask_RLE;
00026 class CL_Blit_Transparent;
00027
00028 template <class T>
00029 class BltRLERow_Transparent
00030 {
00031 public:
00032 static void show_row(
00033 T *src_data,
00034 T *dst_data,
00035 int rep)
00036 {
00037 memcpy(dst_data, src_data, rep*sizeof(T));
00038 }
00039 };
00040
00041 template <class T>
00042 class SubBlitter_Transparent
00043 {
00044 public:
00045 static void blt_noclip(
00046 CL_Blit_Transparent *parent,
00047 CL_Target *target,
00048 int x,
00049 int y,
00050 int spr_no);
00051
00052 static void blt_clip(
00053 CL_Blit_Transparent *parent,
00054 CL_Target *target,
00055 int x,
00056 int y,
00057 int spr_no,
00058 const CL_ClipRect &clip);
00059
00060 static void blt_scale_noclip(
00061 CL_Blit_Transparent *parent,
00062 CL_Target *target,
00063 int x,
00064 int y,
00065 int dest_width,
00066 int dest_height,
00067 int spr_no);
00068
00069 static void blt_scale_clip(
00070 CL_Blit_Transparent *parent,
00071 CL_Target *target,
00072 int x,
00073 int y,
00074 int dest_width,
00075 int dest_height,
00076 int spr_no,
00077 const CL_ClipRect &clip);
00078 private:
00079 static void unpack_line(
00080 T *dest,
00081 unsigned char *transparent_dest,
00082 unsigned char *source_data,
00083 int num_pixels);
00084 };
00085
00086
00087 class CL_Blit_Transparent :
00088 public CL_Blit_NoClip,
00089 public CL_Blit_Clip,
00090 public CL_Blit_Scale_NoClip,
00091 public CL_Blit_Scale_Clip
00092 {
00093 public:
00094 CL_Blit_Transparent(CL_DisplayCard_Generic *card, CL_SurfaceProvider *provider);
00095 virtual ~CL_Blit_Transparent();
00096
00097 bool init_surface(CL_Blitters *blitters);
00098
00099 virtual void blt_noclip(
00100 CL_Target *target,
00101 int x,
00102 int y,
00103 int spr_no);
00104
00105 virtual void blt_clip(
00106 CL_Target *target,
00107 int x,
00108 int y,
00109 int spr_no,
00110 const CL_ClipRect &clip);
00111
00112 virtual void blt_scale_noclip(
00113 CL_Target *target,
00114 int x,
00115 int y,
00116 int dest_width,
00117 int dest_height,
00118 int spr_no);
00119
00120 virtual void blt_scale_clip(
00121 CL_Target *target,
00122 int x,
00123 int y,
00124 int dest_width,
00125 int dest_height,
00126 int spr_no,
00127 const CL_ClipRect &clip);
00128
00129 private:
00130 CL_DisplayCard_Generic *m_card;
00131 CL_SurfaceProvider *m_provider;
00132 CL_Blit_AlphaMask_RLE *m_contained_alpha_blitter;
00133
00134 unsigned char **m_lines;
00135 unsigned int m_num_lines;
00136
00137 unsigned int m_width, m_height;
00138
00139 enum RLECommand
00140 {
00141 cmd_skip,
00142 cmd_copy
00143 };
00144
00145 friend SubBlitter_Transparent<unsigned short>;
00146 friend SubBlitter_Transparent<unsigned int>;
00147
00148 void make_line(
00149 CL_Target *target,
00150 CL_SurfaceProvider *provider,
00151 int line_num,
00152 unsigned char *input_data,
00153 unsigned char *alpha_data);
00154
00155 };
00156
00157 #endif