00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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 }