Go to the source code of this file.
Functions | |
static void | util_pack_color_ub (ubyte r, ubyte g, ubyte b, ubyte a, enum pipe_format format, void *dest) |
Pack ubyte R,G,B,A into dest pixel. | |
static void | util_unpack_color_ub (enum pipe_format format, const void *src, ubyte *r, ubyte *g, ubyte *b, ubyte *a) |
Unpack RGBA from a packed pixel, returning values as ubytes in [0,255]. | |
static void | util_pack_color (const float rgba[4], enum pipe_format format, void *dest) |
Note rgba outside [0,1] will be clamped for int pixel formats. | |
static uint | util_pack_z (enum pipe_format format, double z) |
Note: it's assumed that z is in [0,1]. | |
static unsigned | pack_ub4 (ubyte b0, ubyte b1, ubyte b2, ubyte b3) |
Pack 4 ubytes into a 4-byte word. | |
static unsigned | pack_ui32_float4 (float a, float b, float c, float d) |
Pack/convert 4 floats into one 4-byte word. |
Definition in file u_pack_color.h.
Pack 4 ubytes into a 4-byte word.
Definition at line 449 of file u_pack_color.h.
00450 { 00451 return ((((unsigned int)b0) << 0) | 00452 (((unsigned int)b1) << 8) | 00453 (((unsigned int)b2) << 16) | 00454 (((unsigned int)b3) << 24)); 00455 }
static unsigned pack_ui32_float4 | ( | float | a, | |
float | b, | |||
float | c, | |||
float | d | |||
) | [static] |
Pack/convert 4 floats into one 4-byte word.
Definition at line 462 of file u_pack_color.h.
References float_to_ubyte(), and pack_ub4().
00463 { 00464 return pack_ub4( float_to_ubyte(a), 00465 float_to_ubyte(b), 00466 float_to_ubyte(c), 00467 float_to_ubyte(d) ); 00468 }
static void util_pack_color | ( | const float | rgba[4], | |
enum pipe_format | format, | |||
void * | dest | |||
) | [static] |
Note rgba outside [0,1] will be clamped for int pixel formats.
Definition at line 303 of file u_pack_color.h.
References assert, debug_print_format, float_to_ubyte(), pf_size_x, PIPE_FORMAT_A1R5G5B5_UNORM, PIPE_FORMAT_A4R4G4B4_UNORM, PIPE_FORMAT_A8_UNORM, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R5G6B5_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM, and PIPE_FORMAT_X8R8G8B8_UNORM.
00304 { 00305 ubyte r, g, b, a; 00306 00307 if (pf_size_x(format) <= 8) { 00308 /* format uses 8-bit components or less */ 00309 r = float_to_ubyte(rgba[0]); 00310 g = float_to_ubyte(rgba[1]); 00311 b = float_to_ubyte(rgba[2]); 00312 a = float_to_ubyte(rgba[3]); 00313 } 00314 00315 switch (format) { 00316 case PIPE_FORMAT_R8G8B8A8_UNORM: 00317 { 00318 uint *d = (uint *) dest; 00319 *d = (r << 24) | (g << 16) | (b << 8) | a; 00320 } 00321 return; 00322 case PIPE_FORMAT_R8G8B8X8_UNORM: 00323 { 00324 uint *d = (uint *) dest; 00325 *d = (r << 24) | (g << 16) | (b << 8) | 0xff; 00326 } 00327 return; 00328 case PIPE_FORMAT_A8R8G8B8_UNORM: 00329 { 00330 uint *d = (uint *) dest; 00331 *d = (a << 24) | (r << 16) | (g << 8) | b; 00332 } 00333 return; 00334 case PIPE_FORMAT_X8R8G8B8_UNORM: 00335 { 00336 uint *d = (uint *) dest; 00337 *d = (0xff << 24) | (r << 16) | (g << 8) | b; 00338 } 00339 return; 00340 case PIPE_FORMAT_B8G8R8A8_UNORM: 00341 { 00342 uint *d = (uint *) dest; 00343 *d = (b << 24) | (g << 16) | (r << 8) | a; 00344 } 00345 return; 00346 case PIPE_FORMAT_B8G8R8X8_UNORM: 00347 { 00348 uint *d = (uint *) dest; 00349 *d = (b << 24) | (g << 16) | (r << 8) | 0xff; 00350 } 00351 return; 00352 case PIPE_FORMAT_R5G6B5_UNORM: 00353 { 00354 ushort *d = (ushort *) dest; 00355 *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3); 00356 } 00357 return; 00358 case PIPE_FORMAT_A1R5G5B5_UNORM: 00359 { 00360 ushort *d = (ushort *) dest; 00361 *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3); 00362 } 00363 return; 00364 case PIPE_FORMAT_A4R4G4B4_UNORM: 00365 { 00366 ushort *d = (ushort *) dest; 00367 *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4); 00368 } 00369 return; 00370 case PIPE_FORMAT_A8_UNORM: 00371 { 00372 ubyte *d = (ubyte *) dest; 00373 *d = a; 00374 } 00375 return; 00376 case PIPE_FORMAT_L8_UNORM: 00377 case PIPE_FORMAT_I8_UNORM: 00378 { 00379 ubyte *d = (ubyte *) dest; 00380 *d = r; 00381 } 00382 return; 00383 case PIPE_FORMAT_R32G32B32A32_FLOAT: 00384 { 00385 float *d = (float *) dest; 00386 d[0] = rgba[0]; 00387 d[1] = rgba[1]; 00388 d[2] = rgba[2]; 00389 d[3] = rgba[3]; 00390 } 00391 return; 00392 case PIPE_FORMAT_R32G32B32_FLOAT: 00393 { 00394 float *d = (float *) dest; 00395 d[0] = rgba[0]; 00396 d[1] = rgba[1]; 00397 d[2] = rgba[2]; 00398 } 00399 return; 00400 /* XXX lots more cases to add */ 00401 default: 00402 debug_print_format("gallium: unhandled format in util_pack_color()", format); 00403 assert(0); 00404 } 00405 }
static void util_pack_color_ub | ( | ubyte | r, | |
ubyte | g, | |||
ubyte | b, | |||
ubyte | a, | |||
enum pipe_format | format, | |||
void * | dest | |||
) | [static] |
Pack ubyte R,G,B,A into dest pixel.
Definition at line 47 of file u_pack_color.h.
References assert, debug_print_format, PIPE_FORMAT_A1R5G5B5_UNORM, PIPE_FORMAT_A4R4G4B4_UNORM, PIPE_FORMAT_A8_UNORM, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R5G6B5_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM, and PIPE_FORMAT_X8R8G8B8_UNORM.
00049 { 00050 switch (format) { 00051 case PIPE_FORMAT_R8G8B8A8_UNORM: 00052 { 00053 uint *d = (uint *) dest; 00054 *d = (r << 24) | (g << 16) | (b << 8) | a; 00055 } 00056 return; 00057 case PIPE_FORMAT_R8G8B8X8_UNORM: 00058 { 00059 uint *d = (uint *) dest; 00060 *d = (r << 24) | (g << 16) | (b << 8) | 0xff; 00061 } 00062 return; 00063 case PIPE_FORMAT_A8R8G8B8_UNORM: 00064 { 00065 uint *d = (uint *) dest; 00066 *d = (a << 24) | (r << 16) | (g << 8) | b; 00067 } 00068 return; 00069 case PIPE_FORMAT_X8R8G8B8_UNORM: 00070 { 00071 uint *d = (uint *) dest; 00072 *d = (0xff << 24) | (r << 16) | (g << 8) | b; 00073 } 00074 return; 00075 case PIPE_FORMAT_B8G8R8A8_UNORM: 00076 { 00077 uint *d = (uint *) dest; 00078 *d = (b << 24) | (g << 16) | (r << 8) | a; 00079 } 00080 return; 00081 case PIPE_FORMAT_B8G8R8X8_UNORM: 00082 { 00083 uint *d = (uint *) dest; 00084 *d = (b << 24) | (g << 16) | (r << 8) | 0xff; 00085 } 00086 return; 00087 case PIPE_FORMAT_R5G6B5_UNORM: 00088 { 00089 ushort *d = (ushort *) dest; 00090 *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3); 00091 } 00092 return; 00093 case PIPE_FORMAT_A1R5G5B5_UNORM: 00094 { 00095 ushort *d = (ushort *) dest; 00096 *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3); 00097 } 00098 return; 00099 case PIPE_FORMAT_A4R4G4B4_UNORM: 00100 { 00101 ushort *d = (ushort *) dest; 00102 *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4); 00103 } 00104 return; 00105 case PIPE_FORMAT_A8_UNORM: 00106 { 00107 ubyte *d = (ubyte *) dest; 00108 *d = a; 00109 } 00110 return; 00111 case PIPE_FORMAT_L8_UNORM: 00112 case PIPE_FORMAT_I8_UNORM: 00113 { 00114 ubyte *d = (ubyte *) dest; 00115 *d = r; 00116 } 00117 return; 00118 case PIPE_FORMAT_R32G32B32A32_FLOAT: 00119 { 00120 float *d = (float *) dest; 00121 d[0] = (float)r / 255.0f; 00122 d[1] = (float)g / 255.0f; 00123 d[2] = (float)b / 255.0f; 00124 d[3] = (float)a / 255.0f; 00125 } 00126 return; 00127 case PIPE_FORMAT_R32G32B32_FLOAT: 00128 { 00129 float *d = (float *) dest; 00130 d[0] = (float)r / 255.0f; 00131 d[1] = (float)g / 255.0f; 00132 d[2] = (float)b / 255.0f; 00133 } 00134 return; 00135 00136 /* XXX lots more cases to add */ 00137 default: 00138 debug_print_format("gallium: unhandled format in util_pack_color_ub()", format); 00139 assert(0); 00140 } 00141 }
static uint util_pack_z | ( | enum pipe_format | format, | |
double | z | |||
) | [static] |
Note: it's assumed that z is in [0,1].
Definition at line 412 of file u_pack_color.h.
References assert, debug_print_format, PIPE_FORMAT_S8Z24_UNORM, PIPE_FORMAT_X8Z24_UNORM, PIPE_FORMAT_Z16_UNORM, PIPE_FORMAT_Z24S8_UNORM, PIPE_FORMAT_Z24X8_UNORM, and PIPE_FORMAT_Z32_UNORM.
00413 { 00414 if (z == 0.0) 00415 return 0; 00416 00417 switch (format) { 00418 case PIPE_FORMAT_Z16_UNORM: 00419 if (z == 1.0) 00420 return 0xffff; 00421 return (uint) (z * 0xffff); 00422 case PIPE_FORMAT_Z32_UNORM: 00423 /* special-case to avoid overflow */ 00424 if (z == 1.0) 00425 return 0xffffffff; 00426 return (uint) (z * 0xffffffff); 00427 case PIPE_FORMAT_S8Z24_UNORM: 00428 case PIPE_FORMAT_X8Z24_UNORM: 00429 if (z == 1.0) 00430 return 0xffffff; 00431 return (uint) (z * 0xffffff); 00432 case PIPE_FORMAT_Z24S8_UNORM: 00433 case PIPE_FORMAT_Z24X8_UNORM: 00434 if (z == 1.0) 00435 return 0xffffff00; 00436 return ((uint) (z * 0xffffff)) << 8; 00437 default: 00438 debug_print_format("gallium: unhandled format in util_pack_z()", format); 00439 assert(0); 00440 return 0; 00441 } 00442 }
static void util_unpack_color_ub | ( | enum pipe_format | format, | |
const void * | src, | |||
ubyte * | r, | |||
ubyte * | g, | |||
ubyte * | b, | |||
ubyte * | a | |||
) | [static] |
Unpack RGBA from a packed pixel, returning values as ubytes in [0,255].
Definition at line 148 of file u_pack_color.h.
References assert, debug_print_format, float_to_ubyte(), PIPE_FORMAT_A1R5G5B5_UNORM, PIPE_FORMAT_A4R4G4B4_UNORM, PIPE_FORMAT_A8_UNORM, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R5G6B5_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM, and PIPE_FORMAT_X8R8G8B8_UNORM.
00150 { 00151 switch (format) { 00152 case PIPE_FORMAT_R8G8B8A8_UNORM: 00153 { 00154 uint p = ((const uint *) src)[0]; 00155 *r = (ubyte) ((p >> 24) & 0xff); 00156 *g = (ubyte) ((p >> 16) & 0xff); 00157 *b = (ubyte) ((p >> 8) & 0xff); 00158 *a = (ubyte) ((p >> 0) & 0xff); 00159 } 00160 return; 00161 case PIPE_FORMAT_R8G8B8X8_UNORM: 00162 { 00163 uint p = ((const uint *) src)[0]; 00164 *r = (ubyte) ((p >> 24) & 0xff); 00165 *g = (ubyte) ((p >> 16) & 0xff); 00166 *b = (ubyte) ((p >> 8) & 0xff); 00167 *a = (ubyte) 0xff; 00168 } 00169 return; 00170 case PIPE_FORMAT_A8R8G8B8_UNORM: 00171 { 00172 uint p = ((const uint *) src)[0]; 00173 *r = (ubyte) ((p >> 16) & 0xff); 00174 *g = (ubyte) ((p >> 8) & 0xff); 00175 *b = (ubyte) ((p >> 0) & 0xff); 00176 *a = (ubyte) ((p >> 24) & 0xff); 00177 } 00178 return; 00179 case PIPE_FORMAT_X8R8G8B8_UNORM: 00180 { 00181 uint p = ((const uint *) src)[0]; 00182 *r = (ubyte) ((p >> 16) & 0xff); 00183 *g = (ubyte) ((p >> 8) & 0xff); 00184 *b = (ubyte) ((p >> 0) & 0xff); 00185 *a = (ubyte) 0xff; 00186 } 00187 return; 00188 case PIPE_FORMAT_B8G8R8A8_UNORM: 00189 { 00190 uint p = ((const uint *) src)[0]; 00191 *r = (ubyte) ((p >> 8) & 0xff); 00192 *g = (ubyte) ((p >> 16) & 0xff); 00193 *b = (ubyte) ((p >> 24) & 0xff); 00194 *a = (ubyte) ((p >> 0) & 0xff); 00195 } 00196 return; 00197 case PIPE_FORMAT_B8G8R8X8_UNORM: 00198 { 00199 uint p = ((const uint *) src)[0]; 00200 *r = (ubyte) ((p >> 8) & 0xff); 00201 *g = (ubyte) ((p >> 16) & 0xff); 00202 *b = (ubyte) ((p >> 24) & 0xff); 00203 *a = (ubyte) 0xff; 00204 } 00205 return; 00206 case PIPE_FORMAT_R5G6B5_UNORM: 00207 { 00208 ushort p = ((const ushort *) src)[0]; 00209 *r = (ubyte) (((p >> 8) & 0xf8) | ((p >> 13) & 0x7)); 00210 *g = (ubyte) (((p >> 3) & 0xfc) | ((p >> 9) & 0x3)); 00211 *b = (ubyte) (((p << 3) & 0xf8) | ((p >> 2) & 0x7)); 00212 *a = (ubyte) 0xff; 00213 } 00214 return; 00215 case PIPE_FORMAT_A1R5G5B5_UNORM: 00216 { 00217 ushort p = ((const ushort *) src)[0]; 00218 *r = (ubyte) (((p >> 7) & 0xf8) | ((p >> 12) & 0x7)); 00219 *g = (ubyte) (((p >> 2) & 0xf8) | ((p >> 7) & 0x7)); 00220 *b = (ubyte) (((p << 3) & 0xf8) | ((p >> 2) & 0x7)); 00221 *a = (ubyte) (0xff * (p >> 15)); 00222 } 00223 return; 00224 case PIPE_FORMAT_A4R4G4B4_UNORM: 00225 { 00226 ushort p = ((const ushort *) src)[0]; 00227 *r = (ubyte) (((p >> 4) & 0xf0) | ((p >> 8) & 0xf)); 00228 *g = (ubyte) (((p >> 0) & 0xf0) | ((p >> 4) & 0xf)); 00229 *b = (ubyte) (((p << 4) & 0xf0) | ((p >> 0) & 0xf)); 00230 *a = (ubyte) (((p >> 8) & 0xf0) | ((p >> 12) & 0xf)); 00231 } 00232 return; 00233 case PIPE_FORMAT_A8_UNORM: 00234 { 00235 ubyte p = ((const ubyte *) src)[0]; 00236 *r = *g = *b = (ubyte) 0xff; 00237 *a = p; 00238 } 00239 return; 00240 case PIPE_FORMAT_L8_UNORM: 00241 { 00242 ubyte p = ((const ubyte *) src)[0]; 00243 *r = *g = *b = p; 00244 *a = (ubyte) 0xff; 00245 } 00246 return; 00247 case PIPE_FORMAT_I8_UNORM: 00248 { 00249 ubyte p = ((const ubyte *) src)[0]; 00250 *r = *g = *b = *a = p; 00251 } 00252 return; 00253 case PIPE_FORMAT_R32G32B32A32_FLOAT: 00254 { 00255 const float *p = (const float *) src; 00256 *r = float_to_ubyte(p[0]); 00257 *g = float_to_ubyte(p[1]); 00258 *b = float_to_ubyte(p[2]); 00259 *a = float_to_ubyte(p[3]); 00260 } 00261 return; 00262 case PIPE_FORMAT_R32G32B32_FLOAT: 00263 { 00264 const float *p = (const float *) src; 00265 *r = float_to_ubyte(p[0]); 00266 *g = float_to_ubyte(p[1]); 00267 *b = float_to_ubyte(p[2]); 00268 *a = (ubyte) 0xff; 00269 } 00270 return; 00271 00272 case PIPE_FORMAT_R32G32_FLOAT: 00273 { 00274 const float *p = (const float *) src; 00275 *r = float_to_ubyte(p[0]); 00276 *g = float_to_ubyte(p[1]); 00277 *b = *a = (ubyte) 0xff; 00278 } 00279 return; 00280 00281 case PIPE_FORMAT_R32_FLOAT: 00282 { 00283 const float *p = (const float *) src; 00284 *r = float_to_ubyte(p[0]); 00285 *g = *b = *a = (ubyte) 0xff; 00286 } 00287 return; 00288 00289 /* XXX lots more cases to add */ 00290 default: 00291 debug_print_format("gallium: unhandled format in util_unpack_color_ub()", 00292 format); 00293 assert(0); 00294 } 00295 }