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

pixelformat.cpp

Go to the documentation of this file.
00001 /*
00002         $Id: pixelformat.cpp,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         ------------------------------------------------------------------------
00013 */
00014 
00015 
00016 #include "Core/precomp.h"
00017 #include "API/Display/Display/target.h"
00018 #include "API/Core/System/cl_assert.h"
00019 #include "API/Core/IOData/cl_endian.h"
00020 
00021 unsigned int CL_Color::get_red_mask(EPixelFormat pixelformat)
00022 {
00023         if (CL_Endian::is_system_big())
00024         {
00025                 switch(pixelformat)
00026                 {
00027                         case RGB565:    return ( 31 );
00028                         case RGBA4444:  return ( 15 );
00029                         case RGBA5551:  return ( 31 );
00030                         case RGB888:    return ( 255 );
00031                         case RGBA8888:  return ( 255 );
00032                         case PAL8: break;
00033                 }
00034         }
00035         else
00036         {
00037                 switch(pixelformat)
00038                 {
00039                         case RGB565:    return ( 31 << (6+5) );
00040                         case RGBA4444:  return ( 15 << (4+4+4) );
00041                         case RGBA5551:  return ( 31 << (5+5+1) );
00042                         case RGB888:    return ( 255 << (8+8) );
00043                         case RGBA8888:  return ( 255 << (8+8+8) );
00044                         case PAL8: break;
00045                 }
00046         }
00047         return 0;
00048 }
00049                         
00050 unsigned int CL_Color::get_green_mask(EPixelFormat pixelformat)
00051 {
00052         if (CL_Endian::is_system_big())
00053         {
00054                 switch(pixelformat)
00055                 {
00056                         case RGB565:    return ( 63 << (5) );
00057                         case RGBA4444:  return ( 15 << (4) );
00058                         case RGBA5551:  return ( 31 << (5) );
00059                         case RGB888:    return ( 255 << (8) );
00060                         case RGBA8888:  return ( 255 << (8) );
00061                         case PAL8: break;
00062                 }
00063         }
00064         else
00065         {
00066                 switch(pixelformat)
00067                 {
00068                         case RGB565:    return ( 63 << (5) );
00069                         case RGBA4444:  return ( 15 << (4+4) );
00070                         case RGBA5551:  return ( 31 << (5+1) );
00071                         case RGB888:    return ( 255 << (8) );
00072                         case RGBA8888:  return ( 255 << (8+8) );
00073                         case PAL8: break;
00074                 }
00075         }
00076         return 0;
00077 }
00078 
00079 unsigned int CL_Color::get_blue_mask(EPixelFormat pixelformat)
00080 {
00081         if (CL_Endian::is_system_big())
00082         {
00083                 switch(pixelformat)
00084                 {
00085                         case RGB565:    return ( 31 << (5+6) );
00086                         case RGBA4444:  return ( 15 << (4+4) );
00087                         case RGBA5551:  return ( 31 << (5+5) );
00088                         case RGB888:    return ( 255 << (8+8) );
00089                         case RGBA8888:  return ( 255 << (8+8) );
00090                         case PAL8: break;
00091                 }
00092         }
00093         else
00094         {
00095                 switch(pixelformat)
00096                 {
00097                         case RGB565:    return ( 31 );
00098                         case RGBA4444:  return ( 15 << (4) );
00099                         case RGBA5551:  return ( 31 << (1) );
00100                         case RGB888:    return ( 255 );
00101                         case RGBA8888:  return ( 255 << (8) );
00102                         case PAL8: break;
00103                 }
00104         }
00105         return 0;
00106 }
00107 
00108 unsigned int CL_Color::get_alpha_mask(EPixelFormat pixelformat)
00109 {
00110         if (CL_Endian::is_system_big())
00111         {
00112                 switch(pixelformat)
00113                 {
00114                         case RGB565:    return ( 0 );
00115                         case RGBA4444:  return ( 15 << (4+4+4) );
00116                         case RGBA5551:  return ( 1 << (5+5+5) );
00117                         case RGB888:    return ( 0 );
00118                         case RGBA8888:  return ( 255 << (8+8+8) );
00119                         case PAL8: break;
00120                 }
00121         }
00122         else
00123         {
00124                 switch(pixelformat)
00125                 {
00126                         case RGB565:    return ( 0 );
00127                         case RGBA4444:  return ( 15 );
00128                         case RGBA5551:  return ( 1 );
00129                         case RGB888:    return ( 0 );
00130                         case RGBA8888:  return ( 255 );
00131                         case PAL8: break;
00132                 }
00133         }
00134         return 0;
00135 }       
00136 
00137 unsigned int CL_Color::get_color(EPixelFormat fmt, int r, int g, int b, int a)
00138 {
00139         return CL_Color::get_color(CL_Color::get_red_mask(fmt),
00140                 CL_Color::get_green_mask(fmt),
00141                 CL_Color::get_blue_mask(fmt),
00142                 CL_Color::get_alpha_mask(fmt),
00143                 r,g,b,a);
00144 }
00145 
00146 unsigned int CL_Color::get_color(
00147         EPixelFormat fmt,
00148         float r,
00149         float g,
00150         float b,
00151         float a)
00152 {
00153         return CL_Color::get_color(
00154                 CL_Color::get_red_mask(fmt),
00155                 CL_Color::get_green_mask(fmt),
00156                 CL_Color::get_blue_mask(fmt),
00157                 CL_Color::get_alpha_mask(fmt),
00158                 (int) (255*r), 
00159                 (int) (255*g),
00160                 (int) (255*b),
00161                 (int) (255*a));
00162 }
00163 
00164 unsigned int CL_Color::get_color(
00165         unsigned int rmask,
00166         unsigned int gmask,
00167         unsigned int bmask,
00168         unsigned int amask, 
00169         float r, float g, float b, float a)          
00170 {
00171         return CL_Color::get_color(
00172                 rmask,
00173                 gmask,
00174                 bmask,
00175                 amask,
00176                 (int) (255*r), 
00177                 (int) (255*g),
00178                 (int) (255*b),
00179                 (int) (255*a));
00180 }
00181 
00182 unsigned int CL_Color::get_color(
00183         unsigned int rmask,
00184         unsigned int gmask,
00185         unsigned int bmask,
00186         unsigned int amask, 
00187         int r, int g, int b, int a)          
00188 {
00189         // here comes the tricky part ... hmhmhm... Quicky Mart
00190         unsigned int rshift, gshift, bshift, ashift, tmp;
00191         unsigned int rtmp, gtmp, btmp, atmp;
00192         
00193         rshift = 32; tmp = rmask;
00194         while (tmp!=0)
00195         {
00196                 tmp = (tmp << 1); rshift--;
00197         }
00198         
00199         gshift = 32; tmp = gmask;
00200         while (tmp!=0)
00201         {
00202                 tmp = (tmp << 1); gshift--;
00203         }
00204         bshift = 32; tmp = bmask;
00205         while (tmp!=0)
00206         {
00207                 tmp = (tmp << 1); bshift--;
00208         }
00209         
00210         ashift = 32; tmp = amask;
00211         while (tmp!=0)
00212         {
00213                 tmp = (tmp << 1); ashift--;
00214         }
00215 
00216         rtmp = rmask >> rshift;
00217         gtmp = gmask >> gshift;
00218         btmp = bmask >> bshift;
00219         atmp = amask >> ashift;            
00220         
00221         tmp = (((unsigned int) (r/255.0 * rtmp)) << rshift) |
00222               (((unsigned int) (g/255.0 * gtmp)) << gshift) |
00223           (((unsigned int) (b/255.0 * btmp)) << bshift) |
00224           (((unsigned int) (a/255.0 * atmp)) << ashift);
00225 
00226         return tmp; 
00227 }
00228 
00229 unsigned int CL_Color::get_color(
00230         CL_Target* target,
00231         int r, int g, int b, int a)
00232 {
00233         return get_color(
00234                 target->get_red_mask(), 
00235                 target->get_green_mask(),
00236                 target->get_blue_mask(),
00237                 target->get_alpha_mask(),
00238                 r,g,b,a);
00239 }
00240 
00241 unsigned int CL_Color::get_color(
00242         CL_Target* target,
00243         float r, float g, float b, float a)
00244 {
00245         return get_color(
00246                 target->get_red_mask(), 
00247                 target->get_green_mask(),
00248                 target->get_blue_mask(),
00249                 target->get_alpha_mask(),
00250                 (int) (255*r), 
00251                 (int) (255*g),
00252                 (int) (255*b),
00253                 (int) (255*a));
00254 }
00255 
00256 
00257 float CL_Color::get_color(unsigned int mask, int color)
00258 {
00259         unsigned int tmp = color & mask;        
00260         unsigned int shift = 32;
00261 
00262         while (tmp != 0) 
00263         {
00264                 tmp = tmp << 1;
00265                 shift --;
00266         }      
00267 
00268         return ((float) (color & mask)) / ((float) (mask >> shift));
00269 }

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