00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef header_alphamask_blitter
00018 #define header_alphamask_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
00027 template <class T>
00028 class BltRLERow_AlphaMask
00029 {
00030 protected:
00031 T rmask, gmask, bmask, rstart, gstart, bstart, rlength, glength, blength;
00032 T *lookup_r;
00033 T *lookup_g;
00034 T *lookup_b;
00035
00036 public:
00037 BltRLERow_AlphaMask(
00038 T _rmask,
00039 T _gmask,
00040 T _bmask,
00041 T _rstart,
00042 T _gstart,
00043 T _bstart,
00044 T _rlength,
00045 T _glength,
00046 T _blength) :
00047 rmask(_rmask), gmask(_gmask), bmask(_bmask),
00048 rstart(_rstart), gstart(_gstart), bstart(_bstart),
00049 rlength(_rlength), glength(_glength), blength(_blength)
00050 {
00051 int rsize = 2<<rlength;
00052 int gsize = 2<<glength;
00053 int bsize = 2<<blength;
00054 lookup_r = new T[rsize*256];
00055 lookup_g = new T[gsize*256];
00056 lookup_b = new T[bsize*256];
00057
00058 int i;
00059
00060 for (i=0;i<256;i++)
00061 {
00062 int g;
00063 for (g=0;g<rsize;g++) lookup_r[(g<<8)+i] = (T) (float(g)*i)/255;
00064 for (g=0;g<gsize;g++) lookup_g[(g<<8)+i] = (T) (float(g)*i)/255;
00065 for (g=0;g<bsize;g++) lookup_b[(g<<8)+i] = (T) (float(g)*i)/255;
00066 }
00067 }
00068
00069 virtual ~BltRLERow_AlphaMask()
00070 {
00071 delete[] lookup_r;
00072 delete[] lookup_g;
00073 delete[] lookup_b;
00074 }
00075
00076 virtual void show_alpha_row(
00077 T *src_data,
00078 T *dst_data,
00079 unsigned char *alpha_data,
00080 int rep)=0;
00081 };
00082
00083 template <class T>
00084 class BLTRLERow_AlphaMask_Direct : public BltRLERow_AlphaMask<T>
00085 {
00086 public:
00087 BLTRLERow_AlphaMask_Direct(
00088 T _rmask,
00089 T _gmask,
00090 T _bmask,
00091 T _rstart,
00092 T _gstart,
00093 T _bstart,
00094 T _rlength,
00095 T _glength,
00096 T _blength) : BltRLERow_AlphaMask<T>(_rmask, _gmask, _bmask, _rstart, _gstart, _bstart, _rlength, _glength, _blength)
00097 {
00098
00099 }
00100
00101 virtual void show_alpha_row(
00102 T *src_data,
00103 T *dst_data,
00104 unsigned char *alpha_data,
00105 int rep)
00106 {
00107 for (int x=0;x<rep;x++)
00108 {
00109 T a = alpha_data[x];
00110 T destval = dst_data[x];
00111 T r = lookup_r[(((destval&rmask)>>rstart)<<8)+a];
00112 T g = lookup_g[(((destval&gmask)>>gstart)<<8)+a];
00113 T b = lookup_b[(((destval&bmask)>>bstart)<<8)+a];
00114
00115 T amix =
00116 (r<<rstart) +
00117 (g<<gstart) +
00118 (b<<bstart);
00119
00120 dst_data[x] = amix + *(src_data++);
00121 }
00122 }
00123 };
00124
00125 template <class T>
00126 class BLTRLERow_AlphaMask_Buffered : public BltRLERow_AlphaMask<T>
00127 {
00128 public:
00129 BLTRLERow_AlphaMask_Buffered(
00130 T _rmask,
00131 T _gmask,
00132 T _bmask,
00133 T _rstart,
00134 T _gstart,
00135 T _bstart,
00136 T _rlength,
00137 T _glength,
00138 T _blength) : BltRLERow_AlphaMask<T>(_rmask, _gmask, _bmask, _rstart, _gstart, _bstart, _rlength, _glength, _blength)
00139 {
00140
00141 }
00142
00143 virtual void show_alpha_row(
00144 T *src_data,
00145 T *dst_data,
00146 unsigned char *alpha_data,
00147 int rep)
00148 {
00149 T dst_buf[1280];
00150 memcpy(dst_buf, dst_data, sizeof(T)*rep);
00151 for (int x=0;x<rep;x++)
00152 {
00153 T a = alpha_data[x];
00154 T destval = dst_buf[x];
00155 T r = lookup_r[(((destval&rmask)>>rstart)<<8)+a];
00156 T g = lookup_g[(((destval&gmask)>>gstart)<<8)+a];
00157 T b = lookup_b[(((destval&bmask)>>bstart)<<8)+a];
00158
00159 T amix =
00160 (r<<rstart) +
00161 (g<<gstart) +
00162 (b<<bstart);
00163
00164 dst_buf[x] = amix + *(src_data++);
00165 }
00166 memcpy(dst_data, dst_buf, sizeof(T)*rep);
00167 }
00168 };
00169
00170 template <class T>
00171 class SubBlitter_AlphaMask
00172 {
00173 public:
00174 static void blt_noclip(
00175 CL_Blit_AlphaMask_RLE *parent,
00176 CL_Target *target,
00177 BltRLERow_AlphaMask<T> *row_blitter,
00178 int x,
00179 int y,
00180 int spr_no);
00181
00182 static void blt_clip(
00183 CL_Blit_AlphaMask_RLE *parent,
00184 CL_Target *target,
00185 BltRLERow_AlphaMask<T> *row_blitter,
00186 int x,
00187 int y,
00188 int spr_no,
00189 const CL_ClipRect &clip);
00190
00191 static void blt_scale_noclip(
00192 CL_Blit_AlphaMask_RLE *parent,
00193 CL_Target *target,
00194 BltRLERow_AlphaMask<T> *row_blitter,
00195 int x,
00196 int y,
00197 int dest_width,
00198 int dest_height,
00199 int spr_no);
00200
00201 static void blt_scale_clip(
00202 CL_Blit_AlphaMask_RLE *parent,
00203 CL_Target *target,
00204 BltRLERow_AlphaMask<T> *row_blitter,
00205 int x,
00206 int y,
00207 int dest_width,
00208 int dest_height,
00209 int spr_no,
00210 const CL_ClipRect &clip);
00211
00212 private:
00213 static void unpack_line(
00214 T *dest,
00215 unsigned char *transparent_dest,
00216 unsigned char *source_data,
00217 int num_pixels);
00218 };
00219
00220 template <class T>
00221 class PixelConstructor_AlphaMask
00222 {
00223 public:
00224 static void save_pixel(
00225 CL_Target *target,
00226 CL_ColorMap *colormap,
00227 unsigned char *value,
00228 unsigned char *dest,
00229 unsigned char alpha,
00230 int x,
00231 int *cmd_pos)
00232 {
00233 T val = ((T *) value)[x];
00234 T r = (((val&target->get_red_mask())>>colormap->m_red_start)*alpha)>>8;
00235 T g = (((val&target->get_green_mask())>>colormap->m_green_start)*alpha)>>8;
00236 T b = (((val&target->get_blue_mask())>>colormap->m_blue_start)*alpha)>>8;
00237
00238 *((T *) dest) =
00239 (r<<colormap->m_red_start)+
00240 (g<<colormap->m_green_start)+
00241 (b<<colormap->m_blue_start);
00242
00243 *cmd_pos += sizeof(T);
00244 }
00245 };
00246
00247
00248 class CL_Blit_AlphaMask_RLE :
00249 public CL_Blit_NoClip,
00250 public CL_Blit_Clip,
00251 public CL_Blit_Scale_NoClip,
00252 public CL_Blit_Scale_Clip
00253 {
00254 public:
00255 CL_Blit_AlphaMask_RLE(
00256 CL_DisplayCard_Generic *card,
00257 CL_SurfaceProvider *provider,
00258 unsigned char *image_data,
00259 int image_bytes_pr_line,
00260 unsigned char *alpha_data,
00261 int alpha_bytes_pr_line);
00262
00263 virtual ~CL_Blit_AlphaMask_RLE();
00264
00265 virtual void blt_noclip(
00266 CL_Target *target,
00267 int x,
00268 int y,
00269 int spr_no);
00270
00271 virtual void blt_clip(
00272 CL_Target *target,
00273 int x,
00274 int y,
00275 int spr_no,
00276 const CL_ClipRect &clip);
00277
00278 virtual void blt_scale_noclip(
00279 CL_Target *target,
00280 int x,
00281 int y,
00282 int dest_width,
00283 int dest_height,
00284 int spr_no);
00285
00286 virtual void blt_scale_clip(
00287 CL_Target *target,
00288 int x,
00289 int y,
00290 int dest_width,
00291 int dest_height,
00292 int spr_no,
00293 const CL_ClipRect &clip);
00294
00296 private:
00297 unsigned char **m_lines;
00298 unsigned char **m_alpha_lines;
00299 unsigned int m_num_lines;
00300
00301 unsigned int m_width, m_height;
00302
00303 enum
00304 {
00305 cmd_skip,
00306 cmd_alpha
00307 };
00308
00309 friend SubBlitter_AlphaMask<unsigned short>;
00310 friend SubBlitter_AlphaMask<unsigned int>;
00311
00312 static BltRLERow_AlphaMask<unsigned short> *bltrow_16bit;
00313 static BltRLERow_AlphaMask<unsigned int> *bltrow_32bit;
00314
00315 void check_16bit_rowblitter(CL_Target *target);
00316 void check_32bit_rowblitter(CL_Target *target);
00317
00318 void make_line(
00319 CL_Target *target,
00320 CL_SurfaceProvider *provider,
00321 int line_num,
00322 unsigned char *input_data,
00323 unsigned char *alpha_data);
00324 };
00325
00326 #endif