Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

blit_alphamask_rle.h

Go to the documentation of this file.
00001 /*
00002         $Id: blit_alphamask_rle.h,v 1.1 2001/03/06 15:09:17 mbn Exp $
00003 
00004         ------------------------------------------------------------------------
00005         ClanLib, the platform independent game SDK.
00006 
00007         This library is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE
00008         version 2. See COPYING for details.
00009 
00010         For a total list of contributers see CREDITS.
00011 
00012         Alpha-only blitter.
00013         This file by Martin Starch (starch@dark.x.dtu.dk) 3/99
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 //              std::cout << "Creating direct " << sizeof(T) << " byte alpha-blitter" << std::endl;
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];       //(((destval&rmask)>>rstart)*a)>>8;
00112                         T g = lookup_g[(((destval&gmask)>>gstart)<<8)+a];       //(((destval&gmask)>>gstart)*a)>>8;
00113                         T b = lookup_b[(((destval&bmask)>>bstart)<<8)+a];       //(((destval&bmask)>>bstart)*a)>>8;
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 //              std::cout << "Creating buffered " << sizeof(T) << " byte alpha-blitter" << std::endl;
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];       //(((destval&rmask)>>rstart)*a)>>8;
00156                         T g = lookup_g[(((destval&gmask)>>gstart)<<8)+a];       //(((destval&gmask)>>gstart)*a)>>8;
00157                         T b = lookup_b[(((destval&bmask)>>bstart)<<8)+a];       //(((destval&bmask)>>bstart)*a)>>8;
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

Generated at Wed Apr 4 19:53:58 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001