1 /* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26 /** 27 * \file pack.c 28 * Image and pixel span packing and unpacking. 29 */ 30 31 32 /* 33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable 34 * this global optimization. 35 * 36 * See also: 37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx 38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx 39 */ 40 #if defined(_MSC_VER) && defined(_M_X64) 41 # pragma optimize( "g", off ) 42 #endif 43 44 45 #include "glheader.h" 46 #include "colormac.h" 47 #include "enums.h" 48 #include "image.h" 49 #include "imports.h" 50 #include "macros.h" 51 #include "mtypes.h" 52 #include "pack.h" 53 #include "pixeltransfer.h" 54 #include "imports.h" 55 #include "glformats.h" 56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 58 59 60 /** 61 * Flip the 8 bits in each byte of the given array. 62 * 63 * \param p array. 64 * \param n number of bytes. 65 * 66 * \todo try this trick to flip bytes someday: 67 * \code 68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 71 * \endcode 72 */ 73 static void 74 flip_bytes( GLubyte *p, GLuint n ) 75 { 76 GLuint i, a, b; 77 for (i = 0; i < n; i++) { 78 b = (GLuint) p[i]; /* words are often faster than bytes */ 79 a = ((b & 0x01) << 7) | 80 ((b & 0x02) << 5) | 81 ((b & 0x04) << 3) | 82 ((b & 0x08) << 1) | 83 ((b & 0x10) >> 1) | 84 ((b & 0x20) >> 3) | 85 ((b & 0x40) >> 5) | 86 ((b & 0x80) >> 7); 87 p[i] = (GLubyte) a; 88 } 89 } 90 91 92 93 /* 94 * Unpack a 32x32 pixel polygon stipple from user memory using the 95 * current pixel unpack settings. 96 */ 97 void 98 _mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 99 const struct gl_pixelstore_attrib *unpacking ) 100 { 101 GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking); 102 if (ptrn) { 103 /* Convert pattern from GLubytes to GLuints and handle big/little 104 * endian differences 105 */ 106 GLubyte *p = ptrn; 107 GLint i; 108 for (i = 0; i < 32; i++) { 109 dest[i] = (p[0] << 24) 110 | (p[1] << 16) 111 | (p[2] << 8) 112 | (p[3] ); 113 p += 4; 114 } 115 free(ptrn); 116 } 117 } 118 119 120 /* 121 * Pack polygon stipple into user memory given current pixel packing 122 * settings. 123 */ 124 void 125 _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 126 const struct gl_pixelstore_attrib *packing ) 127 { 128 /* Convert pattern from GLuints to GLubytes to handle big/little 129 * endian differences. 130 */ 131 GLubyte ptrn[32*4]; 132 GLint i; 133 for (i = 0; i < 32; i++) { 134 ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 135 ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 136 ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 137 ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 138 } 139 140 _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 141 } 142 143 144 /* 145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first 146 * order with row alignment = 1 byte. 147 */ 148 GLvoid * 149 _mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 150 const struct gl_pixelstore_attrib *packing ) 151 { 152 GLint bytes, row, width_in_bytes; 153 GLubyte *buffer, *dst; 154 155 if (!pixels) 156 return NULL; 157 158 /* Alloc dest storage */ 159 bytes = ((width + 7) / 8 * height); 160 buffer = (GLubyte *) malloc( bytes ); 161 if (!buffer) 162 return NULL; 163 164 width_in_bytes = CEILING( width, 8 ); 165 dst = buffer; 166 for (row = 0; row < height; row++) { 167 const GLubyte *src = (const GLubyte *) 168 _mesa_image_address2d(packing, pixels, width, height, 169 GL_COLOR_INDEX, GL_BITMAP, row, 0); 170 if (!src) { 171 free(buffer); 172 return NULL; 173 } 174 175 if ((packing->SkipPixels & 7) == 0) { 176 memcpy( dst, src, width_in_bytes ); 177 if (packing->LsbFirst) { 178 flip_bytes( dst, width_in_bytes ); 179 } 180 } 181 else { 182 /* handling SkipPixels is a bit tricky (no pun intended!) */ 183 GLint i; 184 if (packing->LsbFirst) { 185 GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 186 GLubyte dstMask = 128; 187 const GLubyte *s = src; 188 GLubyte *d = dst; 189 *d = 0; 190 for (i = 0; i < width; i++) { 191 if (*s & srcMask) { 192 *d |= dstMask; 193 } 194 if (srcMask == 128) { 195 srcMask = 1; 196 s++; 197 } 198 else { 199 srcMask = srcMask << 1; 200 } 201 if (dstMask == 1) { 202 dstMask = 128; 203 d++; 204 *d = 0; 205 } 206 else { 207 dstMask = dstMask >> 1; 208 } 209 } 210 } 211 else { 212 GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 213 GLubyte dstMask = 128; 214 const GLubyte *s = src; 215 GLubyte *d = dst; 216 *d = 0; 217 for (i = 0; i < width; i++) { 218 if (*s & srcMask) { 219 *d |= dstMask; 220 } 221 if (srcMask == 1) { 222 srcMask = 128; 223 s++; 224 } 225 else { 226 srcMask = srcMask >> 1; 227 } 228 if (dstMask == 1) { 229 dstMask = 128; 230 d++; 231 *d = 0; 232 } 233 else { 234 dstMask = dstMask >> 1; 235 } 236 } 237 } 238 } 239 dst += width_in_bytes; 240 } 241 242 return buffer; 243 } 244 245 246 /* 247 * Pack bitmap data. 248 */ 249 void 250 _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 251 GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 252 { 253 GLint row, width_in_bytes; 254 const GLubyte *src; 255 256 if (!source) 257 return; 258 259 width_in_bytes = CEILING( width, 8 ); 260 src = source; 261 for (row = 0; row < height; row++) { 262 GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest, 263 width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); 264 if (!dst) 265 return; 266 267 if ((packing->SkipPixels & 7) == 0) { 268 memcpy( dst, src, width_in_bytes ); 269 if (packing->LsbFirst) { 270 flip_bytes( dst, width_in_bytes ); 271 } 272 } 273 else { 274 /* handling SkipPixels is a bit tricky (no pun intended!) */ 275 GLint i; 276 if (packing->LsbFirst) { 277 GLubyte srcMask = 128; 278 GLubyte dstMask = 1 << (packing->SkipPixels & 0x7); 279 const GLubyte *s = src; 280 GLubyte *d = dst; 281 *d = 0; 282 for (i = 0; i < width; i++) { 283 if (*s & srcMask) { 284 *d |= dstMask; 285 } 286 if (srcMask == 1) { 287 srcMask = 128; 288 s++; 289 } 290 else { 291 srcMask = srcMask >> 1; 292 } 293 if (dstMask == 128) { 294 dstMask = 1; 295 d++; 296 *d = 0; 297 } 298 else { 299 dstMask = dstMask << 1; 300 } 301 } 302 } 303 else { 304 GLubyte srcMask = 128; 305 GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7); 306 const GLubyte *s = src; 307 GLubyte *d = dst; 308 *d = 0; 309 for (i = 0; i < width; i++) { 310 if (*s & srcMask) { 311 *d |= dstMask; 312 } 313 if (srcMask == 1) { 314 srcMask = 128; 315 s++; 316 } 317 else { 318 srcMask = srcMask >> 1; 319 } 320 if (dstMask == 1) { 321 dstMask = 128; 322 d++; 323 *d = 0; 324 } 325 else { 326 dstMask = dstMask >> 1; 327 } 328 } 329 } 330 } 331 src += width_in_bytes; 332 } 333 } 334 335 336 /** 337 * Get indexes of color components for a basic color format, such as 338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes 339 * that do not apply. 340 */ 341 static void 342 get_component_indexes(GLenum format, 343 GLint *redIndex, 344 GLint *greenIndex, 345 GLint *blueIndex, 346 GLint *alphaIndex, 347 GLint *luminanceIndex, 348 GLint *intensityIndex) 349 { 350 *redIndex = -1; 351 *greenIndex = -1; 352 *blueIndex = -1; 353 *alphaIndex = -1; 354 *luminanceIndex = -1; 355 *intensityIndex = -1; 356 357 switch (format) { 358 case GL_LUMINANCE: 359 case GL_LUMINANCE_INTEGER_EXT: 360 *luminanceIndex = 0; 361 break; 362 case GL_LUMINANCE_ALPHA: 363 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 364 *luminanceIndex = 0; 365 *alphaIndex = 1; 366 break; 367 case GL_INTENSITY: 368 *intensityIndex = 0; 369 break; 370 case GL_RED: 371 case GL_RED_INTEGER_EXT: 372 *redIndex = 0; 373 break; 374 case GL_GREEN: 375 case GL_GREEN_INTEGER_EXT: 376 *greenIndex = 0; 377 break; 378 case GL_BLUE: 379 case GL_BLUE_INTEGER_EXT: 380 *blueIndex = 0; 381 break; 382 case GL_ALPHA: 383 case GL_ALPHA_INTEGER_EXT: 384 *alphaIndex = 0; 385 break; 386 case GL_RG: 387 case GL_RG_INTEGER: 388 *redIndex = 0; 389 *greenIndex = 1; 390 break; 391 case GL_RGB: 392 case GL_RGB_INTEGER_EXT: 393 *redIndex = 0; 394 *greenIndex = 1; 395 *blueIndex = 2; 396 break; 397 case GL_BGR: 398 case GL_BGR_INTEGER_EXT: 399 *blueIndex = 0; 400 *greenIndex = 1; 401 *redIndex = 2; 402 break; 403 case GL_RGBA: 404 case GL_RGBA_INTEGER_EXT: 405 *redIndex = 0; 406 *greenIndex = 1; 407 *blueIndex = 2; 408 *alphaIndex = 3; 409 break; 410 case GL_BGRA: 411 case GL_BGRA_INTEGER: 412 *redIndex = 2; 413 *greenIndex = 1; 414 *blueIndex = 0; 415 *alphaIndex = 3; 416 break; 417 case GL_ABGR_EXT: 418 *redIndex = 3; 419 *greenIndex = 2; 420 *blueIndex = 1; 421 *alphaIndex = 0; 422 break; 423 case GL_DU8DV8_ATI: 424 case GL_DUDV_ATI: 425 *redIndex = 0; 426 *greenIndex = 1; 427 break; 428 default: 429 assert(0 && "bad format in get_component_indexes()"); 430 } 431 } 432 433 434 435 /** 436 * For small integer types, return the min and max possible values. 437 * Used for clamping floats to unscaled integer types. 438 * \return GL_TRUE if type is handled, GL_FALSE otherwise. 439 */ 440 static GLboolean 441 get_type_min_max(GLenum type, GLfloat *min, GLfloat *max) 442 { 443 switch (type) { 444 case GL_BYTE: 445 *min = -128.0; 446 *max = 127.0; 447 return GL_TRUE; 448 case GL_UNSIGNED_BYTE: 449 *min = 0.0; 450 *max = 255.0; 451 return GL_TRUE; 452 case GL_SHORT: 453 *min = -32768.0; 454 *max = 32767.0; 455 return GL_TRUE; 456 case GL_UNSIGNED_SHORT: 457 *min = 0.0; 458 *max = 65535.0; 459 return GL_TRUE; 460 default: 461 return GL_FALSE; 462 } 463 } 464 465 /* Customization of unsigned integer packing. 466 */ 467 #define SRC_TYPE GLuint 468 469 #define DST_TYPE GLuint 470 #define SRC_CONVERT(x) (x) 471 #define FN_NAME pack_uint_from_uint_rgba 472 #include "pack_tmp.h" 473 #undef DST_TYPE 474 #undef SRC_CONVERT 475 #undef FN_NAME 476 477 #define DST_TYPE GLint 478 #define SRC_CONVERT(x) MIN2(x, 0x7fffffff) 479 #define FN_NAME pack_int_from_uint_rgba 480 #include "pack_tmp.h" 481 #undef DST_TYPE 482 #undef SRC_CONVERT 483 #undef FN_NAME 484 485 #define DST_TYPE GLushort 486 #define SRC_CONVERT(x) MIN2(x, 0xffff) 487 #define FN_NAME pack_ushort_from_uint_rgba 488 #include "pack_tmp.h" 489 #undef DST_TYPE 490 #undef SRC_CONVERT 491 #undef FN_NAME 492 493 #define DST_TYPE GLshort 494 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767) 495 #define FN_NAME pack_short_from_uint_rgba 496 #include "pack_tmp.h" 497 #undef DST_TYPE 498 #undef SRC_CONVERT 499 #undef FN_NAME 500 501 #define DST_TYPE GLubyte 502 #define SRC_CONVERT(x) MIN2(x, 0xff) 503 #define FN_NAME pack_ubyte_from_uint_rgba 504 #include "pack_tmp.h" 505 #undef DST_TYPE 506 #undef SRC_CONVERT 507 #undef FN_NAME 508 509 #define DST_TYPE GLbyte 510 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127) 511 #define FN_NAME pack_byte_from_uint_rgba 512 #include "pack_tmp.h" 513 #undef DST_TYPE 514 #undef SRC_CONVERT 515 #undef FN_NAME 516 517 #undef SRC_TYPE 518 519 static void 520 _pack_rgba_span_from_uints_problem(struct gl_context *ctx, 521 GLenum dstFormat, GLenum dstType) 522 { 523 _mesa_problem(ctx, 524 "Unsupported type (%s) / format (%s) " 525 "in _mesa_pack_rgba_span_from_uints", 526 _mesa_lookup_enum_by_nr(dstType), 527 _mesa_lookup_enum_by_nr(dstFormat)); 528 } 529 530 void 531 _mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4], 532 GLenum dstFormat, GLenum dstType, 533 GLvoid *dstAddr) 534 { 535 GLuint i; 536 537 switch(dstType) { 538 case GL_UNSIGNED_INT: 539 pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 540 break; 541 case GL_INT: 542 pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 543 break; 544 case GL_UNSIGNED_SHORT: 545 pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 546 break; 547 case GL_SHORT: 548 pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 549 break; 550 case GL_UNSIGNED_BYTE: 551 pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 552 break; 553 case GL_BYTE: 554 pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); 555 break; 556 case GL_UNSIGNED_BYTE_3_3_2: 557 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 558 GLubyte *dst = (GLubyte *) dstAddr; 559 for (i=0;i<n;i++) { 560 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 561 | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 562 | (CLAMP(rgba[i][BCOMP], 0, 3) ); 563 } 564 } else { 565 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 566 } 567 break; 568 case GL_UNSIGNED_BYTE_2_3_3_REV: 569 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 570 GLubyte *dst = (GLubyte *) dstAddr; 571 for (i=0;i<n;i++) { 572 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 573 | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 574 | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 575 } 576 } else { 577 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 578 } 579 break; 580 case GL_UNSIGNED_SHORT_5_6_5: 581 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 582 GLushort *dst = (GLushort *) dstAddr; 583 for (i=0;i<n;i++) { 584 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 585 | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 586 | (CLAMP(rgba[i][BCOMP], 0, 31) ); 587 } 588 } else { 589 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 590 } 591 break; 592 case GL_UNSIGNED_SHORT_5_6_5_REV: 593 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 594 GLushort *dst = (GLushort *) dstAddr; 595 for (i=0;i<n;i++) { 596 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 597 | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 598 | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 599 } 600 } else { 601 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 602 } 603 break; 604 case GL_UNSIGNED_SHORT_4_4_4_4: 605 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 606 GLushort *dst = (GLushort *) dstAddr; 607 for (i=0;i<n;i++) { 608 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 609 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 610 | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 611 | (CLAMP(rgba[i][ACOMP], 0, 15) ); 612 } 613 } 614 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 615 GLushort *dst = (GLushort *) dstAddr; 616 for (i=0;i<n;i++) { 617 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 618 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 619 | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 620 | (CLAMP(rgba[i][ACOMP], 0, 15) ); 621 } 622 } 623 else if (dstFormat == GL_ABGR_EXT) { 624 GLushort *dst = (GLushort *) dstAddr; 625 for (i=0;i<n;i++) { 626 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 627 | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 628 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 629 | (CLAMP(rgba[i][RCOMP], 0, 15) ); 630 } 631 } else { 632 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 633 } 634 break; 635 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 636 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 637 GLushort *dst = (GLushort *) dstAddr; 638 for (i=0;i<n;i++) { 639 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 640 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 641 | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 642 | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 643 } 644 } 645 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 646 GLushort *dst = (GLushort *) dstAddr; 647 for (i=0;i<n;i++) { 648 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 649 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 650 | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 651 | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 652 } 653 } 654 else if (dstFormat == GL_ABGR_EXT) { 655 GLushort *dst = (GLushort *) dstAddr; 656 for (i=0;i<n;i++) { 657 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 658 | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 659 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 660 | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 661 } 662 } else { 663 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 664 } 665 break; 666 case GL_UNSIGNED_SHORT_5_5_5_1: 667 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 668 GLushort *dst = (GLushort *) dstAddr; 669 for (i=0;i<n;i++) { 670 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 671 | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 672 | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 673 | (CLAMP(rgba[i][ACOMP], 0, 1) ); 674 } 675 } 676 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 677 GLushort *dst = (GLushort *) dstAddr; 678 for (i=0;i<n;i++) { 679 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 680 | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 681 | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 682 | (CLAMP(rgba[i][ACOMP], 0, 1) ); 683 } 684 } 685 else if (dstFormat == GL_ABGR_EXT) { 686 GLushort *dst = (GLushort *) dstAddr; 687 for (i=0;i<n;i++) { 688 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 689 | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 690 | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 691 | (CLAMP(rgba[i][RCOMP], 0, 1) ); 692 } 693 } else { 694 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 695 } 696 break; 697 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 698 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 699 GLushort *dst = (GLushort *) dstAddr; 700 for (i=0;i<n;i++) { 701 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 702 | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 703 | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 704 | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 705 } 706 } 707 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 708 GLushort *dst = (GLushort *) dstAddr; 709 for (i=0;i<n;i++) { 710 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 711 | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 712 | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 713 | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 714 } 715 } 716 else if (dstFormat == GL_ABGR_EXT) { 717 GLushort *dst = (GLushort *) dstAddr; 718 for (i=0;i<n;i++) { 719 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 720 | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 721 | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 722 | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 723 } 724 } else { 725 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 726 } 727 break; 728 case GL_UNSIGNED_INT_8_8_8_8: 729 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 730 GLuint *dst = (GLuint *) dstAddr; 731 for (i=0;i<n;i++) { 732 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 733 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 734 | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 735 | (CLAMP(rgba[i][ACOMP], 0, 255) ); 736 } 737 } 738 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 739 GLuint *dst = (GLuint *) dstAddr; 740 for (i=0;i<n;i++) { 741 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 742 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 743 | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 744 | (CLAMP(rgba[i][ACOMP], 0, 255) ); 745 } 746 } 747 else if (dstFormat == GL_ABGR_EXT) { 748 GLuint *dst = (GLuint *) dstAddr; 749 for (i=0;i<n;i++) { 750 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 751 | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 752 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 753 | (CLAMP(rgba[i][RCOMP], 0, 255) ); 754 } 755 } else { 756 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 757 } 758 break; 759 case GL_UNSIGNED_INT_8_8_8_8_REV: 760 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 761 GLuint *dst = (GLuint *) dstAddr; 762 for (i=0;i<n;i++) { 763 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 764 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 765 | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 766 | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 767 } 768 } 769 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 770 GLuint *dst = (GLuint *) dstAddr; 771 for (i=0;i<n;i++) { 772 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 773 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 774 | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 775 | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 776 } 777 } 778 else if (dstFormat == GL_ABGR_EXT) { 779 GLuint *dst = (GLuint *) dstAddr; 780 for (i=0;i<n;i++) { 781 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 782 | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 783 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 784 | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 785 } 786 } else { 787 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 788 } 789 break; 790 case GL_UNSIGNED_INT_10_10_10_2: 791 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 792 GLuint *dst = (GLuint *) dstAddr; 793 for (i=0;i<n;i++) { 794 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 795 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 796 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 797 | (CLAMP(rgba[i][ACOMP], 0, 3) ); 798 } 799 } 800 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 801 GLuint *dst = (GLuint *) dstAddr; 802 for (i=0;i<n;i++) { 803 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 804 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 805 | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 806 | (CLAMP(rgba[i][ACOMP], 0, 3) ); 807 } 808 } 809 else if (dstFormat == GL_ABGR_EXT) { 810 GLuint *dst = (GLuint *) dstAddr; 811 for (i=0;i<n;i++) { 812 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 813 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 814 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 815 | (CLAMP(rgba[i][RCOMP], 0, 3) ); 816 } 817 } else { 818 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 819 } 820 break; 821 case GL_UNSIGNED_INT_2_10_10_10_REV: 822 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 823 GLuint *dst = (GLuint *) dstAddr; 824 for (i=0;i<n;i++) { 825 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 826 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 827 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 828 | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 829 } 830 } 831 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 832 GLuint *dst = (GLuint *) dstAddr; 833 for (i=0;i<n;i++) { 834 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 835 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 836 | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 837 | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 838 } 839 } 840 else if (dstFormat == GL_ABGR_EXT) { 841 GLuint *dst = (GLuint *) dstAddr; 842 for (i=0;i<n;i++) { 843 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 844 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 845 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 846 | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 847 } 848 } else { 849 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 850 } 851 break; 852 default: 853 _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType); 854 return; 855 } 856 } 857 858 859 /* Customization of signed integer packing. 860 */ 861 #define SRC_TYPE GLint 862 863 #define DST_TYPE GLuint 864 #define SRC_CONVERT(x) MAX2(x, 0) 865 #define FN_NAME pack_uint_from_int_rgba 866 #include "pack_tmp.h" 867 #undef DST_TYPE 868 #undef SRC_CONVERT 869 #undef FN_NAME 870 871 #define DST_TYPE GLushort 872 #define SRC_CONVERT(x) MAX2(x, 0) 873 #define FN_NAME pack_ushort_from_int_rgba 874 #include "pack_tmp.h" 875 #undef DST_TYPE 876 #undef SRC_CONVERT 877 #undef FN_NAME 878 879 #define DST_TYPE GLshort 880 #define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff) 881 #define FN_NAME pack_short_from_int_rgba 882 #include "pack_tmp.h" 883 #undef DST_TYPE 884 #undef SRC_CONVERT 885 #undef FN_NAME 886 887 #define DST_TYPE GLubyte 888 #define SRC_CONVERT(x) MAX2(x, 0) 889 #define FN_NAME pack_ubyte_from_int_rgba 890 #include "pack_tmp.h" 891 #undef DST_TYPE 892 #undef SRC_CONVERT 893 #undef FN_NAME 894 895 #define DST_TYPE GLbyte 896 #define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f) 897 #define FN_NAME pack_byte_from_int_rgba 898 #include "pack_tmp.h" 899 #undef DST_TYPE 900 #undef SRC_CONVERT 901 #undef FN_NAME 902 903 #undef SRC_TYPE 904 905 static void 906 _pack_rgba_span_from_ints_problem(struct gl_context *ctx, 907 GLenum dstFormat, GLenum dstType) 908 { 909 _mesa_problem(ctx, 910 "Unsupported type (%s) / format (%s) " 911 "in _mesa_pack_rgba_span_from_ints", 912 _mesa_lookup_enum_by_nr(dstType), 913 _mesa_lookup_enum_by_nr(dstFormat)); 914 } 915 916 void 917 _mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4], 918 GLenum dstFormat, GLenum dstType, 919 GLvoid *dstAddr) 920 { 921 GLuint i; 922 923 switch(dstType) { 924 case GL_UNSIGNED_INT: 925 pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 926 break; 927 case GL_INT: 928 /* No conversion necessary. */ 929 pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n); 930 break; 931 case GL_UNSIGNED_SHORT: 932 pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 933 break; 934 case GL_SHORT: 935 pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 936 break; 937 case GL_UNSIGNED_BYTE: 938 pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 939 break; 940 case GL_BYTE: 941 pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n); 942 break; 943 case GL_UNSIGNED_BYTE_3_3_2: 944 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 945 GLubyte *dst = (GLubyte *) dstAddr; 946 for (i=0;i<n;i++) { 947 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5) 948 | (CLAMP(rgba[i][GCOMP], 0, 7) << 2) 949 | (CLAMP(rgba[i][BCOMP], 0, 3) ); 950 } 951 } else { 952 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 953 } 954 break; 955 case GL_UNSIGNED_BYTE_2_3_3_REV: 956 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 957 GLubyte *dst = (GLubyte *) dstAddr; 958 for (i=0;i<n;i++) { 959 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) ) 960 | (CLAMP(rgba[i][GCOMP], 0, 7) << 3) 961 | (CLAMP(rgba[i][BCOMP], 0, 3) << 6); 962 } 963 } else { 964 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 965 } 966 break; 967 case GL_UNSIGNED_SHORT_5_6_5: 968 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 969 GLushort *dst = (GLushort *) dstAddr; 970 for (i=0;i<n;i++) { 971 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 972 | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 973 | (CLAMP(rgba[i][BCOMP], 0, 31) ); 974 } 975 } else { 976 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 977 } 978 break; 979 case GL_UNSIGNED_SHORT_5_6_5_REV: 980 if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { 981 GLushort *dst = (GLushort *) dstAddr; 982 for (i=0;i<n;i++) { 983 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 984 | (CLAMP(rgba[i][GCOMP], 0, 63) << 5) 985 | (CLAMP(rgba[i][BCOMP], 0, 31) << 11); 986 } 987 } else { 988 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 989 } 990 break; 991 case GL_UNSIGNED_SHORT_4_4_4_4: 992 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 993 GLushort *dst = (GLushort *) dstAddr; 994 for (i=0;i<n;i++) { 995 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12) 996 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 997 | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 998 | (CLAMP(rgba[i][ACOMP], 0, 15) ); 999 } 1000 } 1001 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1002 GLushort *dst = (GLushort *) dstAddr; 1003 for (i=0;i<n;i++) { 1004 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12) 1005 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1006 | (CLAMP(rgba[i][RCOMP], 0, 15) << 4) 1007 | (CLAMP(rgba[i][ACOMP], 0, 15) ); 1008 } 1009 } 1010 else if (dstFormat == GL_ABGR_EXT) { 1011 GLushort *dst = (GLushort *) dstAddr; 1012 for (i=0;i<n;i++) { 1013 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12) 1014 | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1015 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1016 | (CLAMP(rgba[i][RCOMP], 0, 15) ); 1017 } 1018 } else { 1019 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1020 } 1021 break; 1022 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1023 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1024 GLushort *dst = (GLushort *) dstAddr; 1025 for (i=0;i<n;i++) { 1026 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) ) 1027 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1028 | (CLAMP(rgba[i][BCOMP], 0, 15) << 8) 1029 | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1030 } 1031 } 1032 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1033 GLushort *dst = (GLushort *) dstAddr; 1034 for (i=0;i<n;i++) { 1035 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) ) 1036 | (CLAMP(rgba[i][GCOMP], 0, 15) << 4) 1037 | (CLAMP(rgba[i][RCOMP], 0, 15) << 8) 1038 | (CLAMP(rgba[i][ACOMP], 0, 15) << 12); 1039 } 1040 } 1041 else if (dstFormat == GL_ABGR_EXT) { 1042 GLushort *dst = (GLushort *) dstAddr; 1043 for (i=0;i<n;i++) { 1044 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) ) 1045 | (CLAMP(rgba[i][BCOMP], 0, 15) << 4) 1046 | (CLAMP(rgba[i][GCOMP], 0, 15) << 8) 1047 | (CLAMP(rgba[i][RCOMP], 0, 15) << 12); 1048 } 1049 } else { 1050 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1051 } 1052 break; 1053 case GL_UNSIGNED_SHORT_5_5_5_1: 1054 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1055 GLushort *dst = (GLushort *) dstAddr; 1056 for (i=0;i<n;i++) { 1057 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11) 1058 | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1059 | (CLAMP(rgba[i][BCOMP], 0, 31) << 1) 1060 | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1061 } 1062 } 1063 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1064 GLushort *dst = (GLushort *) dstAddr; 1065 for (i=0;i<n;i++) { 1066 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11) 1067 | (CLAMP(rgba[i][GCOMP], 0, 31) << 6) 1068 | (CLAMP(rgba[i][RCOMP], 0, 31) << 1) 1069 | (CLAMP(rgba[i][ACOMP], 0, 1) ); 1070 } 1071 } 1072 else if (dstFormat == GL_ABGR_EXT) { 1073 GLushort *dst = (GLushort *) dstAddr; 1074 for (i=0;i<n;i++) { 1075 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11) 1076 | (CLAMP(rgba[i][BCOMP], 0, 31) << 6) 1077 | (CLAMP(rgba[i][GCOMP], 0, 31) << 1) 1078 | (CLAMP(rgba[i][RCOMP], 0, 1) ); 1079 } 1080 } else { 1081 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1082 } 1083 break; 1084 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1085 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1086 GLushort *dst = (GLushort *) dstAddr; 1087 for (i=0;i<n;i++) { 1088 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) ) 1089 | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1090 | (CLAMP(rgba[i][BCOMP], 0, 31) << 10) 1091 | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1092 } 1093 } 1094 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1095 GLushort *dst = (GLushort *) dstAddr; 1096 for (i=0;i<n;i++) { 1097 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) ) 1098 | (CLAMP(rgba[i][GCOMP], 0, 31) << 5) 1099 | (CLAMP(rgba[i][RCOMP], 0, 31) << 10) 1100 | (CLAMP(rgba[i][ACOMP], 0, 1) << 15); 1101 } 1102 } 1103 else if (dstFormat == GL_ABGR_EXT) { 1104 GLushort *dst = (GLushort *) dstAddr; 1105 for (i=0;i<n;i++) { 1106 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) ) 1107 | (CLAMP(rgba[i][BCOMP], 0, 31) << 5) 1108 | (CLAMP(rgba[i][GCOMP], 0, 31) << 10) 1109 | (CLAMP(rgba[i][RCOMP], 0, 1) << 15); 1110 } 1111 } else { 1112 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1113 } 1114 break; 1115 case GL_UNSIGNED_INT_8_8_8_8: 1116 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1117 GLuint *dst = (GLuint *) dstAddr; 1118 for (i=0;i<n;i++) { 1119 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24) 1120 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1121 | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1122 | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1123 } 1124 } 1125 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1126 GLuint *dst = (GLuint *) dstAddr; 1127 for (i=0;i<n;i++) { 1128 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24) 1129 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1130 | (CLAMP(rgba[i][RCOMP], 0, 255) << 8) 1131 | (CLAMP(rgba[i][ACOMP], 0, 255) ); 1132 } 1133 } 1134 else if (dstFormat == GL_ABGR_EXT) { 1135 GLuint *dst = (GLuint *) dstAddr; 1136 for (i=0;i<n;i++) { 1137 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24) 1138 | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1139 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1140 | (CLAMP(rgba[i][RCOMP], 0, 255) ); 1141 } 1142 } else { 1143 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1144 } 1145 break; 1146 case GL_UNSIGNED_INT_8_8_8_8_REV: 1147 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1148 GLuint *dst = (GLuint *) dstAddr; 1149 for (i=0;i<n;i++) { 1150 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) ) 1151 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1152 | (CLAMP(rgba[i][BCOMP], 0, 255) << 16) 1153 | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1154 } 1155 } 1156 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1157 GLuint *dst = (GLuint *) dstAddr; 1158 for (i=0;i<n;i++) { 1159 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) ) 1160 | (CLAMP(rgba[i][GCOMP], 0, 255) << 8) 1161 | (CLAMP(rgba[i][RCOMP], 0, 255) << 16) 1162 | (CLAMP(rgba[i][ACOMP], 0, 255) << 24); 1163 } 1164 } 1165 else if (dstFormat == GL_ABGR_EXT) { 1166 GLuint *dst = (GLuint *) dstAddr; 1167 for (i=0;i<n;i++) { 1168 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) ) 1169 | (CLAMP(rgba[i][BCOMP], 0, 255) << 8) 1170 | (CLAMP(rgba[i][GCOMP], 0, 255) << 16) 1171 | (CLAMP(rgba[i][RCOMP], 0, 255) << 24); 1172 } 1173 } else { 1174 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1175 } 1176 break; 1177 case GL_UNSIGNED_INT_10_10_10_2: 1178 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1179 GLuint *dst = (GLuint *) dstAddr; 1180 for (i=0;i<n;i++) { 1181 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22) 1182 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1183 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 2) 1184 | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1185 } 1186 } 1187 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1188 GLuint *dst = (GLuint *) dstAddr; 1189 for (i=0;i<n;i++) { 1190 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22) 1191 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12) 1192 | (CLAMP(rgba[i][RCOMP], 0, 1023) << 2) 1193 | (CLAMP(rgba[i][ACOMP], 0, 3) ); 1194 } 1195 } 1196 else if (dstFormat == GL_ABGR_EXT) { 1197 GLuint *dst = (GLuint *) dstAddr; 1198 for (i=0;i<n;i++) { 1199 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22) 1200 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12) 1201 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 2) 1202 | (CLAMP(rgba[i][RCOMP], 0, 3) ); 1203 } 1204 } else { 1205 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1206 } 1207 break; 1208 case GL_UNSIGNED_INT_2_10_10_10_REV: 1209 if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) { 1210 GLuint *dst = (GLuint *) dstAddr; 1211 for (i=0;i<n;i++) { 1212 dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) ) 1213 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1214 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20) 1215 | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1216 } 1217 } 1218 else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) { 1219 GLuint *dst = (GLuint *) dstAddr; 1220 for (i=0;i<n;i++) { 1221 dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) ) 1222 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10) 1223 | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20) 1224 | (CLAMP(rgba[i][ACOMP], 0, 3) << 30); 1225 } 1226 } 1227 else if (dstFormat == GL_ABGR_EXT) { 1228 GLuint *dst = (GLuint *) dstAddr; 1229 for (i=0;i<n;i++) { 1230 dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) ) 1231 | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10) 1232 | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20) 1233 | (CLAMP(rgba[i][RCOMP], 0, 3) << 30); 1234 } 1235 } else { 1236 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1237 } 1238 break; 1239 default: 1240 _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType); 1241 return; 1242 } 1243 } 1244 1245 1246 /** 1247 * Used to pack an array [][4] of RGBA float colors as specified 1248 * by the dstFormat, dstType and dstPacking. Used by glReadPixels. 1249 * Historically, the RGBA values were in [0,1] and rescaled to fit 1250 * into GLubytes, etc. But with new integer formats, the RGBA values 1251 * may have any value and we don't always rescale when converting to 1252 * integers. 1253 * 1254 * Note: the rgba values will be modified by this function when any pixel 1255 * transfer ops are enabled. 1256 */ 1257 void 1258 _mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], 1259 GLenum dstFormat, GLenum dstType, 1260 GLvoid *dstAddr, 1261 const struct gl_pixelstore_attrib *dstPacking, 1262 GLbitfield transferOps) 1263 { 1264 GLfloat *luminance; 1265 const GLint comps = _mesa_components_in_format(dstFormat); 1266 const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat); 1267 GLuint i; 1268 1269 if (dstFormat == GL_LUMINANCE || 1270 dstFormat == GL_LUMINANCE_ALPHA || 1271 dstFormat == GL_LUMINANCE_INTEGER_EXT || 1272 dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) { 1273 luminance = (GLfloat *) malloc(n * sizeof(GLfloat)); 1274 if (!luminance) { 1275 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 1276 return; 1277 } 1278 } 1279 else { 1280 luminance = NULL; 1281 } 1282 1283 /* EXT_texture_integer specifies no transfer ops on integer 1284 * types in the resolved issues section. Just set them to 0 1285 * for integer surfaces. 1286 */ 1287 if (intDstFormat) 1288 transferOps = 0; 1289 1290 if (transferOps) { 1291 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 1292 } 1293 1294 /* 1295 * Component clamping (besides clamping to [0,1] in 1296 * _mesa_apply_rgba_transfer_ops()). 1297 */ 1298 if (intDstFormat) { 1299 /* clamping to dest type's min/max values */ 1300 GLfloat min, max; 1301 if (get_type_min_max(dstType, &min, &max)) { 1302 for (i = 0; i < n; i++) { 1303 rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max); 1304 rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max); 1305 rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max); 1306 rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max); 1307 } 1308 } 1309 } 1310 else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 1311 /* compute luminance values */ 1312 if (transferOps & IMAGE_CLAMP_BIT) { 1313 for (i = 0; i < n; i++) { 1314 GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1315 luminance[i] = CLAMP(sum, 0.0F, 1.0F); 1316 } 1317 } 1318 else { 1319 for (i = 0; i < n; i++) { 1320 luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 1321 } 1322 } 1323 } 1324 1325 /* 1326 * Pack/store the pixels. Ugh! Lots of cases!!! 1327 */ 1328 switch (dstType) { 1329 case GL_UNSIGNED_BYTE: 1330 { 1331 GLubyte *dst = (GLubyte *) dstAddr; 1332 switch (dstFormat) { 1333 case GL_RED: 1334 for (i=0;i<n;i++) 1335 dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1336 break; 1337 case GL_GREEN: 1338 for (i=0;i<n;i++) 1339 dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1340 break; 1341 case GL_BLUE: 1342 for (i=0;i<n;i++) 1343 dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1344 break; 1345 case GL_ALPHA: 1346 for (i=0;i<n;i++) 1347 dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1348 break; 1349 case GL_LUMINANCE: 1350 for (i=0;i<n;i++) 1351 dst[i] = FLOAT_TO_UBYTE(luminance[i]); 1352 break; 1353 case GL_LUMINANCE_ALPHA: 1354 for (i=0;i<n;i++) { 1355 dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 1356 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1357 } 1358 break; 1359 case GL_RG: 1360 for (i=0;i<n;i++) { 1361 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1362 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1363 } 1364 break; 1365 case GL_RGB: 1366 for (i=0;i<n;i++) { 1367 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1368 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1369 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1370 } 1371 break; 1372 case GL_RGBA: 1373 for (i=0;i<n;i++) { 1374 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1375 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1376 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1377 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1378 } 1379 break; 1380 case GL_BGR: 1381 for (i=0;i<n;i++) { 1382 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1383 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1384 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1385 } 1386 break; 1387 case GL_BGRA: 1388 for (i=0;i<n;i++) { 1389 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1390 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1391 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1392 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1393 } 1394 break; 1395 case GL_ABGR_EXT: 1396 for (i=0;i<n;i++) { 1397 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 1398 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 1399 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1400 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1401 } 1402 break; 1403 case GL_RED_INTEGER_EXT: 1404 for (i=0;i<n;i++) { 1405 dst[i] = (GLubyte) rgba[i][RCOMP]; 1406 } 1407 break; 1408 case GL_GREEN_INTEGER_EXT: 1409 for (i=0;i<n;i++) { 1410 dst[i] = (GLubyte) rgba[i][GCOMP]; 1411 } 1412 break; 1413 case GL_BLUE_INTEGER_EXT: 1414 for (i=0;i<n;i++) { 1415 dst[i] = (GLubyte) rgba[i][BCOMP]; 1416 } 1417 break; 1418 case GL_ALPHA_INTEGER_EXT: 1419 for (i=0;i<n;i++) { 1420 dst[i] = (GLubyte) rgba[i][ACOMP]; 1421 } 1422 break; 1423 case GL_RG_INTEGER: 1424 for (i=0;i<n;i++) { 1425 dst[i*2+0] = (GLubyte) rgba[i][RCOMP]; 1426 dst[i*2+1] = (GLubyte) rgba[i][GCOMP]; 1427 } 1428 break; 1429 case GL_RGB_INTEGER_EXT: 1430 for (i=0;i<n;i++) { 1431 dst[i*3+0] = (GLubyte) rgba[i][RCOMP]; 1432 dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1433 dst[i*3+2] = (GLubyte) rgba[i][BCOMP]; 1434 } 1435 break; 1436 case GL_RGBA_INTEGER_EXT: 1437 for (i=0;i<n;i++) { 1438 dst[i*4+0] = (GLubyte) rgba[i][RCOMP]; 1439 dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1440 dst[i*4+2] = (GLubyte) rgba[i][BCOMP]; 1441 dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1442 } 1443 break; 1444 case GL_BGR_INTEGER_EXT: 1445 for (i=0;i<n;i++) { 1446 dst[i*3+0] = (GLubyte) rgba[i][BCOMP]; 1447 dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 1448 dst[i*3+2] = (GLubyte) rgba[i][RCOMP]; 1449 } 1450 break; 1451 case GL_BGRA_INTEGER_EXT: 1452 for (i=0;i<n;i++) { 1453 dst[i*4+0] = (GLubyte) rgba[i][BCOMP]; 1454 dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 1455 dst[i*4+2] = (GLubyte) rgba[i][RCOMP]; 1456 dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 1457 } 1458 break; 1459 case GL_LUMINANCE_INTEGER_EXT: 1460 for (i=0;i<n;i++) { 1461 dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] + 1462 rgba[i][GCOMP] + 1463 rgba[i][BCOMP]); 1464 dst[i*2+1] = (GLubyte) rgba[i][ACOMP]; 1465 } 1466 break; 1467 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1468 for (i=0;i<n;i++) { 1469 dst[i] = (GLubyte) (rgba[i][RCOMP] + 1470 rgba[i][GCOMP] + 1471 rgba[i][BCOMP]); 1472 } 1473 break; 1474 case GL_DUDV_ATI: 1475 case GL_DU8DV8_ATI: 1476 for (i=0;i<n;i++) { 1477 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 1478 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 1479 } 1480 break; 1481 default: 1482 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1483 } 1484 } 1485 break; 1486 case GL_BYTE: 1487 { 1488 GLbyte *dst = (GLbyte *) dstAddr; 1489 switch (dstFormat) { 1490 case GL_RED: 1491 for (i=0;i<n;i++) 1492 dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1493 break; 1494 case GL_GREEN: 1495 for (i=0;i<n;i++) 1496 dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1497 break; 1498 case GL_BLUE: 1499 for (i=0;i<n;i++) 1500 dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1501 break; 1502 case GL_ALPHA: 1503 for (i=0;i<n;i++) 1504 dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1505 break; 1506 case GL_LUMINANCE: 1507 for (i=0;i<n;i++) 1508 dst[i] = FLOAT_TO_BYTE(luminance[i]); 1509 break; 1510 case GL_LUMINANCE_ALPHA: 1511 for (i=0;i<n;i++) { 1512 dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 1513 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1514 } 1515 break; 1516 case GL_RG: 1517 for (i=0;i<n;i++) { 1518 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1519 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1520 } 1521 break; 1522 case GL_RGB: 1523 for (i=0;i<n;i++) { 1524 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1525 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1526 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1527 } 1528 break; 1529 case GL_RGBA: 1530 for (i=0;i<n;i++) { 1531 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1532 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1533 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1534 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1535 } 1536 break; 1537 case GL_BGR: 1538 for (i=0;i<n;i++) { 1539 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1540 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1541 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1542 } 1543 break; 1544 case GL_BGRA: 1545 for (i=0;i<n;i++) { 1546 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1547 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1548 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1549 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1550 } 1551 break; 1552 case GL_ABGR_EXT: 1553 for (i=0;i<n;i++) { 1554 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1555 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1556 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1557 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1558 } 1559 break; 1560 case GL_RED_INTEGER_EXT: 1561 for (i=0;i<n;i++) { 1562 dst[i] = (GLbyte) rgba[i][RCOMP]; 1563 } 1564 break; 1565 case GL_GREEN_INTEGER_EXT: 1566 for (i=0;i<n;i++) { 1567 dst[i] = (GLbyte) rgba[i][GCOMP]; 1568 } 1569 break; 1570 case GL_BLUE_INTEGER_EXT: 1571 for (i=0;i<n;i++) { 1572 dst[i] = (GLbyte) rgba[i][BCOMP]; 1573 } 1574 break; 1575 case GL_ALPHA_INTEGER_EXT: 1576 for (i=0;i<n;i++) { 1577 dst[i] = (GLbyte) rgba[i][ACOMP]; 1578 } 1579 break; 1580 case GL_RG_INTEGER: 1581 for (i=0;i<n;i++) { 1582 dst[i*2+0] = (GLbyte) rgba[i][RCOMP]; 1583 dst[i*2+1] = (GLbyte) rgba[i][GCOMP]; 1584 } 1585 break; 1586 case GL_RGB_INTEGER_EXT: 1587 for (i=0;i<n;i++) { 1588 dst[i*3+0] = (GLbyte) rgba[i][RCOMP]; 1589 dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1590 dst[i*3+2] = (GLbyte) rgba[i][BCOMP]; 1591 } 1592 break; 1593 case GL_RGBA_INTEGER_EXT: 1594 for (i=0;i<n;i++) { 1595 dst[i*4+0] = (GLbyte) rgba[i][RCOMP]; 1596 dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1597 dst[i*4+2] = (GLbyte) rgba[i][BCOMP]; 1598 dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1599 } 1600 break; 1601 case GL_BGR_INTEGER_EXT: 1602 for (i=0;i<n;i++) { 1603 dst[i*3+0] = (GLbyte) rgba[i][BCOMP]; 1604 dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 1605 dst[i*3+2] = (GLbyte) rgba[i][RCOMP]; 1606 } 1607 break; 1608 case GL_BGRA_INTEGER_EXT: 1609 for (i=0;i<n;i++) { 1610 dst[i*4+0] = (GLbyte) rgba[i][BCOMP]; 1611 dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 1612 dst[i*4+2] = (GLbyte) rgba[i][RCOMP]; 1613 dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 1614 } 1615 break; 1616 case GL_LUMINANCE_INTEGER_EXT: 1617 for (i=0;i<n;i++) { 1618 dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] + 1619 rgba[i][GCOMP] + 1620 rgba[i][BCOMP]); 1621 dst[i*2+1] = (GLbyte) rgba[i][ACOMP]; 1622 } 1623 break; 1624 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1625 for (i=0;i<n;i++) { 1626 dst[i] = (GLbyte) (rgba[i][RCOMP] + 1627 rgba[i][GCOMP] + 1628 rgba[i][BCOMP]); 1629 } 1630 break; 1631 case GL_DUDV_ATI: 1632 case GL_DU8DV8_ATI: 1633 for (i=0;i<n;i++) { 1634 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1635 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1636 } 1637 break; 1638 default: 1639 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1640 } 1641 } 1642 break; 1643 case GL_UNSIGNED_SHORT: 1644 { 1645 GLushort *dst = (GLushort *) dstAddr; 1646 switch (dstFormat) { 1647 case GL_RED: 1648 for (i=0;i<n;i++) 1649 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); 1650 break; 1651 case GL_GREEN: 1652 for (i=0;i<n;i++) 1653 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); 1654 break; 1655 case GL_BLUE: 1656 for (i=0;i<n;i++) 1657 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); 1658 break; 1659 case GL_ALPHA: 1660 for (i=0;i<n;i++) 1661 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); 1662 break; 1663 case GL_LUMINANCE: 1664 for (i=0;i<n;i++) 1665 UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); 1666 break; 1667 case GL_LUMINANCE_ALPHA: 1668 for (i=0;i<n;i++) { 1669 UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); 1670 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); 1671 } 1672 break; 1673 case GL_RG: 1674 for (i=0;i<n;i++) { 1675 CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]); 1676 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]); 1677 } 1678 break; 1679 case GL_RGB: 1680 for (i=0;i<n;i++) { 1681 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); 1682 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1683 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); 1684 } 1685 break; 1686 case GL_RGBA: 1687 for (i=0;i<n;i++) { 1688 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); 1689 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1690 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); 1691 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1692 } 1693 break; 1694 case GL_BGR: 1695 for (i=0;i<n;i++) { 1696 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); 1697 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 1698 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); 1699 } 1700 break; 1701 case GL_BGRA: 1702 for (i=0;i<n;i++) { 1703 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); 1704 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 1705 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); 1706 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 1707 } 1708 break; 1709 case GL_ABGR_EXT: 1710 for (i=0;i<n;i++) { 1711 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); 1712 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); 1713 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); 1714 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); 1715 } 1716 break; 1717 case GL_RED_INTEGER_EXT: 1718 for (i=0;i<n;i++) { 1719 dst[i] = (GLushort) rgba[i][RCOMP]; 1720 } 1721 break; 1722 case GL_GREEN_INTEGER_EXT: 1723 for (i=0;i<n;i++) { 1724 dst[i] = (GLushort) rgba[i][GCOMP]; 1725 } 1726 break; 1727 case GL_BLUE_INTEGER_EXT: 1728 for (i=0;i<n;i++) { 1729 dst[i] = (GLushort) rgba[i][BCOMP]; 1730 } 1731 break; 1732 case GL_ALPHA_INTEGER_EXT: 1733 for (i=0;i<n;i++) { 1734 dst[i] = (GLushort) rgba[i][ACOMP]; 1735 } 1736 break; 1737 case GL_RG_INTEGER: 1738 for (i=0;i<n;i++) { 1739 dst[i*2+0] = (GLushort) rgba[i][RCOMP]; 1740 dst[i*2+1] = (GLushort) rgba[i][GCOMP]; 1741 } 1742 break; 1743 case GL_RGB_INTEGER_EXT: 1744 for (i=0;i<n;i++) { 1745 dst[i*3+0] = (GLushort) rgba[i][RCOMP]; 1746 dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1747 dst[i*3+2] = (GLushort) rgba[i][BCOMP]; 1748 } 1749 break; 1750 case GL_RGBA_INTEGER_EXT: 1751 for (i=0;i<n;i++) { 1752 dst[i*4+0] = (GLushort) rgba[i][RCOMP]; 1753 dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1754 dst[i*4+2] = (GLushort) rgba[i][BCOMP]; 1755 dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1756 } 1757 break; 1758 case GL_BGR_INTEGER_EXT: 1759 for (i=0;i<n;i++) { 1760 dst[i*3+0] = (GLushort) rgba[i][BCOMP]; 1761 dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 1762 dst[i*3+2] = (GLushort) rgba[i][RCOMP]; 1763 } 1764 break; 1765 case GL_BGRA_INTEGER_EXT: 1766 for (i=0;i<n;i++) { 1767 dst[i*4+0] = (GLushort) rgba[i][BCOMP]; 1768 dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 1769 dst[i*4+2] = (GLushort) rgba[i][RCOMP]; 1770 dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 1771 } 1772 break; 1773 case GL_LUMINANCE_INTEGER_EXT: 1774 for (i=0;i<n;i++) { 1775 dst[i*2+0] = (GLushort) (rgba[i][RCOMP] + 1776 rgba[i][GCOMP] + 1777 rgba[i][BCOMP]); 1778 dst[i*2+1] = (GLushort) rgba[i][ACOMP]; 1779 } 1780 break; 1781 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1782 for (i=0;i<n;i++) { 1783 dst[i] = (GLushort) (rgba[i][RCOMP] + 1784 rgba[i][GCOMP] + 1785 rgba[i][BCOMP]); 1786 } 1787 break; 1788 case GL_DUDV_ATI: 1789 case GL_DU8DV8_ATI: 1790 for (i=0;i<n;i++) { 1791 dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1792 dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1793 } 1794 break; 1795 default: 1796 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1797 } 1798 } 1799 break; 1800 case GL_SHORT: 1801 { 1802 GLshort *dst = (GLshort *) dstAddr; 1803 switch (dstFormat) { 1804 case GL_RED: 1805 for (i=0;i<n;i++) 1806 dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1807 break; 1808 case GL_GREEN: 1809 for (i=0;i<n;i++) 1810 dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1811 break; 1812 case GL_BLUE: 1813 for (i=0;i<n;i++) 1814 dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1815 break; 1816 case GL_ALPHA: 1817 for (i=0;i<n;i++) 1818 dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1819 break; 1820 case GL_LUMINANCE: 1821 for (i=0;i<n;i++) 1822 dst[i] = FLOAT_TO_SHORT(luminance[i]); 1823 break; 1824 case GL_LUMINANCE_ALPHA: 1825 for (i=0;i<n;i++) { 1826 dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1827 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1828 } 1829 break; 1830 case GL_RG: 1831 for (i=0;i<n;i++) { 1832 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1833 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1834 } 1835 break; 1836 case GL_RGB: 1837 for (i=0;i<n;i++) { 1838 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1839 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1840 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1841 } 1842 break; 1843 case GL_RGBA: 1844 for (i=0;i<n;i++) { 1845 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1846 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1847 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1848 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1849 } 1850 break; 1851 case GL_BGR: 1852 for (i=0;i<n;i++) { 1853 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1854 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1855 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1856 } 1857 break; 1858 case GL_BGRA: 1859 for (i=0;i<n;i++) { 1860 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1861 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1862 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1863 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1864 } 1865 break; 1866 case GL_ABGR_EXT: 1867 for (i=0;i<n;i++) { 1868 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1869 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1870 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1871 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1872 } 1873 break; 1874 case GL_RED_INTEGER_EXT: 1875 for (i=0;i<n;i++) { 1876 dst[i] = (GLshort) rgba[i][RCOMP]; 1877 } 1878 break; 1879 case GL_GREEN_INTEGER_EXT: 1880 for (i=0;i<n;i++) { 1881 dst[i] = (GLshort) rgba[i][GCOMP]; 1882 } 1883 break; 1884 case GL_BLUE_INTEGER_EXT: 1885 for (i=0;i<n;i++) { 1886 dst[i] = (GLshort) rgba[i][BCOMP]; 1887 } 1888 break; 1889 case GL_ALPHA_INTEGER_EXT: 1890 for (i=0;i<n;i++) { 1891 dst[i] = (GLshort) rgba[i][ACOMP]; 1892 } 1893 break; 1894 case GL_RG_INTEGER: 1895 for (i=0;i<n;i++) { 1896 dst[i*2+0] = (GLshort) rgba[i][RCOMP]; 1897 dst[i*2+1] = (GLshort) rgba[i][GCOMP]; 1898 } 1899 break; 1900 case GL_RGB_INTEGER_EXT: 1901 for (i=0;i<n;i++) { 1902 dst[i*3+0] = (GLshort) rgba[i][RCOMP]; 1903 dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1904 dst[i*3+2] = (GLshort) rgba[i][BCOMP]; 1905 } 1906 break; 1907 case GL_RGBA_INTEGER_EXT: 1908 for (i=0;i<n;i++) { 1909 dst[i*4+0] = (GLshort) rgba[i][RCOMP]; 1910 dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1911 dst[i*4+2] = (GLshort) rgba[i][BCOMP]; 1912 dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1913 } 1914 break; 1915 case GL_BGR_INTEGER_EXT: 1916 for (i=0;i<n;i++) { 1917 dst[i*3+0] = (GLshort) rgba[i][BCOMP]; 1918 dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 1919 dst[i*3+2] = (GLshort) rgba[i][RCOMP]; 1920 } 1921 break; 1922 case GL_BGRA_INTEGER_EXT: 1923 for (i=0;i<n;i++) { 1924 dst[i*4+0] = (GLshort) rgba[i][BCOMP]; 1925 dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 1926 dst[i*4+2] = (GLshort) rgba[i][RCOMP]; 1927 dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 1928 } 1929 break; 1930 case GL_LUMINANCE_INTEGER_EXT: 1931 for (i=0;i<n;i++) { 1932 dst[i*2+0] = (GLshort) (rgba[i][RCOMP] + 1933 rgba[i][GCOMP] + 1934 rgba[i][BCOMP]); 1935 dst[i*2+1] = (GLshort) rgba[i][ACOMP]; 1936 } 1937 break; 1938 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1939 for (i=0;i<n;i++) { 1940 dst[i] = (GLshort) (rgba[i][RCOMP] + 1941 rgba[i][GCOMP] + 1942 rgba[i][BCOMP]); 1943 } 1944 break; 1945 case GL_DUDV_ATI: 1946 case GL_DU8DV8_ATI: 1947 for (i=0;i<n;i++) { 1948 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1949 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1950 } 1951 break; 1952 default: 1953 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1954 } 1955 } 1956 break; 1957 case GL_UNSIGNED_INT: 1958 { 1959 GLuint *dst = (GLuint *) dstAddr; 1960 switch (dstFormat) { 1961 case GL_RED: 1962 for (i=0;i<n;i++) 1963 dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1964 break; 1965 case GL_GREEN: 1966 for (i=0;i<n;i++) 1967 dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1968 break; 1969 case GL_BLUE: 1970 for (i=0;i<n;i++) 1971 dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1972 break; 1973 case GL_ALPHA: 1974 for (i=0;i<n;i++) 1975 dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1976 break; 1977 case GL_LUMINANCE: 1978 for (i=0;i<n;i++) 1979 dst[i] = FLOAT_TO_UINT(luminance[i]); 1980 break; 1981 case GL_LUMINANCE_ALPHA: 1982 for (i=0;i<n;i++) { 1983 dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1984 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1985 } 1986 break; 1987 case GL_RG: 1988 for (i=0;i<n;i++) { 1989 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1990 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1991 } 1992 break; 1993 case GL_RGB: 1994 for (i=0;i<n;i++) { 1995 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1996 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1997 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1998 } 1999 break; 2000 case GL_RGBA: 2001 for (i=0;i<n;i++) { 2002 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2003 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2004 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2005 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2006 } 2007 break; 2008 case GL_BGR: 2009 for (i=0;i<n;i++) { 2010 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2011 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2012 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2013 } 2014 break; 2015 case GL_BGRA: 2016 for (i=0;i<n;i++) { 2017 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2018 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2019 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2020 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2021 } 2022 break; 2023 case GL_ABGR_EXT: 2024 for (i=0;i<n;i++) { 2025 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 2026 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 2027 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2028 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2029 } 2030 break; 2031 case GL_RED_INTEGER_EXT: 2032 for (i=0;i<n;i++) { 2033 dst[i] = (GLuint) rgba[i][RCOMP]; 2034 } 2035 break; 2036 case GL_GREEN_INTEGER_EXT: 2037 for (i=0;i<n;i++) { 2038 dst[i] = (GLuint) rgba[i][GCOMP]; 2039 } 2040 break; 2041 case GL_BLUE_INTEGER_EXT: 2042 for (i=0;i<n;i++) { 2043 dst[i] = (GLuint) rgba[i][BCOMP]; 2044 } 2045 break; 2046 case GL_ALPHA_INTEGER_EXT: 2047 for (i=0;i<n;i++) { 2048 dst[i] = (GLuint) rgba[i][ACOMP]; 2049 } 2050 break; 2051 case GL_RG_INTEGER: 2052 for (i=0;i<n;i++) { 2053 dst[i*2+0] = (GLuint) rgba[i][RCOMP]; 2054 dst[i*2+1] = (GLuint) rgba[i][GCOMP]; 2055 } 2056 break; 2057 case GL_RGB_INTEGER_EXT: 2058 for (i=0;i<n;i++) { 2059 dst[i*3+0] = (GLuint) rgba[i][RCOMP]; 2060 dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2061 dst[i*3+2] = (GLuint) rgba[i][BCOMP]; 2062 } 2063 break; 2064 case GL_RGBA_INTEGER_EXT: 2065 for (i=0;i<n;i++) { 2066 dst[i*4+0] = (GLuint) rgba[i][RCOMP]; 2067 dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2068 dst[i*4+2] = (GLuint) rgba[i][BCOMP]; 2069 dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2070 } 2071 break; 2072 case GL_BGR_INTEGER_EXT: 2073 for (i=0;i<n;i++) { 2074 dst[i*3+0] = (GLuint) rgba[i][BCOMP]; 2075 dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 2076 dst[i*3+2] = (GLuint) rgba[i][RCOMP]; 2077 } 2078 break; 2079 case GL_BGRA_INTEGER_EXT: 2080 for (i=0;i<n;i++) { 2081 dst[i*4+0] = (GLuint) rgba[i][BCOMP]; 2082 dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 2083 dst[i*4+2] = (GLuint) rgba[i][RCOMP]; 2084 dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 2085 } 2086 break; 2087 case GL_LUMINANCE_INTEGER_EXT: 2088 for (i=0;i<n;i++) { 2089 dst[i*2+0] = (GLuint) (rgba[i][RCOMP] + 2090 rgba[i][GCOMP] + 2091 rgba[i][BCOMP]); 2092 dst[i*2+1] = (GLuint) rgba[i][ACOMP]; 2093 } 2094 break; 2095 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2096 for (i=0;i<n;i++) { 2097 dst[i] = (GLuint) (rgba[i][RCOMP] + 2098 rgba[i][GCOMP] + 2099 rgba[i][BCOMP]); 2100 } 2101 break; 2102 case GL_DUDV_ATI: 2103 case GL_DU8DV8_ATI: 2104 for (i=0;i<n;i++) { 2105 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 2106 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 2107 } 2108 break; 2109 default: 2110 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2111 } 2112 } 2113 break; 2114 case GL_INT: 2115 { 2116 GLint *dst = (GLint *) dstAddr; 2117 switch (dstFormat) { 2118 case GL_RED: 2119 for (i=0;i<n;i++) 2120 dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 2121 break; 2122 case GL_GREEN: 2123 for (i=0;i<n;i++) 2124 dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 2125 break; 2126 case GL_BLUE: 2127 for (i=0;i<n;i++) 2128 dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 2129 break; 2130 case GL_ALPHA: 2131 for (i=0;i<n;i++) 2132 dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 2133 break; 2134 case GL_LUMINANCE: 2135 for (i=0;i<n;i++) 2136 dst[i] = FLOAT_TO_INT(luminance[i]); 2137 break; 2138 case GL_LUMINANCE_ALPHA: 2139 for (i=0;i<n;i++) { 2140 dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 2141 dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 2142 } 2143 break; 2144 case GL_RG: 2145 for (i=0;i<n;i++) { 2146 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2147 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2148 } 2149 break; 2150 case GL_RGB: 2151 for (i=0;i<n;i++) { 2152 dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2153 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2154 dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2155 } 2156 break; 2157 case GL_RGBA: 2158 for (i=0;i<n;i++) { 2159 dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2160 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2161 dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 2162 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2163 } 2164 break; 2165 case GL_BGR: 2166 for (i=0;i<n;i++) { 2167 dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2168 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2169 dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2170 } 2171 break; 2172 case GL_BGRA: 2173 for (i=0;i<n;i++) { 2174 dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 2175 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2176 dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 2177 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 2178 } 2179 break; 2180 case GL_ABGR_EXT: 2181 for (i=0;i<n;i++) { 2182 dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 2183 dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 2184 dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 2185 dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 2186 } 2187 break; 2188 case GL_DUDV_ATI: 2189 case GL_DU8DV8_ATI: 2190 for (i=0;i<n;i++) { 2191 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 2192 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 2193 } 2194 break; 2195 case GL_RED_INTEGER_EXT: 2196 for (i=0;i<n;i++) { 2197 dst[i] = (GLint) rgba[i][RCOMP]; 2198 } 2199 break; 2200 case GL_GREEN_INTEGER_EXT: 2201 for (i=0;i<n;i++) { 2202 dst[i] = (GLint) rgba[i][GCOMP]; 2203 } 2204 break; 2205 case GL_BLUE_INTEGER_EXT: 2206 for (i=0;i<n;i++) { 2207 dst[i] = (GLint) rgba[i][BCOMP]; 2208 } 2209 break; 2210 case GL_ALPHA_INTEGER_EXT: 2211 for (i=0;i<n;i++) { 2212 dst[i] = (GLint) rgba[i][ACOMP]; 2213 } 2214 break; 2215 case GL_RG_INTEGER: 2216 for (i=0;i<n;i++) { 2217 dst[i*2+0] = (GLint) rgba[i][RCOMP]; 2218 dst[i*2+1] = (GLint) rgba[i][GCOMP]; 2219 } 2220 break; 2221 case GL_RGB_INTEGER_EXT: 2222 for (i=0;i<n;i++) { 2223 dst[i*3+0] = (GLint) rgba[i][RCOMP]; 2224 dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2225 dst[i*3+2] = (GLint) rgba[i][BCOMP]; 2226 } 2227 break; 2228 case GL_RGBA_INTEGER_EXT: 2229 for (i=0;i<n;i++) { 2230 dst[i*4+0] = (GLint) rgba[i][RCOMP]; 2231 dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2232 dst[i*4+2] = (GLint) rgba[i][BCOMP]; 2233 dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2234 } 2235 break; 2236 case GL_BGR_INTEGER_EXT: 2237 for (i=0;i<n;i++) { 2238 dst[i*3+0] = (GLint) rgba[i][BCOMP]; 2239 dst[i*3+1] = (GLint) rgba[i][GCOMP]; 2240 dst[i*3+2] = (GLint) rgba[i][RCOMP]; 2241 } 2242 break; 2243 case GL_BGRA_INTEGER_EXT: 2244 for (i=0;i<n;i++) { 2245 dst[i*4+0] = (GLint) rgba[i][BCOMP]; 2246 dst[i*4+1] = (GLint) rgba[i][GCOMP]; 2247 dst[i*4+2] = (GLint) rgba[i][RCOMP]; 2248 dst[i*4+3] = (GLint) rgba[i][ACOMP]; 2249 } 2250 break; 2251 case GL_LUMINANCE_INTEGER_EXT: 2252 for (i=0;i<n;i++) { 2253 dst[i*2+0] = (GLint) (rgba[i][RCOMP] + 2254 rgba[i][GCOMP] + 2255 rgba[i][BCOMP]); 2256 dst[i*2+1] = (GLint) rgba[i][ACOMP]; 2257 } 2258 break; 2259 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2260 for (i=0;i<n;i++) { 2261 dst[i] = (GLint) (rgba[i][RCOMP] + 2262 rgba[i][GCOMP] + 2263 rgba[i][BCOMP]); 2264 } 2265 break; 2266 default: 2267 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2268 } 2269 } 2270 break; 2271 case GL_FLOAT: 2272 { 2273 GLfloat *dst = (GLfloat *) dstAddr; 2274 switch (dstFormat) { 2275 case GL_RED: 2276 for (i=0;i<n;i++) 2277 dst[i] = rgba[i][RCOMP]; 2278 break; 2279 case GL_GREEN: 2280 for (i=0;i<n;i++) 2281 dst[i] = rgba[i][GCOMP]; 2282 break; 2283 case GL_BLUE: 2284 for (i=0;i<n;i++) 2285 dst[i] = rgba[i][BCOMP]; 2286 break; 2287 case GL_ALPHA: 2288 for (i=0;i<n;i++) 2289 dst[i] = rgba[i][ACOMP]; 2290 break; 2291 case GL_LUMINANCE: 2292 for (i=0;i<n;i++) 2293 dst[i] = luminance[i]; 2294 break; 2295 case GL_LUMINANCE_ALPHA: 2296 for (i=0;i<n;i++) { 2297 dst[i*2+0] = luminance[i]; 2298 dst[i*2+1] = rgba[i][ACOMP]; 2299 } 2300 break; 2301 case GL_RG: 2302 for (i=0;i<n;i++) { 2303 dst[i*2+0] = rgba[i][RCOMP]; 2304 dst[i*2+1] = rgba[i][GCOMP]; 2305 } 2306 break; 2307 case GL_RGB: 2308 for (i=0;i<n;i++) { 2309 dst[i*3+0] = rgba[i][RCOMP]; 2310 dst[i*3+1] = rgba[i][GCOMP]; 2311 dst[i*3+2] = rgba[i][BCOMP]; 2312 } 2313 break; 2314 case GL_RGBA: 2315 for (i=0;i<n;i++) { 2316 dst[i*4+0] = rgba[i][RCOMP]; 2317 dst[i*4+1] = rgba[i][GCOMP]; 2318 dst[i*4+2] = rgba[i][BCOMP]; 2319 dst[i*4+3] = rgba[i][ACOMP]; 2320 } 2321 break; 2322 case GL_BGR: 2323 for (i=0;i<n;i++) { 2324 dst[i*3+0] = rgba[i][BCOMP]; 2325 dst[i*3+1] = rgba[i][GCOMP]; 2326 dst[i*3+2] = rgba[i][RCOMP]; 2327 } 2328 break; 2329 case GL_BGRA: 2330 for (i=0;i<n;i++) { 2331 dst[i*4+0] = rgba[i][BCOMP]; 2332 dst[i*4+1] = rgba[i][GCOMP]; 2333 dst[i*4+2] = rgba[i][RCOMP]; 2334 dst[i*4+3] = rgba[i][ACOMP]; 2335 } 2336 break; 2337 case GL_ABGR_EXT: 2338 for (i=0;i<n;i++) { 2339 dst[i*4+0] = rgba[i][ACOMP]; 2340 dst[i*4+1] = rgba[i][BCOMP]; 2341 dst[i*4+2] = rgba[i][GCOMP]; 2342 dst[i*4+3] = rgba[i][RCOMP]; 2343 } 2344 break; 2345 case GL_DUDV_ATI: 2346 case GL_DU8DV8_ATI: 2347 for (i=0;i<n;i++) { 2348 dst[i*2+0] = rgba[i][RCOMP]; 2349 dst[i*2+1] = rgba[i][GCOMP]; 2350 } 2351 break; 2352 default: 2353 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2354 } 2355 } 2356 break; 2357 case GL_HALF_FLOAT_ARB: 2358 { 2359 GLhalfARB *dst = (GLhalfARB *) dstAddr; 2360 switch (dstFormat) { 2361 case GL_RED: 2362 for (i=0;i<n;i++) 2363 dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 2364 break; 2365 case GL_GREEN: 2366 for (i=0;i<n;i++) 2367 dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 2368 break; 2369 case GL_BLUE: 2370 for (i=0;i<n;i++) 2371 dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 2372 break; 2373 case GL_ALPHA: 2374 for (i=0;i<n;i++) 2375 dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 2376 break; 2377 case GL_LUMINANCE: 2378 for (i=0;i<n;i++) 2379 dst[i] = _mesa_float_to_half(luminance[i]); 2380 break; 2381 case GL_LUMINANCE_ALPHA: 2382 for (i=0;i<n;i++) { 2383 dst[i*2+0] = _mesa_float_to_half(luminance[i]); 2384 dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 2385 } 2386 break; 2387 case GL_RG: 2388 for (i=0;i<n;i++) { 2389 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2390 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2391 } 2392 break; 2393 case GL_RGB: 2394 for (i=0;i<n;i++) { 2395 dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2396 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2397 dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2398 } 2399 break; 2400 case GL_RGBA: 2401 for (i=0;i<n;i++) { 2402 dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2403 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2404 dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 2405 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2406 } 2407 break; 2408 case GL_BGR: 2409 for (i=0;i<n;i++) { 2410 dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2411 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2412 dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2413 } 2414 break; 2415 case GL_BGRA: 2416 for (i=0;i<n;i++) { 2417 dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 2418 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2419 dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 2420 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 2421 } 2422 break; 2423 case GL_ABGR_EXT: 2424 for (i=0;i<n;i++) { 2425 dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 2426 dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 2427 dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 2428 dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 2429 } 2430 break; 2431 case GL_DUDV_ATI: 2432 case GL_DU8DV8_ATI: 2433 for (i=0;i<n;i++) { 2434 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 2435 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 2436 } 2437 break; 2438 default: 2439 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 2440 } 2441 } 2442 break; 2443 case GL_UNSIGNED_BYTE_3_3_2: 2444 if (dstFormat == GL_RGB) { 2445 GLubyte *dst = (GLubyte *) dstAddr; 2446 for (i=0;i<n;i++) { 2447 dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5) 2448 | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2) 2449 | (F_TO_I(rgba[i][BCOMP] * 3.0F) ); 2450 } 2451 } 2452 break; 2453 case GL_UNSIGNED_BYTE_2_3_3_REV: 2454 if (dstFormat == GL_RGB) { 2455 GLubyte *dst = (GLubyte *) dstAddr; 2456 for (i=0;i<n;i++) { 2457 dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) ) 2458 | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3) 2459 | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6); 2460 } 2461 } 2462 break; 2463 case GL_UNSIGNED_SHORT_5_6_5: 2464 if (dstFormat == GL_RGB) { 2465 GLushort *dst = (GLushort *) dstAddr; 2466 for (i=0;i<n;i++) { 2467 dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2468 | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2469 | (F_TO_I(rgba[i][BCOMP] * 31.0F) ); 2470 } 2471 } 2472 break; 2473 case GL_UNSIGNED_SHORT_5_6_5_REV: 2474 if (dstFormat == GL_RGB) { 2475 GLushort *dst = (GLushort *) dstAddr; 2476 for (i=0;i<n;i++) { 2477 dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2478 | (F_TO_I(rgba[i][GCOMP] * 63.0F) << 5) 2479 | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11); 2480 } 2481 } 2482 break; 2483 case GL_UNSIGNED_SHORT_4_4_4_4: 2484 if (dstFormat == GL_RGBA) { 2485 GLushort *dst = (GLushort *) dstAddr; 2486 for (i=0;i<n;i++) { 2487 dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12) 2488 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2489 | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2490 | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2491 } 2492 } 2493 else if (dstFormat == GL_BGRA) { 2494 GLushort *dst = (GLushort *) dstAddr; 2495 for (i=0;i<n;i++) { 2496 dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12) 2497 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2498 | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 4) 2499 | (F_TO_I(rgba[i][ACOMP] * 15.0F) ); 2500 } 2501 } 2502 else if (dstFormat == GL_ABGR_EXT) { 2503 GLushort *dst = (GLushort *) dstAddr; 2504 for (i=0;i<n;i++) { 2505 dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12) 2506 | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2507 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2508 | (F_TO_I(rgba[i][RCOMP] * 15.0F) ); 2509 } 2510 } 2511 break; 2512 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2513 if (dstFormat == GL_RGBA) { 2514 GLushort *dst = (GLushort *) dstAddr; 2515 for (i=0;i<n;i++) { 2516 dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) ) 2517 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2518 | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 8) 2519 | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2520 } 2521 } 2522 else if (dstFormat == GL_BGRA) { 2523 GLushort *dst = (GLushort *) dstAddr; 2524 for (i=0;i<n;i++) { 2525 dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) ) 2526 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 4) 2527 | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 8) 2528 | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12); 2529 } 2530 } 2531 else if (dstFormat == GL_ABGR_EXT) { 2532 GLushort *dst = (GLushort *) dstAddr; 2533 for (i=0;i<n;i++) { 2534 dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) ) 2535 | (F_TO_I(rgba[i][BCOMP] * 15.0F) << 4) 2536 | (F_TO_I(rgba[i][GCOMP] * 15.0F) << 8) 2537 | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12); 2538 } 2539 } 2540 break; 2541 case GL_UNSIGNED_SHORT_5_5_5_1: 2542 if (dstFormat == GL_RGBA) { 2543 GLushort *dst = (GLushort *) dstAddr; 2544 for (i=0;i<n;i++) { 2545 dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11) 2546 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2547 | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 1) 2548 | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2549 } 2550 } 2551 else if (dstFormat == GL_BGRA) { 2552 GLushort *dst = (GLushort *) dstAddr; 2553 for (i=0;i<n;i++) { 2554 dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11) 2555 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 6) 2556 | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 1) 2557 | (F_TO_I(rgba[i][ACOMP] * 1.0F) ); 2558 } 2559 } 2560 else if (dstFormat == GL_ABGR_EXT) { 2561 GLushort *dst = (GLushort *) dstAddr; 2562 for (i=0;i<n;i++) { 2563 dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11) 2564 | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 6) 2565 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 1) 2566 | (F_TO_I(rgba[i][RCOMP] * 1.0F) ); 2567 } 2568 } 2569 break; 2570 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2571 if (dstFormat == GL_RGBA) { 2572 GLushort *dst = (GLushort *) dstAddr; 2573 for (i=0;i<n;i++) { 2574 dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) ) 2575 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2576 | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10) 2577 | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2578 } 2579 } 2580 else if (dstFormat == GL_BGRA) { 2581 GLushort *dst = (GLushort *) dstAddr; 2582 for (i=0;i<n;i++) { 2583 dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) ) 2584 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 5) 2585 | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10) 2586 | (F_TO_I(rgba[i][ACOMP] * 1.0F) << 15); 2587 } 2588 } 2589 else if (dstFormat == GL_ABGR_EXT) { 2590 GLushort *dst = (GLushort *) dstAddr; 2591 for (i=0;i<n;i++) { 2592 dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) ) 2593 | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 5) 2594 | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10) 2595 | (F_TO_I(rgba[i][RCOMP] * 1.0F) << 15); 2596 } 2597 } 2598 break; 2599 case GL_UNSIGNED_INT_8_8_8_8: 2600 if (dstFormat == GL_RGBA) { 2601 GLuint *dst = (GLuint *) dstAddr; 2602 for (i=0;i<n;i++) { 2603 dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24) 2604 | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2605 | (F_TO_I(rgba[i][BCOMP] * 255.F) << 8) 2606 | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2607 } 2608 } 2609 else if (dstFormat == GL_BGRA) { 2610 GLuint *dst = (GLuint *) dstAddr; 2611 for (i=0;i<n;i++) { 2612 dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24) 2613 | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16) 2614 | (F_TO_I(rgba[i][RCOMP] * 255.F) << 8) 2615 | (F_TO_I(rgba[i][ACOMP] * 255.F) ); 2616 } 2617 } 2618 else if (dstFormat == GL_ABGR_EXT) { 2619 GLuint *dst = (GLuint *) dstAddr; 2620 for (i=0;i<n;i++) { 2621 dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24) 2622 | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16) 2623 | (F_TO_I(rgba[i][GCOMP] * 255.F) << 8) 2624 | (F_TO_I(rgba[i][RCOMP] * 255.F) ); 2625 } 2626 } 2627 break; 2628 case GL_UNSIGNED_INT_8_8_8_8_REV: 2629 if (dstFormat == GL_RGBA) { 2630 GLuint *dst = (GLuint *) dstAddr; 2631 for (i=0;i<n;i++) { 2632 dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F) ) 2633 | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2634 | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16) 2635 | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2636 } 2637 } 2638 else if (dstFormat == GL_BGRA) { 2639 GLuint *dst = (GLuint *) dstAddr; 2640 for (i=0;i<n;i++) { 2641 dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F) ) 2642 | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 8) 2643 | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16) 2644 | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24); 2645 } 2646 } 2647 else if (dstFormat == GL_ABGR_EXT) { 2648 GLuint *dst = (GLuint *) dstAddr; 2649 for (i=0;i<n;i++) { 2650 dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F) ) 2651 | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 8) 2652 | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16) 2653 | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24); 2654 } 2655 } 2656 break; 2657 case GL_UNSIGNED_INT_10_10_10_2: 2658 if (dstFormat == GL_RGBA) { 2659 GLuint *dst = (GLuint *) dstAddr; 2660 for (i=0;i<n;i++) { 2661 dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22) 2662 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2663 | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 2) 2664 | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2665 } 2666 } 2667 else if (dstFormat == GL_BGRA) { 2668 GLuint *dst = (GLuint *) dstAddr; 2669 for (i=0;i<n;i++) { 2670 dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22) 2671 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12) 2672 | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 2) 2673 | (F_TO_I(rgba[i][ACOMP] * 3.0F) ); 2674 } 2675 } 2676 else if (dstFormat == GL_ABGR_EXT) { 2677 GLuint *dst = (GLuint *) dstAddr; 2678 for (i=0;i<n;i++) { 2679 dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22) 2680 | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12) 2681 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 2) 2682 | (F_TO_I(rgba[i][RCOMP] * 3.0F) ); 2683 } 2684 } 2685 break; 2686 case GL_UNSIGNED_INT_2_10_10_10_REV: 2687 if (dstFormat == GL_RGBA) { 2688 GLuint *dst = (GLuint *) dstAddr; 2689 for (i=0;i<n;i++) { 2690 dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) ) 2691 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2692 | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20) 2693 | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2694 } 2695 } 2696 else if (dstFormat == GL_BGRA) { 2697 GLuint *dst = (GLuint *) dstAddr; 2698 for (i=0;i<n;i++) { 2699 dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) ) 2700 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10) 2701 | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20) 2702 | (F_TO_I(rgba[i][ACOMP] * 3.0F) << 30); 2703 } 2704 } 2705 else if (dstFormat == GL_ABGR_EXT) { 2706 GLuint *dst = (GLuint *) dstAddr; 2707 for (i=0;i<n;i++) { 2708 dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) ) 2709 | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10) 2710 | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20) 2711 | (F_TO_I(rgba[i][RCOMP] * 3.0F) << 30); 2712 } 2713 } 2714 break; 2715 case GL_UNSIGNED_INT_5_9_9_9_REV: 2716 { 2717 GLuint *dst = (GLuint *) dstAddr; 2718 for (i = 0; i < n; i++) { 2719 dst[i] = float3_to_rgb9e5(rgba[i]); 2720 } 2721 } 2722 break; 2723 case GL_UNSIGNED_INT_10F_11F_11F_REV: 2724 { 2725 GLuint *dst = (GLuint *) dstAddr; 2726 for (i = 0; i < n; i++) { 2727 dst[i] = float3_to_r11g11b10f(rgba[i]); 2728 } 2729 } 2730 break; 2731 default: 2732 _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 2733 free(luminance); 2734 return; 2735 } 2736 2737 if (dstPacking->SwapBytes) { 2738 GLint swapSize = _mesa_sizeof_packed_type(dstType); 2739 if (swapSize == 2) { 2740 _mesa_swap2((GLushort *) dstAddr, n * comps); 2741 } 2742 else if (swapSize == 4) { 2743 _mesa_swap4((GLuint *) dstAddr, n * comps); 2744 } 2745 } 2746 2747 free(luminance); 2748 } 2749 2750 2751 2752 #define SWAP2BYTE(VALUE) \ 2753 { \ 2754 GLubyte *bytes = (GLubyte *) &(VALUE); \ 2755 GLubyte tmp = bytes[0]; \ 2756 bytes[0] = bytes[1]; \ 2757 bytes[1] = tmp; \ 2758 } 2759 2760 #define SWAP4BYTE(VALUE) \ 2761 { \ 2762 GLubyte *bytes = (GLubyte *) &(VALUE); \ 2763 GLubyte tmp = bytes[0]; \ 2764 bytes[0] = bytes[3]; \ 2765 bytes[3] = tmp; \ 2766 tmp = bytes[1]; \ 2767 bytes[1] = bytes[2]; \ 2768 bytes[2] = tmp; \ 2769 } 2770 2771 2772 static void 2773 extract_uint_indexes(GLuint n, GLuint indexes[], 2774 GLenum srcFormat, GLenum srcType, const GLvoid *src, 2775 const struct gl_pixelstore_attrib *unpack ) 2776 { 2777 ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX); 2778 2779 ASSERT(srcType == GL_BITMAP || 2780 srcType == GL_UNSIGNED_BYTE || 2781 srcType == GL_BYTE || 2782 srcType == GL_UNSIGNED_SHORT || 2783 srcType == GL_SHORT || 2784 srcType == GL_UNSIGNED_INT || 2785 srcType == GL_INT || 2786 srcType == GL_UNSIGNED_INT_24_8_EXT || 2787 srcType == GL_HALF_FLOAT_ARB || 2788 srcType == GL_FLOAT || 2789 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 2790 2791 switch (srcType) { 2792 case GL_BITMAP: 2793 { 2794 GLubyte *ubsrc = (GLubyte *) src; 2795 if (unpack->LsbFirst) { 2796 GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 2797 GLuint i; 2798 for (i = 0; i < n; i++) { 2799 indexes[i] = (*ubsrc & mask) ? 1 : 0; 2800 if (mask == 128) { 2801 mask = 1; 2802 ubsrc++; 2803 } 2804 else { 2805 mask = mask << 1; 2806 } 2807 } 2808 } 2809 else { 2810 GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 2811 GLuint i; 2812 for (i = 0; i < n; i++) { 2813 indexes[i] = (*ubsrc & mask) ? 1 : 0; 2814 if (mask == 1) { 2815 mask = 128; 2816 ubsrc++; 2817 } 2818 else { 2819 mask = mask >> 1; 2820 } 2821 } 2822 } 2823 } 2824 break; 2825 case GL_UNSIGNED_BYTE: 2826 { 2827 GLuint i; 2828 const GLubyte *s = (const GLubyte *) src; 2829 for (i = 0; i < n; i++) 2830 indexes[i] = s[i]; 2831 } 2832 break; 2833 case GL_BYTE: 2834 { 2835 GLuint i; 2836 const GLbyte *s = (const GLbyte *) src; 2837 for (i = 0; i < n; i++) 2838 indexes[i] = s[i]; 2839 } 2840 break; 2841 case GL_UNSIGNED_SHORT: 2842 { 2843 GLuint i; 2844 const GLushort *s = (const GLushort *) src; 2845 if (unpack->SwapBytes) { 2846 for (i = 0; i < n; i++) { 2847 GLushort value = s[i]; 2848 SWAP2BYTE(value); 2849 indexes[i] = value; 2850 } 2851 } 2852 else { 2853 for (i = 0; i < n; i++) 2854 indexes[i] = s[i]; 2855 } 2856 } 2857 break; 2858 case GL_SHORT: 2859 { 2860 GLuint i; 2861 const GLshort *s = (const GLshort *) src; 2862 if (unpack->SwapBytes) { 2863 for (i = 0; i < n; i++) { 2864 GLshort value = s[i]; 2865 SWAP2BYTE(value); 2866 indexes[i] = value; 2867 } 2868 } 2869 else { 2870 for (i = 0; i < n; i++) 2871 indexes[i] = s[i]; 2872 } 2873 } 2874 break; 2875 case GL_UNSIGNED_INT: 2876 { 2877 GLuint i; 2878 const GLuint *s = (const GLuint *) src; 2879 if (unpack->SwapBytes) { 2880 for (i = 0; i < n; i++) { 2881 GLuint value = s[i]; 2882 SWAP4BYTE(value); 2883 indexes[i] = value; 2884 } 2885 } 2886 else { 2887 for (i = 0; i < n; i++) 2888 indexes[i] = s[i]; 2889 } 2890 } 2891 break; 2892 case GL_INT: 2893 { 2894 GLuint i; 2895 const GLint *s = (const GLint *) src; 2896 if (unpack->SwapBytes) { 2897 for (i = 0; i < n; i++) { 2898 GLint value = s[i]; 2899 SWAP4BYTE(value); 2900 indexes[i] = value; 2901 } 2902 } 2903 else { 2904 for (i = 0; i < n; i++) 2905 indexes[i] = s[i]; 2906 } 2907 } 2908 break; 2909 case GL_FLOAT: 2910 { 2911 GLuint i; 2912 const GLfloat *s = (const GLfloat *) src; 2913 if (unpack->SwapBytes) { 2914 for (i = 0; i < n; i++) { 2915 GLfloat value = s[i]; 2916 SWAP4BYTE(value); 2917 indexes[i] = (GLuint) value; 2918 } 2919 } 2920 else { 2921 for (i = 0; i < n; i++) 2922 indexes[i] = (GLuint) s[i]; 2923 } 2924 } 2925 break; 2926 case GL_HALF_FLOAT_ARB: 2927 { 2928 GLuint i; 2929 const GLhalfARB *s = (const GLhalfARB *) src; 2930 if (unpack->SwapBytes) { 2931 for (i = 0; i < n; i++) { 2932 GLhalfARB value = s[i]; 2933 SWAP2BYTE(value); 2934 indexes[i] = (GLuint) _mesa_half_to_float(value); 2935 } 2936 } 2937 else { 2938 for (i = 0; i < n; i++) 2939 indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 2940 } 2941 } 2942 break; 2943 case GL_UNSIGNED_INT_24_8_EXT: 2944 { 2945 GLuint i; 2946 const GLuint *s = (const GLuint *) src; 2947 if (unpack->SwapBytes) { 2948 for (i = 0; i < n; i++) { 2949 GLuint value = s[i]; 2950 SWAP4BYTE(value); 2951 indexes[i] = value & 0xff; /* lower 8 bits */ 2952 } 2953 } 2954 else { 2955 for (i = 0; i < n; i++) 2956 indexes[i] = s[i] & 0xff; /* lower 8 bits */ 2957 } 2958 } 2959 break; 2960 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2961 { 2962 GLuint i; 2963 const GLuint *s = (const GLuint *) src; 2964 if (unpack->SwapBytes) { 2965 for (i = 0; i < n; i++) { 2966 GLuint value = s[i*2+1]; 2967 SWAP4BYTE(value); 2968 indexes[i] = value & 0xff; /* lower 8 bits */ 2969 } 2970 } 2971 else { 2972 for (i = 0; i < n; i++) 2973 indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */ 2974 } 2975 } 2976 break; 2977 2978 default: 2979 _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 2980 return; 2981 } 2982 } 2983 2984 2985 /** 2986 * Return source/dest RGBA indexes for unpacking pixels. 2987 */ 2988 static void 2989 get_component_mapping(GLenum format, 2990 GLint *rSrc, 2991 GLint *gSrc, 2992 GLint *bSrc, 2993 GLint *aSrc, 2994 GLint *rDst, 2995 GLint *gDst, 2996 GLint *bDst, 2997 GLint *aDst) 2998 { 2999 switch (format) { 3000 case GL_RED: 3001 case GL_RED_INTEGER_EXT: 3002 *rSrc = 0; 3003 *gSrc = *bSrc = *aSrc = -1; 3004 break; 3005 case GL_GREEN: 3006 case GL_GREEN_INTEGER_EXT: 3007 *gSrc = 0; 3008 *rSrc = *bSrc = *aSrc = -1; 3009 break; 3010 case GL_BLUE: 3011 case GL_BLUE_INTEGER_EXT: 3012 *bSrc = 0; 3013 *rSrc = *gSrc = *aSrc = -1; 3014 break; 3015 case GL_ALPHA: 3016 case GL_ALPHA_INTEGER_EXT: 3017 *rSrc = *gSrc = *bSrc = -1; 3018 *aSrc = 0; 3019 break; 3020 case GL_LUMINANCE: 3021 case GL_LUMINANCE_INTEGER_EXT: 3022 *rSrc = *gSrc = *bSrc = 0; 3023 *aSrc = -1; 3024 break; 3025 case GL_LUMINANCE_ALPHA: 3026 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3027 *rSrc = *gSrc = *bSrc = 0; 3028 *aSrc = 1; 3029 break; 3030 case GL_INTENSITY: 3031 *rSrc = *gSrc = *bSrc = *aSrc = 0; 3032 break; 3033 case GL_RG: 3034 case GL_RG_INTEGER: 3035 *rSrc = 0; 3036 *gSrc = 1; 3037 *bSrc = -1; 3038 *aSrc = -1; 3039 *rDst = 0; 3040 *gDst = 1; 3041 *bDst = 2; 3042 *aDst = 3; 3043 break; 3044 case GL_RGB: 3045 case GL_RGB_INTEGER: 3046 *rSrc = 0; 3047 *gSrc = 1; 3048 *bSrc = 2; 3049 *aSrc = -1; 3050 *rDst = 0; 3051 *gDst = 1; 3052 *bDst = 2; 3053 *aDst = 3; 3054 break; 3055 case GL_BGR: 3056 case GL_BGR_INTEGER: 3057 *rSrc = 2; 3058 *gSrc = 1; 3059 *bSrc = 0; 3060 *aSrc = -1; 3061 *rDst = 2; 3062 *gDst = 1; 3063 *bDst = 0; 3064 *aDst = 3; 3065 break; 3066 case GL_RGBA: 3067 case GL_RGBA_INTEGER: 3068 *rSrc = 0; 3069 *gSrc = 1; 3070 *bSrc = 2; 3071 *aSrc = 3; 3072 *rDst = 0; 3073 *gDst = 1; 3074 *bDst = 2; 3075 *aDst = 3; 3076 break; 3077 case GL_BGRA: 3078 case GL_BGRA_INTEGER: 3079 *rSrc = 2; 3080 *gSrc = 1; 3081 *bSrc = 0; 3082 *aSrc = 3; 3083 *rDst = 2; 3084 *gDst = 1; 3085 *bDst = 0; 3086 *aDst = 3; 3087 break; 3088 case GL_ABGR_EXT: 3089 *rSrc = 3; 3090 *gSrc = 2; 3091 *bSrc = 1; 3092 *aSrc = 0; 3093 *rDst = 3; 3094 *gDst = 2; 3095 *bDst = 1; 3096 *aDst = 0; 3097 break; 3098 case GL_DU8DV8_ATI: 3099 case GL_DUDV_ATI: 3100 *rSrc = 0; 3101 *gSrc = 1; 3102 *bSrc = -1; 3103 *aSrc = -1; 3104 break; 3105 default: 3106 _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping", 3107 _mesa_lookup_enum_by_nr(format)); 3108 return; 3109 } 3110 } 3111 3112 3113 3114 /* 3115 * This function extracts floating point RGBA values from arbitrary 3116 * image data. srcFormat and srcType are the format and type parameters 3117 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 3118 * 3119 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 3120 * implements the "Conversion to floating point", "Conversion to RGB", 3121 * and "Final Expansion to RGBA" operations. 3122 * 3123 * Args: n - number of pixels 3124 * rgba - output colors 3125 * srcFormat - format of incoming data 3126 * srcType - data type of incoming data 3127 * src - source data pointer 3128 * swapBytes - perform byteswapping of incoming data? 3129 */ 3130 static void 3131 extract_float_rgba(GLuint n, GLfloat rgba[][4], 3132 GLenum srcFormat, GLenum srcType, const GLvoid *src, 3133 GLboolean swapBytes) 3134 { 3135 GLint rSrc, gSrc, bSrc, aSrc; 3136 GLint stride; 3137 GLint rDst, bDst, gDst, aDst; 3138 GLboolean intFormat; 3139 GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */ 3140 3141 ASSERT(srcFormat == GL_RED || 3142 srcFormat == GL_GREEN || 3143 srcFormat == GL_BLUE || 3144 srcFormat == GL_ALPHA || 3145 srcFormat == GL_LUMINANCE || 3146 srcFormat == GL_LUMINANCE_ALPHA || 3147 srcFormat == GL_INTENSITY || 3148 srcFormat == GL_RG || 3149 srcFormat == GL_RGB || 3150 srcFormat == GL_BGR || 3151 srcFormat == GL_RGBA || 3152 srcFormat == GL_BGRA || 3153 srcFormat == GL_ABGR_EXT || 3154 srcFormat == GL_DU8DV8_ATI || 3155 srcFormat == GL_DUDV_ATI || 3156 srcFormat == GL_RED_INTEGER_EXT || 3157 srcFormat == GL_GREEN_INTEGER_EXT || 3158 srcFormat == GL_BLUE_INTEGER_EXT || 3159 srcFormat == GL_ALPHA_INTEGER_EXT || 3160 srcFormat == GL_RG_INTEGER || 3161 srcFormat == GL_RGB_INTEGER_EXT || 3162 srcFormat == GL_RGBA_INTEGER_EXT || 3163 srcFormat == GL_BGR_INTEGER_EXT || 3164 srcFormat == GL_BGRA_INTEGER_EXT || 3165 srcFormat == GL_LUMINANCE_INTEGER_EXT || 3166 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3167 3168 ASSERT(srcType == GL_UNSIGNED_BYTE || 3169 srcType == GL_BYTE || 3170 srcType == GL_UNSIGNED_SHORT || 3171 srcType == GL_SHORT || 3172 srcType == GL_UNSIGNED_INT || 3173 srcType == GL_INT || 3174 srcType == GL_HALF_FLOAT_ARB || 3175 srcType == GL_FLOAT || 3176 srcType == GL_UNSIGNED_BYTE_3_3_2 || 3177 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3178 srcType == GL_UNSIGNED_SHORT_5_6_5 || 3179 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3180 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3181 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3182 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3183 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3184 srcType == GL_UNSIGNED_INT_8_8_8_8 || 3185 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3186 srcType == GL_UNSIGNED_INT_10_10_10_2 || 3187 srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3188 srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3189 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3190 3191 get_component_mapping(srcFormat, 3192 &rSrc, &gSrc, &bSrc, &aSrc, 3193 &rDst, &gDst, &bDst, &aDst); 3194 3195 stride = _mesa_components_in_format(srcFormat); 3196 3197 intFormat = _mesa_is_enum_format_integer(srcFormat); 3198 3199 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ 3200 if ((SRC_INDEX) < 0) { \ 3201 GLuint i; \ 3202 if (intFormat) { \ 3203 for (i = 0; i < n; i++) { \ 3204 rgba[i][DST_INDEX] = DEFAULT_INT; \ 3205 } \ 3206 } \ 3207 else { \ 3208 for (i = 0; i < n; i++) { \ 3209 rgba[i][DST_INDEX] = DEFAULT_FLT; \ 3210 } \ 3211 } \ 3212 } \ 3213 else if (swapBytes) { \ 3214 const TYPE *s = (const TYPE *) src; \ 3215 GLuint i; \ 3216 for (i = 0; i < n; i++) { \ 3217 TYPE value = s[SRC_INDEX]; \ 3218 if (sizeof(TYPE) == 2) { \ 3219 SWAP2BYTE(value); \ 3220 } \ 3221 else if (sizeof(TYPE) == 4) { \ 3222 SWAP4BYTE(value); \ 3223 } \ 3224 if (intFormat) \ 3225 rgba[i][DST_INDEX] = (GLfloat) value; \ 3226 else \ 3227 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \ 3228 s += stride; \ 3229 } \ 3230 } \ 3231 else { \ 3232 const TYPE *s = (const TYPE *) src; \ 3233 GLuint i; \ 3234 if (intFormat) { \ 3235 for (i = 0; i < n; i++) { \ 3236 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \ 3237 s += stride; \ 3238 } \ 3239 } \ 3240 else { \ 3241 for (i = 0; i < n; i++) { \ 3242 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \ 3243 s += stride; \ 3244 } \ 3245 } \ 3246 } 3247 3248 switch (srcType) { 3249 case GL_UNSIGNED_BYTE: 3250 PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3251 PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3252 PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 3253 PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); 3254 break; 3255 case GL_BYTE: 3256 PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3257 PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3258 PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); 3259 PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ); 3260 break; 3261 case GL_UNSIGNED_SHORT: 3262 PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3263 PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3264 PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 3265 PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); 3266 break; 3267 case GL_SHORT: 3268 PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3269 PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3270 PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); 3271 PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ); 3272 break; 3273 case GL_UNSIGNED_INT: 3274 PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3275 PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3276 PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 3277 PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT); 3278 break; 3279 case GL_INT: 3280 PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3281 PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3282 PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 3283 PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT); 3284 break; 3285 case GL_FLOAT: 3286 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3287 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3288 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 3289 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat)); 3290 break; 3291 case GL_HALF_FLOAT_ARB: 3292 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3293 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3294 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 3295 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float); 3296 break; 3297 case GL_UNSIGNED_BYTE_3_3_2: 3298 { 3299 const GLubyte *ubsrc = (const GLubyte *) src; 3300 GLuint i; 3301 if (!intFormat) { 3302 rs = 1.0F / 7.0F; 3303 gs = 1.0F / 7.0F; 3304 bs = 1.0F / 3.0F; 3305 } 3306 for (i = 0; i < n; i ++) { 3307 GLubyte p = ubsrc[i]; 3308 rgba[i][rDst] = ((p >> 5) ) * rs; 3309 rgba[i][gDst] = ((p >> 2) & 0x7) * gs; 3310 rgba[i][bDst] = ((p ) & 0x3) * bs; 3311 rgba[i][aDst] = 1.0F; 3312 } 3313 } 3314 break; 3315 case GL_UNSIGNED_BYTE_2_3_3_REV: 3316 { 3317 const GLubyte *ubsrc = (const GLubyte *) src; 3318 GLuint i; 3319 if (!intFormat) { 3320 rs = 1.0F / 7.0F; 3321 gs = 1.0F / 7.0F; 3322 bs = 1.0F / 3.0F; 3323 } 3324 for (i = 0; i < n; i ++) { 3325 GLubyte p = ubsrc[i]; 3326 rgba[i][rDst] = ((p ) & 0x7) * rs; 3327 rgba[i][gDst] = ((p >> 3) & 0x7) * gs; 3328 rgba[i][bDst] = ((p >> 6) ) * bs; 3329 rgba[i][aDst] = 1.0F; 3330 } 3331 } 3332 break; 3333 case GL_UNSIGNED_SHORT_5_6_5: 3334 if (!intFormat) { 3335 rs = 1.0F / 31.0F; 3336 gs = 1.0F / 63.0F; 3337 bs = 1.0F / 31.0F; 3338 } 3339 if (swapBytes) { 3340 const GLushort *ussrc = (const GLushort *) src; 3341 GLuint i; 3342 for (i = 0; i < n; i ++) { 3343 GLushort p = ussrc[i]; 3344 SWAP2BYTE(p); 3345 rgba[i][rDst] = ((p >> 11) ) * rs; 3346 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3347 rgba[i][bDst] = ((p ) & 0x1f) * bs; 3348 rgba[i][aDst] = 1.0F; 3349 } 3350 } 3351 else { 3352 const GLushort *ussrc = (const GLushort *) src; 3353 GLuint i; 3354 for (i = 0; i < n; i ++) { 3355 GLushort p = ussrc[i]; 3356 rgba[i][rDst] = ((p >> 11) ) * rs; 3357 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3358 rgba[i][bDst] = ((p ) & 0x1f) * bs; 3359 rgba[i][aDst] = 1.0F; 3360 } 3361 } 3362 break; 3363 case GL_UNSIGNED_SHORT_5_6_5_REV: 3364 if (!intFormat) { 3365 rs = 1.0F / 31.0F; 3366 gs = 1.0F / 63.0F; 3367 bs = 1.0F / 31.0F; 3368 } 3369 if (swapBytes) { 3370 const GLushort *ussrc = (const GLushort *) src; 3371 GLuint i; 3372 for (i = 0; i < n; i ++) { 3373 GLushort p = ussrc[i]; 3374 SWAP2BYTE(p); 3375 rgba[i][rDst] = ((p ) & 0x1f) * rs; 3376 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3377 rgba[i][bDst] = ((p >> 11) ) * bs; 3378 rgba[i][aDst] = 1.0F; 3379 } 3380 } 3381 else { 3382 const GLushort *ussrc = (const GLushort *) src; 3383 GLuint i; 3384 for (i = 0; i < n; i ++) { 3385 GLushort p = ussrc[i]; 3386 rgba[i][rDst] = ((p ) & 0x1f) * rs; 3387 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 3388 rgba[i][bDst] = ((p >> 11) ) * bs; 3389 rgba[i][aDst] = 1.0F; 3390 } 3391 } 3392 break; 3393 case GL_UNSIGNED_SHORT_4_4_4_4: 3394 if (!intFormat) { 3395 rs = gs = bs = as = 1.0F / 15.0F; 3396 } 3397 if (swapBytes) { 3398 const GLushort *ussrc = (const GLushort *) src; 3399 GLuint i; 3400 for (i = 0; i < n; i ++) { 3401 GLushort p = ussrc[i]; 3402 SWAP2BYTE(p); 3403 rgba[i][rDst] = ((p >> 12) ) * rs; 3404 rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3405 rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3406 rgba[i][aDst] = ((p ) & 0xf) * as; 3407 } 3408 } 3409 else { 3410 const GLushort *ussrc = (const GLushort *) src; 3411 GLuint i; 3412 for (i = 0; i < n; i ++) { 3413 GLushort p = ussrc[i]; 3414 rgba[i][rDst] = ((p >> 12) ) * rs; 3415 rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 3416 rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 3417 rgba[i][aDst] = ((p ) & 0xf) * as; 3418 } 3419 } 3420 break; 3421 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3422 if (!intFormat) { 3423 rs = gs = bs = as = 1.0F / 15.0F; 3424 } 3425 if (swapBytes) { 3426 const GLushort *ussrc = (const GLushort *) src; 3427 GLuint i; 3428 for (i = 0; i < n; i ++) { 3429 GLushort p = ussrc[i]; 3430 SWAP2BYTE(p); 3431 rgba[i][rDst] = ((p ) & 0xf) * rs; 3432 rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3433 rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3434 rgba[i][aDst] = ((p >> 12) ) * as; 3435 } 3436 } 3437 else { 3438 const GLushort *ussrc = (const GLushort *) src; 3439 GLuint i; 3440 for (i = 0; i < n; i ++) { 3441 GLushort p = ussrc[i]; 3442 rgba[i][rDst] = ((p ) & 0xf) * rs; 3443 rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 3444 rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 3445 rgba[i][aDst] = ((p >> 12) ) * as; 3446 } 3447 } 3448 break; 3449 case GL_UNSIGNED_SHORT_5_5_5_1: 3450 if (!intFormat) { 3451 rs = gs = bs = 1.0F / 31.0F; 3452 } 3453 if (swapBytes) { 3454 const GLushort *ussrc = (const GLushort *) src; 3455 GLuint i; 3456 for (i = 0; i < n; i ++) { 3457 GLushort p = ussrc[i]; 3458 SWAP2BYTE(p); 3459 rgba[i][rDst] = ((p >> 11) ) * rs; 3460 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3461 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3462 rgba[i][aDst] = ((p ) & 0x1) * as; 3463 } 3464 } 3465 else { 3466 const GLushort *ussrc = (const GLushort *) src; 3467 GLuint i; 3468 for (i = 0; i < n; i ++) { 3469 GLushort p = ussrc[i]; 3470 rgba[i][rDst] = ((p >> 11) ) * rs; 3471 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 3472 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 3473 rgba[i][aDst] = ((p ) & 0x1) * as; 3474 } 3475 } 3476 break; 3477 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3478 if (!intFormat) { 3479 rs = gs = bs = 1.0F / 31.0F; 3480 } 3481 if (swapBytes) { 3482 const GLushort *ussrc = (const GLushort *) src; 3483 GLuint i; 3484 for (i = 0; i < n; i ++) { 3485 GLushort p = ussrc[i]; 3486 SWAP2BYTE(p); 3487 rgba[i][rDst] = ((p ) & 0x1f) * rs; 3488 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3489 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3490 rgba[i][aDst] = ((p >> 15) ) * as; 3491 } 3492 } 3493 else { 3494 const GLushort *ussrc = (const GLushort *) src; 3495 GLuint i; 3496 for (i = 0; i < n; i ++) { 3497 GLushort p = ussrc[i]; 3498 rgba[i][rDst] = ((p ) & 0x1f) * rs; 3499 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 3500 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 3501 rgba[i][aDst] = ((p >> 15) ) * as; 3502 } 3503 } 3504 break; 3505 case GL_UNSIGNED_INT_8_8_8_8: 3506 if (swapBytes) { 3507 const GLuint *uisrc = (const GLuint *) src; 3508 GLuint i; 3509 if (intFormat) { 3510 for (i = 0; i < n; i ++) { 3511 GLuint p = uisrc[i]; 3512 rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3513 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3514 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3515 rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3516 } 3517 } 3518 else { 3519 for (i = 0; i < n; i ++) { 3520 GLuint p = uisrc[i]; 3521 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3522 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3523 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3524 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3525 } 3526 } 3527 } 3528 else { 3529 const GLuint *uisrc = (const GLuint *) src; 3530 GLuint i; 3531 if (intFormat) { 3532 for (i = 0; i < n; i ++) { 3533 GLuint p = uisrc[i]; 3534 rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3535 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3536 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3537 rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3538 } 3539 } 3540 else { 3541 for (i = 0; i < n; i ++) { 3542 GLuint p = uisrc[i]; 3543 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3544 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3545 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3546 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3547 } 3548 } 3549 } 3550 break; 3551 case GL_UNSIGNED_INT_8_8_8_8_REV: 3552 if (swapBytes) { 3553 const GLuint *uisrc = (const GLuint *) src; 3554 GLuint i; 3555 if (intFormat) { 3556 for (i = 0; i < n; i ++) { 3557 GLuint p = uisrc[i]; 3558 rgba[i][rDst] = (GLfloat) ((p >> 24) ); 3559 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 3560 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 3561 rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 3562 } 3563 } 3564 else { 3565 for (i = 0; i < n; i ++) { 3566 GLuint p = uisrc[i]; 3567 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 3568 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3569 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3570 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3571 } 3572 } 3573 } 3574 else { 3575 const GLuint *uisrc = (const GLuint *) src; 3576 GLuint i; 3577 if (intFormat) { 3578 for (i = 0; i < n; i ++) { 3579 GLuint p = uisrc[i]; 3580 rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 3581 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 3582 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 3583 rgba[i][aDst] = (GLfloat) ((p >> 24) ); 3584 } 3585 } 3586 else { 3587 for (i = 0; i < n; i ++) { 3588 GLuint p = uisrc[i]; 3589 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 3590 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 3591 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 3592 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 3593 } 3594 } 3595 } 3596 break; 3597 case GL_UNSIGNED_INT_10_10_10_2: 3598 if (!intFormat) { 3599 rs = 1.0F / 1023.0F; 3600 gs = 1.0F / 1023.0F; 3601 bs = 1.0F / 1023.0F; 3602 as = 1.0F / 3.0F; 3603 } 3604 if (swapBytes) { 3605 const GLuint *uisrc = (const GLuint *) src; 3606 GLuint i; 3607 for (i = 0; i < n; i ++) { 3608 GLuint p = uisrc[i]; 3609 SWAP4BYTE(p); 3610 rgba[i][rDst] = ((p >> 22) ) * rs; 3611 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3612 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3613 rgba[i][aDst] = ((p ) & 0x3 ) * as; 3614 } 3615 } 3616 else { 3617 const GLuint *uisrc = (const GLuint *) src; 3618 GLuint i; 3619 for (i = 0; i < n; i ++) { 3620 GLuint p = uisrc[i]; 3621 rgba[i][rDst] = ((p >> 22) ) * rs; 3622 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 3623 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 3624 rgba[i][aDst] = ((p ) & 0x3 ) * as; 3625 } 3626 } 3627 break; 3628 case GL_UNSIGNED_INT_2_10_10_10_REV: 3629 if (!intFormat) { 3630 rs = 1.0F / 1023.0F; 3631 gs = 1.0F / 1023.0F; 3632 bs = 1.0F / 1023.0F; 3633 as = 1.0F / 3.0F; 3634 } 3635 if (swapBytes) { 3636 const GLuint *uisrc = (const GLuint *) src; 3637 GLuint i; 3638 for (i = 0; i < n; i ++) { 3639 GLuint p = uisrc[i]; 3640 SWAP4BYTE(p); 3641 rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3642 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3643 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3644 rgba[i][aDst] = ((p >> 30) ) * as; 3645 } 3646 } 3647 else { 3648 const GLuint *uisrc = (const GLuint *) src; 3649 GLuint i; 3650 for (i = 0; i < n; i ++) { 3651 GLuint p = uisrc[i]; 3652 rgba[i][rDst] = ((p ) & 0x3ff) * rs; 3653 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 3654 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 3655 rgba[i][aDst] = ((p >> 30) ) * as; 3656 } 3657 } 3658 break; 3659 case GL_UNSIGNED_INT_5_9_9_9_REV: 3660 if (swapBytes) { 3661 const GLuint *uisrc = (const GLuint *) src; 3662 GLuint i; 3663 GLfloat f[3]; 3664 for (i = 0; i < n; i ++) { 3665 GLuint p = uisrc[i]; 3666 SWAP4BYTE(p); 3667 rgb9e5_to_float3(p, f); 3668 rgba[i][rDst] = f[0]; 3669 rgba[i][gDst] = f[1]; 3670 rgba[i][bDst] = f[2]; 3671 rgba[i][aDst] = 1.0F; 3672 } 3673 } 3674 else { 3675 const GLuint *uisrc = (const GLuint *) src; 3676 GLuint i; 3677 GLfloat f[3]; 3678 for (i = 0; i < n; i ++) { 3679 rgb9e5_to_float3(uisrc[i], f); 3680 rgba[i][rDst] = f[0]; 3681 rgba[i][gDst] = f[1]; 3682 rgba[i][bDst] = f[2]; 3683 rgba[i][aDst] = 1.0F; 3684 } 3685 } 3686 break; 3687 case GL_UNSIGNED_INT_10F_11F_11F_REV: 3688 if (swapBytes) { 3689 const GLuint *uisrc = (const GLuint *) src; 3690 GLuint i; 3691 GLfloat f[3]; 3692 for (i = 0; i < n; i ++) { 3693 GLuint p = uisrc[i]; 3694 SWAP4BYTE(p); 3695 r11g11b10f_to_float3(p, f); 3696 rgba[i][rDst] = f[0]; 3697 rgba[i][gDst] = f[1]; 3698 rgba[i][bDst] = f[2]; 3699 rgba[i][aDst] = 1.0F; 3700 } 3701 } 3702 else { 3703 const GLuint *uisrc = (const GLuint *) src; 3704 GLuint i; 3705 GLfloat f[3]; 3706 for (i = 0; i < n; i ++) { 3707 r11g11b10f_to_float3(uisrc[i], f); 3708 rgba[i][rDst] = f[0]; 3709 rgba[i][gDst] = f[1]; 3710 rgba[i][bDst] = f[2]; 3711 rgba[i][aDst] = 1.0F; 3712 } 3713 } 3714 break; 3715 default: 3716 _mesa_problem(NULL, "bad srcType in extract float data"); 3717 break; 3718 } 3719 #undef PROCESS 3720 } 3721 3722 3723 static inline GLuint 3724 clamp_float_to_uint(GLfloat f) 3725 { 3726 return f < 0.0F ? 0 : F_TO_I(f); 3727 } 3728 3729 3730 static inline GLuint 3731 clamp_half_to_uint(GLhalfARB h) 3732 { 3733 GLfloat f = _mesa_half_to_float(h); 3734 return f < 0.0F ? 0 : F_TO_I(f); 3735 } 3736 3737 3738 /** 3739 * \sa extract_float_rgba() 3740 */ 3741 static void 3742 extract_uint_rgba(GLuint n, GLuint rgba[][4], 3743 GLenum srcFormat, GLenum srcType, const GLvoid *src, 3744 GLboolean swapBytes) 3745 { 3746 GLint rSrc, gSrc, bSrc, aSrc; 3747 GLint stride; 3748 GLint rDst, bDst, gDst, aDst; 3749 3750 ASSERT(srcFormat == GL_RED || 3751 srcFormat == GL_GREEN || 3752 srcFormat == GL_BLUE || 3753 srcFormat == GL_ALPHA || 3754 srcFormat == GL_LUMINANCE || 3755 srcFormat == GL_LUMINANCE_ALPHA || 3756 srcFormat == GL_INTENSITY || 3757 srcFormat == GL_RG || 3758 srcFormat == GL_RGB || 3759 srcFormat == GL_BGR || 3760 srcFormat == GL_RGBA || 3761 srcFormat == GL_BGRA || 3762 srcFormat == GL_ABGR_EXT || 3763 srcFormat == GL_DU8DV8_ATI || 3764 srcFormat == GL_DUDV_ATI || 3765 srcFormat == GL_RED_INTEGER_EXT || 3766 srcFormat == GL_RG_INTEGER || 3767 srcFormat == GL_GREEN_INTEGER_EXT || 3768 srcFormat == GL_BLUE_INTEGER_EXT || 3769 srcFormat == GL_ALPHA_INTEGER_EXT || 3770 srcFormat == GL_RGB_INTEGER_EXT || 3771 srcFormat == GL_RGBA_INTEGER_EXT || 3772 srcFormat == GL_BGR_INTEGER_EXT || 3773 srcFormat == GL_BGRA_INTEGER_EXT || 3774 srcFormat == GL_LUMINANCE_INTEGER_EXT || 3775 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 3776 3777 ASSERT(srcType == GL_UNSIGNED_BYTE || 3778 srcType == GL_BYTE || 3779 srcType == GL_UNSIGNED_SHORT || 3780 srcType == GL_SHORT || 3781 srcType == GL_UNSIGNED_INT || 3782 srcType == GL_INT || 3783 srcType == GL_HALF_FLOAT_ARB || 3784 srcType == GL_FLOAT || 3785 srcType == GL_UNSIGNED_BYTE_3_3_2 || 3786 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 3787 srcType == GL_UNSIGNED_SHORT_5_6_5 || 3788 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 3789 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 3790 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 3791 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 3792 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 3793 srcType == GL_UNSIGNED_INT_8_8_8_8 || 3794 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 3795 srcType == GL_UNSIGNED_INT_10_10_10_2 || 3796 srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 3797 srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 3798 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 3799 3800 get_component_mapping(srcFormat, 3801 &rSrc, &gSrc, &bSrc, &aSrc, 3802 &rDst, &gDst, &bDst, &aDst); 3803 3804 stride = _mesa_components_in_format(srcFormat); 3805 3806 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \ 3807 if ((SRC_INDEX) < 0) { \ 3808 GLuint i; \ 3809 for (i = 0; i < n; i++) { \ 3810 rgba[i][DST_INDEX] = DEFAULT; \ 3811 } \ 3812 } \ 3813 else if (swapBytes) { \ 3814 const TYPE *s = (const TYPE *) src; \ 3815 GLuint i; \ 3816 for (i = 0; i < n; i++) { \ 3817 TYPE value = s[SRC_INDEX]; \ 3818 if (sizeof(TYPE) == 2) { \ 3819 SWAP2BYTE(value); \ 3820 } \ 3821 else if (sizeof(TYPE) == 4) { \ 3822 SWAP4BYTE(value); \ 3823 } \ 3824 rgba[i][DST_INDEX] = CONVERSION(value); \ 3825 s += stride; \ 3826 } \ 3827 } \ 3828 else { \ 3829 const TYPE *s = (const TYPE *) src; \ 3830 GLuint i; \ 3831 for (i = 0; i < n; i++) { \ 3832 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \ 3833 s += stride; \ 3834 } \ 3835 } 3836 3837 switch (srcType) { 3838 case GL_UNSIGNED_BYTE: 3839 PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint)); 3840 PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint)); 3841 PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint)); 3842 PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); 3843 break; 3844 case GL_BYTE: 3845 PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint)); 3846 PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint)); 3847 PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint)); 3848 PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint)); 3849 break; 3850 case GL_UNSIGNED_SHORT: 3851 PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); 3852 PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint)); 3853 PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint)); 3854 PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); 3855 break; 3856 case GL_SHORT: 3857 PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint)); 3858 PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint)); 3859 PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint)); 3860 PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint)); 3861 break; 3862 case GL_UNSIGNED_INT: 3863 PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); 3864 PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint)); 3865 PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint)); 3866 PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); 3867 break; 3868 case GL_INT: 3869 PROCESS(rSrc, RCOMP, 0, GLint, (GLuint)); 3870 PROCESS(gSrc, GCOMP, 0, GLint, (GLuint)); 3871 PROCESS(bSrc, BCOMP, 0, GLint, (GLuint)); 3872 PROCESS(aSrc, ACOMP, 1, GLint, (GLuint)); 3873 break; 3874 case GL_FLOAT: 3875 PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); 3876 PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint); 3877 PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint); 3878 PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint); 3879 break; 3880 case GL_HALF_FLOAT_ARB: 3881 PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint); 3882 PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint); 3883 PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint); 3884 PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint); 3885 break; 3886 case GL_UNSIGNED_BYTE_3_3_2: 3887 { 3888 const GLubyte *ubsrc = (const GLubyte *) src; 3889 GLuint i; 3890 for (i = 0; i < n; i ++) { 3891 GLubyte p = ubsrc[i]; 3892 rgba[i][rDst] = ((p >> 5) ); 3893 rgba[i][gDst] = ((p >> 2) & 0x7); 3894 rgba[i][bDst] = ((p ) & 0x3); 3895 rgba[i][aDst] = 1; 3896 } 3897 } 3898 break; 3899 case GL_UNSIGNED_BYTE_2_3_3_REV: 3900 { 3901 const GLubyte *ubsrc = (const GLubyte *) src; 3902 GLuint i; 3903 for (i = 0; i < n; i ++) { 3904 GLubyte p = ubsrc[i]; 3905 rgba[i][rDst] = ((p ) & 0x7); 3906 rgba[i][gDst] = ((p >> 3) & 0x7); 3907 rgba[i][bDst] = ((p >> 6) ); 3908 rgba[i][aDst] = 1; 3909 } 3910 } 3911 break; 3912 case GL_UNSIGNED_SHORT_5_6_5: 3913 if (swapBytes) { 3914 const GLushort *ussrc = (const GLushort *) src; 3915 GLuint i; 3916 for (i = 0; i < n; i ++) { 3917 GLushort p = ussrc[i]; 3918 SWAP2BYTE(p); 3919 rgba[i][rDst] = ((p >> 11) ); 3920 rgba[i][gDst] = ((p >> 5) & 0x3f); 3921 rgba[i][bDst] = ((p ) & 0x1f); 3922 rgba[i][aDst] = 1; 3923 } 3924 } 3925 else { 3926 const GLushort *ussrc = (const GLushort *) src; 3927 GLuint i; 3928 for (i = 0; i < n; i ++) { 3929 GLushort p = ussrc[i]; 3930 rgba[i][rDst] = ((p >> 11) ); 3931 rgba[i][gDst] = ((p >> 5) & 0x3f); 3932 rgba[i][bDst] = ((p ) & 0x1f); 3933 rgba[i][aDst] = 1; 3934 } 3935 } 3936 break; 3937 case GL_UNSIGNED_SHORT_5_6_5_REV: 3938 if (swapBytes) { 3939 const GLushort *ussrc = (const GLushort *) src; 3940 GLuint i; 3941 for (i = 0; i < n; i ++) { 3942 GLushort p = ussrc[i]; 3943 SWAP2BYTE(p); 3944 rgba[i][rDst] = ((p ) & 0x1f); 3945 rgba[i][gDst] = ((p >> 5) & 0x3f); 3946 rgba[i][bDst] = ((p >> 11) ); 3947 rgba[i][aDst] = 1; 3948 } 3949 } 3950 else { 3951 const GLushort *ussrc = (const GLushort *) src; 3952 GLuint i; 3953 for (i = 0; i < n; i ++) { 3954 GLushort p = ussrc[i]; 3955 rgba[i][rDst] = ((p ) & 0x1f); 3956 rgba[i][gDst] = ((p >> 5) & 0x3f); 3957 rgba[i][bDst] = ((p >> 11) ); 3958 rgba[i][aDst] = 1; 3959 } 3960 } 3961 break; 3962 case GL_UNSIGNED_SHORT_4_4_4_4: 3963 if (swapBytes) { 3964 const GLushort *ussrc = (const GLushort *) src; 3965 GLuint i; 3966 for (i = 0; i < n; i ++) { 3967 GLushort p = ussrc[i]; 3968 SWAP2BYTE(p); 3969 rgba[i][rDst] = ((p >> 12) ); 3970 rgba[i][gDst] = ((p >> 8) & 0xf); 3971 rgba[i][bDst] = ((p >> 4) & 0xf); 3972 rgba[i][aDst] = ((p ) & 0xf); 3973 } 3974 } 3975 else { 3976 const GLushort *ussrc = (const GLushort *) src; 3977 GLuint i; 3978 for (i = 0; i < n; i ++) { 3979 GLushort p = ussrc[i]; 3980 rgba[i][rDst] = ((p >> 12) ); 3981 rgba[i][gDst] = ((p >> 8) & 0xf); 3982 rgba[i][bDst] = ((p >> 4) & 0xf); 3983 rgba[i][aDst] = ((p ) & 0xf); 3984 } 3985 } 3986 break; 3987 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3988 if (swapBytes) { 3989 const GLushort *ussrc = (const GLushort *) src; 3990 GLuint i; 3991 for (i = 0; i < n; i ++) { 3992 GLushort p = ussrc[i]; 3993 SWAP2BYTE(p); 3994 rgba[i][rDst] = ((p ) & 0xf); 3995 rgba[i][gDst] = ((p >> 4) & 0xf); 3996 rgba[i][bDst] = ((p >> 8) & 0xf); 3997 rgba[i][aDst] = ((p >> 12) ); 3998 } 3999 } 4000 else { 4001 const GLushort *ussrc = (const GLushort *) src; 4002 GLuint i; 4003 for (i = 0; i < n; i ++) { 4004 GLushort p = ussrc[i]; 4005 rgba[i][rDst] = ((p ) & 0xf); 4006 rgba[i][gDst] = ((p >> 4) & 0xf); 4007 rgba[i][bDst] = ((p >> 8) & 0xf); 4008 rgba[i][aDst] = ((p >> 12) ); 4009 } 4010 } 4011 break; 4012 case GL_UNSIGNED_SHORT_5_5_5_1: 4013 if (swapBytes) { 4014 const GLushort *ussrc = (const GLushort *) src; 4015 GLuint i; 4016 for (i = 0; i < n; i ++) { 4017 GLushort p = ussrc[i]; 4018 SWAP2BYTE(p); 4019 rgba[i][rDst] = ((p >> 11) ); 4020 rgba[i][gDst] = ((p >> 6) & 0x1f); 4021 rgba[i][bDst] = ((p >> 1) & 0x1f); 4022 rgba[i][aDst] = ((p ) & 0x1 ); 4023 } 4024 } 4025 else { 4026 const GLushort *ussrc = (const GLushort *) src; 4027 GLuint i; 4028 for (i = 0; i < n; i ++) { 4029 GLushort p = ussrc[i]; 4030 rgba[i][rDst] = ((p >> 11) ); 4031 rgba[i][gDst] = ((p >> 6) & 0x1f); 4032 rgba[i][bDst] = ((p >> 1) & 0x1f); 4033 rgba[i][aDst] = ((p ) & 0x1 ); 4034 } 4035 } 4036 break; 4037 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 4038 if (swapBytes) { 4039 const GLushort *ussrc = (const GLushort *) src; 4040 GLuint i; 4041 for (i = 0; i < n; i ++) { 4042 GLushort p = ussrc[i]; 4043 SWAP2BYTE(p); 4044 rgba[i][rDst] = ((p ) & 0x1f); 4045 rgba[i][gDst] = ((p >> 5) & 0x1f); 4046 rgba[i][bDst] = ((p >> 10) & 0x1f); 4047 rgba[i][aDst] = ((p >> 15) ); 4048 } 4049 } 4050 else { 4051 const GLushort *ussrc = (const GLushort *) src; 4052 GLuint i; 4053 for (i = 0; i < n; i ++) { 4054 GLushort p = ussrc[i]; 4055 rgba[i][rDst] = ((p ) & 0x1f); 4056 rgba[i][gDst] = ((p >> 5) & 0x1f); 4057 rgba[i][bDst] = ((p >> 10) & 0x1f); 4058 rgba[i][aDst] = ((p >> 15) ); 4059 } 4060 } 4061 break; 4062 case GL_UNSIGNED_INT_8_8_8_8: 4063 if (swapBytes) { 4064 const GLuint *uisrc = (const GLuint *) src; 4065 GLuint i; 4066 for (i = 0; i < n; i ++) { 4067 GLuint p = uisrc[i]; 4068 rgba[i][rDst] = ((p ) & 0xff); 4069 rgba[i][gDst] = ((p >> 8) & 0xff); 4070 rgba[i][bDst] = ((p >> 16) & 0xff); 4071 rgba[i][aDst] = ((p >> 24) ); 4072 } 4073 } 4074 else { 4075 const GLuint *uisrc = (const GLuint *) src; 4076 GLuint i; 4077 for (i = 0; i < n; i ++) { 4078 GLuint p = uisrc[i]; 4079 rgba[i][rDst] = ((p >> 24) ); 4080 rgba[i][gDst] = ((p >> 16) & 0xff); 4081 rgba[i][bDst] = ((p >> 8) & 0xff); 4082 rgba[i][aDst] = ((p ) & 0xff); 4083 } 4084 } 4085 break; 4086 case GL_UNSIGNED_INT_8_8_8_8_REV: 4087 if (swapBytes) { 4088 const GLuint *uisrc = (const GLuint *) src; 4089 GLuint i; 4090 for (i = 0; i < n; i ++) { 4091 GLuint p = uisrc[i]; 4092 rgba[i][rDst] = ((p >> 24) ); 4093 rgba[i][gDst] = ((p >> 16) & 0xff); 4094 rgba[i][bDst] = ((p >> 8) & 0xff); 4095 rgba[i][aDst] = ((p ) & 0xff); 4096 } 4097 } 4098 else { 4099 const GLuint *uisrc = (const GLuint *) src; 4100 GLuint i; 4101 for (i = 0; i < n; i ++) { 4102 GLuint p = uisrc[i]; 4103 rgba[i][rDst] = ((p ) & 0xff); 4104 rgba[i][gDst] = ((p >> 8) & 0xff); 4105 rgba[i][bDst] = ((p >> 16) & 0xff); 4106 rgba[i][aDst] = ((p >> 24) ); 4107 } 4108 } 4109 break; 4110 case GL_UNSIGNED_INT_10_10_10_2: 4111 if (swapBytes) { 4112 const GLuint *uisrc = (const GLuint *) src; 4113 GLuint i; 4114 for (i = 0; i < n; i ++) { 4115 GLuint p = uisrc[i]; 4116 SWAP4BYTE(p); 4117 rgba[i][rDst] = ((p >> 22) ); 4118 rgba[i][gDst] = ((p >> 12) & 0x3ff); 4119 rgba[i][bDst] = ((p >> 2) & 0x3ff); 4120 rgba[i][aDst] = ((p ) & 0x3 ); 4121 } 4122 } 4123 else { 4124 const GLuint *uisrc = (const GLuint *) src; 4125 GLuint i; 4126 for (i = 0; i < n; i ++) { 4127 GLuint p = uisrc[i]; 4128 rgba[i][rDst] = ((p >> 22) ); 4129 rgba[i][gDst] = ((p >> 12) & 0x3ff); 4130 rgba[i][bDst] = ((p >> 2) & 0x3ff); 4131 rgba[i][aDst] = ((p ) & 0x3 ); 4132 } 4133 } 4134 break; 4135 case GL_UNSIGNED_INT_2_10_10_10_REV: 4136 if (swapBytes) { 4137 const GLuint *uisrc = (const GLuint *) src; 4138 GLuint i; 4139 for (i = 0; i < n; i ++) { 4140 GLuint p = uisrc[i]; 4141 SWAP4BYTE(p); 4142 rgba[i][rDst] = ((p ) & 0x3ff); 4143 rgba[i][gDst] = ((p >> 10) & 0x3ff); 4144 rgba[i][bDst] = ((p >> 20) & 0x3ff); 4145 rgba[i][aDst] = ((p >> 30) ); 4146 } 4147 } 4148 else { 4149 const GLuint *uisrc = (const GLuint *) src; 4150 GLuint i; 4151 for (i = 0; i < n; i ++) { 4152 GLuint p = uisrc[i]; 4153 rgba[i][rDst] = ((p ) & 0x3ff); 4154 rgba[i][gDst] = ((p >> 10) & 0x3ff); 4155 rgba[i][bDst] = ((p >> 20) & 0x3ff); 4156 rgba[i][aDst] = ((p >> 30) ); 4157 } 4158 } 4159 break; 4160 case GL_UNSIGNED_INT_5_9_9_9_REV: 4161 if (swapBytes) { 4162 const GLuint *uisrc = (const GLuint *) src; 4163 GLuint i; 4164 float f[3]; 4165 for (i = 0; i < n; i ++) { 4166 GLuint p = uisrc[i]; 4167 SWAP4BYTE(p); 4168 rgb9e5_to_float3(p, f); 4169 rgba[i][rDst] = clamp_float_to_uint(f[0]); 4170 rgba[i][gDst] = clamp_float_to_uint(f[1]); 4171 rgba[i][bDst] = clamp_float_to_uint(f[2]); 4172 rgba[i][aDst] = 1; 4173 } 4174 } 4175 else { 4176 const GLuint *uisrc = (const GLuint *) src; 4177 GLuint i; 4178 float f[3]; 4179 for (i = 0; i < n; i ++) { 4180 GLuint p = uisrc[i]; 4181 rgb9e5_to_float3(p, f); 4182 rgba[i][rDst] = clamp_float_to_uint(f[0]); 4183 rgba[i][gDst] = clamp_float_to_uint(f[1]); 4184 rgba[i][bDst] = clamp_float_to_uint(f[2]); 4185 rgba[i][aDst] = 1; 4186 } 4187 } 4188 break; 4189 case GL_UNSIGNED_INT_10F_11F_11F_REV: 4190 if (swapBytes) { 4191 const GLuint *uisrc = (const GLuint *) src; 4192 GLuint i; 4193 float f[3]; 4194 for (i = 0; i < n; i ++) { 4195 GLuint p = uisrc[i]; 4196 SWAP4BYTE(p); 4197 r11g11b10f_to_float3(p, f); 4198 rgba[i][rDst] = clamp_float_to_uint(f[0]); 4199 rgba[i][gDst] = clamp_float_to_uint(f[1]); 4200 rgba[i][bDst] = clamp_float_to_uint(f[2]); 4201 rgba[i][aDst] = 1; 4202 } 4203 } 4204 else { 4205 const GLuint *uisrc = (const GLuint *) src; 4206 GLuint i; 4207 float f[3]; 4208 for (i = 0; i < n; i ++) { 4209 GLuint p = uisrc[i]; 4210 r11g11b10f_to_float3(p, f); 4211 rgba[i][rDst] = clamp_float_to_uint(f[0]); 4212 rgba[i][gDst] = clamp_float_to_uint(f[1]); 4213 rgba[i][bDst] = clamp_float_to_uint(f[2]); 4214 rgba[i][aDst] = 1; 4215 } 4216 } 4217 break; 4218 default: 4219 _mesa_problem(NULL, "bad srcType in extract uint data"); 4220 break; 4221 } 4222 #undef PROCESS 4223 } 4224 4225 4226 4227 /* 4228 * Unpack a row of color image data from a client buffer according to 4229 * the pixel unpacking parameters. 4230 * Return GLubyte values in the specified dest image format. 4231 * This is used by glDrawPixels and glTexImage?D(). 4232 * \param ctx - the context 4233 * n - number of pixels in the span 4234 * dstFormat - format of destination color array 4235 * dest - the destination color array 4236 * srcFormat - source image format 4237 * srcType - source image data type 4238 * source - source image pointer 4239 * srcPacking - pixel unpacking parameters 4240 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 4241 * 4242 * XXX perhaps expand this to process whole images someday. 4243 */ 4244 void 4245 _mesa_unpack_color_span_ubyte(struct gl_context *ctx, 4246 GLuint n, GLenum dstFormat, GLubyte dest[], 4247 GLenum srcFormat, GLenum srcType, 4248 const GLvoid *source, 4249 const struct gl_pixelstore_attrib *srcPacking, 4250 GLbitfield transferOps ) 4251 { 4252 GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4253 ASSERT(dstFormat == GL_ALPHA || 4254 dstFormat == GL_LUMINANCE || 4255 dstFormat == GL_LUMINANCE_ALPHA || 4256 dstFormat == GL_INTENSITY || 4257 dstFormat == GL_RED || 4258 dstFormat == GL_RG || 4259 dstFormat == GL_RGB || 4260 dstFormat == GL_RGBA); 4261 4262 ASSERT(srcFormat == GL_RED || 4263 srcFormat == GL_GREEN || 4264 srcFormat == GL_BLUE || 4265 srcFormat == GL_ALPHA || 4266 srcFormat == GL_LUMINANCE || 4267 srcFormat == GL_LUMINANCE_ALPHA || 4268 srcFormat == GL_INTENSITY || 4269 srcFormat == GL_RG || 4270 srcFormat == GL_RGB || 4271 srcFormat == GL_BGR || 4272 srcFormat == GL_RGBA || 4273 srcFormat == GL_BGRA || 4274 srcFormat == GL_ABGR_EXT || 4275 srcFormat == GL_COLOR_INDEX); 4276 4277 ASSERT(srcType == GL_BITMAP || 4278 srcType == GL_UNSIGNED_BYTE || 4279 srcType == GL_BYTE || 4280 srcType == GL_UNSIGNED_SHORT || 4281 srcType == GL_SHORT || 4282 srcType == GL_UNSIGNED_INT || 4283 srcType == GL_INT || 4284 srcType == GL_HALF_FLOAT_ARB || 4285 srcType == GL_FLOAT || 4286 srcType == GL_UNSIGNED_BYTE_3_3_2 || 4287 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4288 srcType == GL_UNSIGNED_SHORT_5_6_5 || 4289 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4290 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4291 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4292 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4293 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4294 srcType == GL_UNSIGNED_INT_8_8_8_8 || 4295 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4296 srcType == GL_UNSIGNED_INT_10_10_10_2 || 4297 srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4298 srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4299 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4300 4301 /* EXT_texture_integer specifies no transfer ops on integer 4302 * types in the resolved issues section. Just set them to 0 4303 * for integer surfaces. 4304 */ 4305 if (intFormat) 4306 transferOps = 0; 4307 4308 /* Try simple cases first */ 4309 if (transferOps == 0) { 4310 if (srcType == GL_UNSIGNED_BYTE) { 4311 if (dstFormat == GL_RGBA) { 4312 if (srcFormat == GL_RGBA) { 4313 memcpy( dest, source, n * 4 * sizeof(GLubyte) ); 4314 return; 4315 } 4316 else if (srcFormat == GL_RGB) { 4317 GLuint i; 4318 const GLubyte *src = (const GLubyte *) source; 4319 GLubyte *dst = dest; 4320 for (i = 0; i < n; i++) { 4321 dst[0] = src[0]; 4322 dst[1] = src[1]; 4323 dst[2] = src[2]; 4324 dst[3] = 255; 4325 src += 3; 4326 dst += 4; 4327 } 4328 return; 4329 } 4330 } 4331 else if (dstFormat == GL_RGB) { 4332 if (srcFormat == GL_RGB) { 4333 memcpy( dest, source, n * 3 * sizeof(GLubyte) ); 4334 return; 4335 } 4336 else if (srcFormat == GL_RGBA) { 4337 GLuint i; 4338 const GLubyte *src = (const GLubyte *) source; 4339 GLubyte *dst = dest; 4340 for (i = 0; i < n; i++) { 4341 dst[0] = src[0]; 4342 dst[1] = src[1]; 4343 dst[2] = src[2]; 4344 src += 4; 4345 dst += 3; 4346 } 4347 return; 4348 } 4349 } 4350 else if (dstFormat == srcFormat) { 4351 GLint comps = _mesa_components_in_format(srcFormat); 4352 assert(comps > 0); 4353 memcpy( dest, source, n * comps * sizeof(GLubyte) ); 4354 return; 4355 } 4356 } 4357 } 4358 4359 4360 /* general solution begins here */ 4361 { 4362 GLint dstComponents; 4363 GLint rDst, gDst, bDst, aDst, lDst, iDst; 4364 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4365 4366 if (!rgba) { 4367 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4368 return; 4369 } 4370 4371 dstComponents = _mesa_components_in_format( dstFormat ); 4372 /* source & dest image formats should have been error checked by now */ 4373 assert(dstComponents > 0); 4374 4375 /* 4376 * Extract image data and convert to RGBA floats 4377 */ 4378 if (srcFormat == GL_COLOR_INDEX) { 4379 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4380 4381 if (!indexes) { 4382 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4383 free(rgba); 4384 return; 4385 } 4386 4387 extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4388 srcPacking); 4389 4390 /* Convert indexes to RGBA */ 4391 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4392 _mesa_shift_and_offset_ci(ctx, n, indexes); 4393 } 4394 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4395 4396 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4397 * with color indexes. 4398 */ 4399 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4400 4401 free(indexes); 4402 } 4403 else { 4404 /* non-color index data */ 4405 extract_float_rgba(n, rgba, srcFormat, srcType, source, 4406 srcPacking->SwapBytes); 4407 } 4408 4409 /* Need to clamp if returning GLubytes */ 4410 transferOps |= IMAGE_CLAMP_BIT; 4411 4412 if (transferOps) { 4413 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4414 } 4415 4416 get_component_indexes(dstFormat, 4417 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4418 4419 /* Now return the GLubyte data in the requested dstFormat */ 4420 if (rDst >= 0) { 4421 GLubyte *dst = dest; 4422 GLuint i; 4423 for (i = 0; i < n; i++) { 4424 CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]); 4425 dst += dstComponents; 4426 } 4427 } 4428 4429 if (gDst >= 0) { 4430 GLubyte *dst = dest; 4431 GLuint i; 4432 for (i = 0; i < n; i++) { 4433 CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]); 4434 dst += dstComponents; 4435 } 4436 } 4437 4438 if (bDst >= 0) { 4439 GLubyte *dst = dest; 4440 GLuint i; 4441 for (i = 0; i < n; i++) { 4442 CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]); 4443 dst += dstComponents; 4444 } 4445 } 4446 4447 if (aDst >= 0) { 4448 GLubyte *dst = dest; 4449 GLuint i; 4450 for (i = 0; i < n; i++) { 4451 CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]); 4452 dst += dstComponents; 4453 } 4454 } 4455 4456 if (iDst >= 0) { 4457 GLubyte *dst = dest; 4458 GLuint i; 4459 assert(iDst == 0); 4460 assert(dstComponents == 1); 4461 for (i = 0; i < n; i++) { 4462 /* Intensity comes from red channel */ 4463 CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]); 4464 } 4465 } 4466 4467 if (lDst >= 0) { 4468 GLubyte *dst = dest; 4469 GLuint i; 4470 assert(lDst == 0); 4471 for (i = 0; i < n; i++) { 4472 /* Luminance comes from red channel */ 4473 CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]); 4474 dst += dstComponents; 4475 } 4476 } 4477 4478 free(rgba); 4479 } 4480 } 4481 4482 4483 /** 4484 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data 4485 * instead of GLubyte. 4486 */ 4487 void 4488 _mesa_unpack_color_span_float( struct gl_context *ctx, 4489 GLuint n, GLenum dstFormat, GLfloat dest[], 4490 GLenum srcFormat, GLenum srcType, 4491 const GLvoid *source, 4492 const struct gl_pixelstore_attrib *srcPacking, 4493 GLbitfield transferOps ) 4494 { 4495 ASSERT(dstFormat == GL_ALPHA || 4496 dstFormat == GL_LUMINANCE || 4497 dstFormat == GL_LUMINANCE_ALPHA || 4498 dstFormat == GL_INTENSITY || 4499 dstFormat == GL_RED || 4500 dstFormat == GL_RG || 4501 dstFormat == GL_RGB || 4502 dstFormat == GL_RGBA); 4503 4504 ASSERT(srcFormat == GL_RED || 4505 srcFormat == GL_GREEN || 4506 srcFormat == GL_BLUE || 4507 srcFormat == GL_ALPHA || 4508 srcFormat == GL_LUMINANCE || 4509 srcFormat == GL_LUMINANCE_ALPHA || 4510 srcFormat == GL_INTENSITY || 4511 srcFormat == GL_RG || 4512 srcFormat == GL_RGB || 4513 srcFormat == GL_BGR || 4514 srcFormat == GL_RGBA || 4515 srcFormat == GL_BGRA || 4516 srcFormat == GL_ABGR_EXT || 4517 srcFormat == GL_RED_INTEGER_EXT || 4518 srcFormat == GL_GREEN_INTEGER_EXT || 4519 srcFormat == GL_BLUE_INTEGER_EXT || 4520 srcFormat == GL_ALPHA_INTEGER_EXT || 4521 srcFormat == GL_RG_INTEGER || 4522 srcFormat == GL_RGB_INTEGER_EXT || 4523 srcFormat == GL_RGBA_INTEGER_EXT || 4524 srcFormat == GL_BGR_INTEGER_EXT || 4525 srcFormat == GL_BGRA_INTEGER_EXT || 4526 srcFormat == GL_LUMINANCE_INTEGER_EXT || 4527 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT || 4528 srcFormat == GL_COLOR_INDEX); 4529 4530 ASSERT(srcType == GL_BITMAP || 4531 srcType == GL_UNSIGNED_BYTE || 4532 srcType == GL_BYTE || 4533 srcType == GL_UNSIGNED_SHORT || 4534 srcType == GL_SHORT || 4535 srcType == GL_UNSIGNED_INT || 4536 srcType == GL_INT || 4537 srcType == GL_HALF_FLOAT_ARB || 4538 srcType == GL_FLOAT || 4539 srcType == GL_UNSIGNED_BYTE_3_3_2 || 4540 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4541 srcType == GL_UNSIGNED_SHORT_5_6_5 || 4542 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4543 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4544 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4545 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4546 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4547 srcType == GL_UNSIGNED_INT_8_8_8_8 || 4548 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4549 srcType == GL_UNSIGNED_INT_10_10_10_2 || 4550 srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4551 srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4552 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4553 4554 /* general solution, no special cases, yet */ 4555 { 4556 GLint dstComponents; 4557 GLint rDst, gDst, bDst, aDst, lDst, iDst; 4558 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4559 GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); 4560 4561 if (!rgba) { 4562 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4563 return; 4564 } 4565 4566 dstComponents = _mesa_components_in_format( dstFormat ); 4567 /* source & dest image formats should have been error checked by now */ 4568 assert(dstComponents > 0); 4569 4570 /* EXT_texture_integer specifies no transfer ops on integer 4571 * types in the resolved issues section. Just set them to 0 4572 * for integer surfaces. 4573 */ 4574 if (intFormat) 4575 transferOps = 0; 4576 4577 /* 4578 * Extract image data and convert to RGBA floats 4579 */ 4580 if (srcFormat == GL_COLOR_INDEX) { 4581 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4582 4583 if (!indexes) { 4584 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4585 free(rgba); 4586 return; 4587 } 4588 4589 extract_uint_indexes(n, indexes, srcFormat, srcType, source, 4590 srcPacking); 4591 4592 /* Convert indexes to RGBA */ 4593 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 4594 _mesa_shift_and_offset_ci(ctx, n, indexes); 4595 } 4596 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 4597 4598 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 4599 * with color indexes. 4600 */ 4601 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 4602 4603 free(indexes); 4604 } 4605 else { 4606 /* non-color index data */ 4607 extract_float_rgba(n, rgba, srcFormat, srcType, source, 4608 srcPacking->SwapBytes); 4609 } 4610 4611 if (transferOps) { 4612 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 4613 } 4614 4615 get_component_indexes(dstFormat, 4616 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4617 4618 /* Now pack results in the requested dstFormat */ 4619 if (rDst >= 0) { 4620 GLfloat *dst = dest; 4621 GLuint i; 4622 for (i = 0; i < n; i++) { 4623 dst[rDst] = rgba[i][RCOMP]; 4624 dst += dstComponents; 4625 } 4626 } 4627 4628 if (gDst >= 0) { 4629 GLfloat *dst = dest; 4630 GLuint i; 4631 for (i = 0; i < n; i++) { 4632 dst[gDst] = rgba[i][GCOMP]; 4633 dst += dstComponents; 4634 } 4635 } 4636 4637 if (bDst >= 0) { 4638 GLfloat *dst = dest; 4639 GLuint i; 4640 for (i = 0; i < n; i++) { 4641 dst[bDst] = rgba[i][BCOMP]; 4642 dst += dstComponents; 4643 } 4644 } 4645 4646 if (aDst >= 0) { 4647 GLfloat *dst = dest; 4648 GLuint i; 4649 for (i = 0; i < n; i++) { 4650 dst[aDst] = rgba[i][ACOMP]; 4651 dst += dstComponents; 4652 } 4653 } 4654 4655 if (iDst >= 0) { 4656 GLfloat *dst = dest; 4657 GLuint i; 4658 assert(iDst == 0); 4659 assert(dstComponents == 1); 4660 for (i = 0; i < n; i++) { 4661 /* Intensity comes from red channel */ 4662 dst[i] = rgba[i][RCOMP]; 4663 } 4664 } 4665 4666 if (lDst >= 0) { 4667 GLfloat *dst = dest; 4668 GLuint i; 4669 assert(lDst == 0); 4670 for (i = 0; i < n; i++) { 4671 /* Luminance comes from red channel */ 4672 dst[0] = rgba[i][RCOMP]; 4673 dst += dstComponents; 4674 } 4675 } 4676 4677 free(rgba); 4678 } 4679 } 4680 4681 4682 /** 4683 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data 4684 * instead of GLubyte. 4685 * No pixel transfer ops are applied. 4686 */ 4687 void 4688 _mesa_unpack_color_span_uint(struct gl_context *ctx, 4689 GLuint n, GLenum dstFormat, GLuint *dest, 4690 GLenum srcFormat, GLenum srcType, 4691 const GLvoid *source, 4692 const struct gl_pixelstore_attrib *srcPacking) 4693 { 4694 GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat)); 4695 4696 if (!rgba) { 4697 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4698 return; 4699 } 4700 4701 ASSERT(dstFormat == GL_ALPHA || 4702 dstFormat == GL_LUMINANCE || 4703 dstFormat == GL_LUMINANCE_ALPHA || 4704 dstFormat == GL_INTENSITY || 4705 dstFormat == GL_RED || 4706 dstFormat == GL_RG || 4707 dstFormat == GL_RGB || 4708 dstFormat == GL_RGBA); 4709 4710 ASSERT(srcFormat == GL_RED || 4711 srcFormat == GL_GREEN || 4712 srcFormat == GL_BLUE || 4713 srcFormat == GL_ALPHA || 4714 srcFormat == GL_LUMINANCE || 4715 srcFormat == GL_LUMINANCE_ALPHA || 4716 srcFormat == GL_INTENSITY || 4717 srcFormat == GL_RG || 4718 srcFormat == GL_RGB || 4719 srcFormat == GL_BGR || 4720 srcFormat == GL_RGBA || 4721 srcFormat == GL_BGRA || 4722 srcFormat == GL_ABGR_EXT || 4723 srcFormat == GL_RED_INTEGER_EXT || 4724 srcFormat == GL_GREEN_INTEGER_EXT || 4725 srcFormat == GL_BLUE_INTEGER_EXT || 4726 srcFormat == GL_ALPHA_INTEGER_EXT || 4727 srcFormat == GL_RG_INTEGER || 4728 srcFormat == GL_RGB_INTEGER_EXT || 4729 srcFormat == GL_RGBA_INTEGER_EXT || 4730 srcFormat == GL_BGR_INTEGER_EXT || 4731 srcFormat == GL_BGRA_INTEGER_EXT || 4732 srcFormat == GL_LUMINANCE_INTEGER_EXT || 4733 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 4734 4735 ASSERT(srcType == GL_UNSIGNED_BYTE || 4736 srcType == GL_BYTE || 4737 srcType == GL_UNSIGNED_SHORT || 4738 srcType == GL_SHORT || 4739 srcType == GL_UNSIGNED_INT || 4740 srcType == GL_INT || 4741 srcType == GL_HALF_FLOAT_ARB || 4742 srcType == GL_FLOAT || 4743 srcType == GL_UNSIGNED_BYTE_3_3_2 || 4744 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 4745 srcType == GL_UNSIGNED_SHORT_5_6_5 || 4746 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 4747 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 4748 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 4749 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 4750 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 4751 srcType == GL_UNSIGNED_INT_8_8_8_8 || 4752 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 4753 srcType == GL_UNSIGNED_INT_10_10_10_2 || 4754 srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 4755 srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 4756 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 4757 4758 4759 /* Extract image data as uint[4] pixels */ 4760 extract_uint_rgba(n, rgba, srcFormat, srcType, source, 4761 srcPacking->SwapBytes); 4762 4763 if (dstFormat == GL_RGBA) { 4764 /* simple case */ 4765 memcpy(dest, rgba, 4 * sizeof(GLuint) * n); 4766 } 4767 else { 4768 /* general case */ 4769 GLint rDst, gDst, bDst, aDst, lDst, iDst; 4770 GLint dstComponents = _mesa_components_in_format( dstFormat ); 4771 4772 assert(dstComponents > 0); 4773 4774 get_component_indexes(dstFormat, 4775 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 4776 4777 /* Now pack values in the requested dest format */ 4778 if (rDst >= 0) { 4779 GLuint *dst = dest; 4780 GLuint i; 4781 for (i = 0; i < n; i++) { 4782 dst[rDst] = rgba[i][RCOMP]; 4783 dst += dstComponents; 4784 } 4785 } 4786 4787 if (gDst >= 0) { 4788 GLuint *dst = dest; 4789 GLuint i; 4790 for (i = 0; i < n; i++) { 4791 dst[gDst] = rgba[i][GCOMP]; 4792 dst += dstComponents; 4793 } 4794 } 4795 4796 if (bDst >= 0) { 4797 GLuint *dst = dest; 4798 GLuint i; 4799 for (i = 0; i < n; i++) { 4800 dst[bDst] = rgba[i][BCOMP]; 4801 dst += dstComponents; 4802 } 4803 } 4804 4805 if (aDst >= 0) { 4806 GLuint *dst = dest; 4807 GLuint i; 4808 for (i = 0; i < n; i++) { 4809 dst[aDst] = rgba[i][ACOMP]; 4810 dst += dstComponents; 4811 } 4812 } 4813 4814 if (iDst >= 0) { 4815 GLuint *dst = dest; 4816 GLuint i; 4817 assert(iDst == 0); 4818 assert(dstComponents == 1); 4819 for (i = 0; i < n; i++) { 4820 /* Intensity comes from red channel */ 4821 dst[i] = rgba[i][RCOMP]; 4822 } 4823 } 4824 4825 if (lDst >= 0) { 4826 GLuint *dst = dest; 4827 GLuint i; 4828 assert(lDst == 0); 4829 for (i = 0; i < n; i++) { 4830 /* Luminance comes from red channel */ 4831 dst[0] = rgba[i][RCOMP]; 4832 dst += dstComponents; 4833 } 4834 } 4835 } 4836 4837 free(rgba); 4838 } 4839 4840 4841 4842 /** 4843 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba, 4844 * directly return GLbyte data, no transfer ops apply. 4845 */ 4846 void 4847 _mesa_unpack_dudv_span_byte( struct gl_context *ctx, 4848 GLuint n, GLenum dstFormat, GLbyte dest[], 4849 GLenum srcFormat, GLenum srcType, 4850 const GLvoid *source, 4851 const struct gl_pixelstore_attrib *srcPacking, 4852 GLbitfield transferOps ) 4853 { 4854 ASSERT(dstFormat == GL_DUDV_ATI); 4855 ASSERT(srcFormat == GL_DUDV_ATI || 4856 srcFormat == GL_DU8DV8_ATI); 4857 4858 ASSERT(srcType == GL_UNSIGNED_BYTE || 4859 srcType == GL_BYTE || 4860 srcType == GL_UNSIGNED_SHORT || 4861 srcType == GL_SHORT || 4862 srcType == GL_UNSIGNED_INT || 4863 srcType == GL_INT || 4864 srcType == GL_HALF_FLOAT_ARB || 4865 srcType == GL_FLOAT); 4866 4867 /* general solution */ 4868 { 4869 GLint dstComponents; 4870 GLbyte *dst = dest; 4871 GLuint i; 4872 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 4873 4874 if (!rgba) { 4875 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4876 return; 4877 } 4878 4879 dstComponents = _mesa_components_in_format( dstFormat ); 4880 /* source & dest image formats should have been error checked by now */ 4881 assert(dstComponents > 0); 4882 4883 /* 4884 * Extract image data and convert to RGBA floats 4885 */ 4886 extract_float_rgba(n, rgba, srcFormat, srcType, source, 4887 srcPacking->SwapBytes); 4888 4889 4890 /* Now determine which color channels we need to produce. 4891 * And determine the dest index (offset) within each color tuple. 4892 */ 4893 4894 /* Now pack results in the requested dstFormat */ 4895 for (i = 0; i < n; i++) { 4896 /* not sure - need clamp[-1,1] here? */ 4897 dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 4898 dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 4899 dst += dstComponents; 4900 } 4901 4902 free(rgba); 4903 } 4904 } 4905 4906 /* 4907 * Unpack a row of color index data from a client buffer according to 4908 * the pixel unpacking parameters. 4909 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 4910 * 4911 * Args: ctx - the context 4912 * n - number of pixels 4913 * dstType - destination data type 4914 * dest - destination array 4915 * srcType - source pixel type 4916 * source - source data pointer 4917 * srcPacking - pixel unpacking parameters 4918 * transferOps - the pixel transfer operations to apply 4919 */ 4920 void 4921 _mesa_unpack_index_span( struct gl_context *ctx, GLuint n, 4922 GLenum dstType, GLvoid *dest, 4923 GLenum srcType, const GLvoid *source, 4924 const struct gl_pixelstore_attrib *srcPacking, 4925 GLbitfield transferOps ) 4926 { 4927 ASSERT(srcType == GL_BITMAP || 4928 srcType == GL_UNSIGNED_BYTE || 4929 srcType == GL_BYTE || 4930 srcType == GL_UNSIGNED_SHORT || 4931 srcType == GL_SHORT || 4932 srcType == GL_UNSIGNED_INT || 4933 srcType == GL_INT || 4934 srcType == GL_HALF_FLOAT_ARB || 4935 srcType == GL_FLOAT); 4936 4937 ASSERT(dstType == GL_UNSIGNED_BYTE || 4938 dstType == GL_UNSIGNED_SHORT || 4939 dstType == GL_UNSIGNED_INT); 4940 4941 4942 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 4943 4944 /* 4945 * Try simple cases first 4946 */ 4947 if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 4948 && dstType == GL_UNSIGNED_BYTE) { 4949 memcpy(dest, source, n * sizeof(GLubyte)); 4950 } 4951 else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 4952 && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 4953 memcpy(dest, source, n * sizeof(GLuint)); 4954 } 4955 else { 4956 /* 4957 * general solution 4958 */ 4959 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 4960 4961 if (!indexes) { 4962 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 4963 return; 4964 } 4965 4966 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 4967 srcPacking); 4968 4969 if (transferOps) 4970 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 4971 4972 /* convert to dest type */ 4973 switch (dstType) { 4974 case GL_UNSIGNED_BYTE: 4975 { 4976 GLubyte *dst = (GLubyte *) dest; 4977 GLuint i; 4978 for (i = 0; i < n; i++) { 4979 dst[i] = (GLubyte) (indexes[i] & 0xff); 4980 } 4981 } 4982 break; 4983 case GL_UNSIGNED_SHORT: 4984 { 4985 GLuint *dst = (GLuint *) dest; 4986 GLuint i; 4987 for (i = 0; i < n; i++) { 4988 dst[i] = (GLushort) (indexes[i] & 0xffff); 4989 } 4990 } 4991 break; 4992 case GL_UNSIGNED_INT: 4993 memcpy(dest, indexes, n * sizeof(GLuint)); 4994 break; 4995 default: 4996 _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 4997 } 4998 4999 free(indexes); 5000 } 5001 } 5002 5003 5004 void 5005 _mesa_pack_index_span( struct gl_context *ctx, GLuint n, 5006 GLenum dstType, GLvoid *dest, const GLuint *source, 5007 const struct gl_pixelstore_attrib *dstPacking, 5008 GLbitfield transferOps ) 5009 { 5010 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 5011 5012 if (!indexes) { 5013 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5014 return; 5015 } 5016 5017 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 5018 5019 if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 5020 /* make a copy of input */ 5021 memcpy(indexes, source, n * sizeof(GLuint)); 5022 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 5023 source = indexes; 5024 } 5025 5026 switch (dstType) { 5027 case GL_UNSIGNED_BYTE: 5028 { 5029 GLubyte *dst = (GLubyte *) dest; 5030 GLuint i; 5031 for (i = 0; i < n; i++) { 5032 *dst++ = (GLubyte) source[i]; 5033 } 5034 } 5035 break; 5036 case GL_BYTE: 5037 { 5038 GLbyte *dst = (GLbyte *) dest; 5039 GLuint i; 5040 for (i = 0; i < n; i++) { 5041 dst[i] = (GLbyte) source[i]; 5042 } 5043 } 5044 break; 5045 case GL_UNSIGNED_SHORT: 5046 { 5047 GLushort *dst = (GLushort *) dest; 5048 GLuint i; 5049 for (i = 0; i < n; i++) { 5050 dst[i] = (GLushort) source[i]; 5051 } 5052 if (dstPacking->SwapBytes) { 5053 _mesa_swap2( (GLushort *) dst, n ); 5054 } 5055 } 5056 break; 5057 case GL_SHORT: 5058 { 5059 GLshort *dst = (GLshort *) dest; 5060 GLuint i; 5061 for (i = 0; i < n; i++) { 5062 dst[i] = (GLshort) source[i]; 5063 } 5064 if (dstPacking->SwapBytes) { 5065 _mesa_swap2( (GLushort *) dst, n ); 5066 } 5067 } 5068 break; 5069 case GL_UNSIGNED_INT: 5070 { 5071 GLuint *dst = (GLuint *) dest; 5072 GLuint i; 5073 for (i = 0; i < n; i++) { 5074 dst[i] = (GLuint) source[i]; 5075 } 5076 if (dstPacking->SwapBytes) { 5077 _mesa_swap4( (GLuint *) dst, n ); 5078 } 5079 } 5080 break; 5081 case GL_INT: 5082 { 5083 GLint *dst = (GLint *) dest; 5084 GLuint i; 5085 for (i = 0; i < n; i++) { 5086 dst[i] = (GLint) source[i]; 5087 } 5088 if (dstPacking->SwapBytes) { 5089 _mesa_swap4( (GLuint *) dst, n ); 5090 } 5091 } 5092 break; 5093 case GL_FLOAT: 5094 { 5095 GLfloat *dst = (GLfloat *) dest; 5096 GLuint i; 5097 for (i = 0; i < n; i++) { 5098 dst[i] = (GLfloat) source[i]; 5099 } 5100 if (dstPacking->SwapBytes) { 5101 _mesa_swap4( (GLuint *) dst, n ); 5102 } 5103 } 5104 break; 5105 case GL_HALF_FLOAT_ARB: 5106 { 5107 GLhalfARB *dst = (GLhalfARB *) dest; 5108 GLuint i; 5109 for (i = 0; i < n; i++) { 5110 dst[i] = _mesa_float_to_half((GLfloat) source[i]); 5111 } 5112 if (dstPacking->SwapBytes) { 5113 _mesa_swap2( (GLushort *) dst, n ); 5114 } 5115 } 5116 break; 5117 default: 5118 _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 5119 } 5120 5121 free(indexes); 5122 } 5123 5124 5125 /* 5126 * Unpack a row of stencil data from a client buffer according to 5127 * the pixel unpacking parameters. 5128 * This is (or will be) used by glDrawPixels 5129 * 5130 * Args: ctx - the context 5131 * n - number of pixels 5132 * dstType - destination data type 5133 * dest - destination array 5134 * srcType - source pixel type 5135 * source - source data pointer 5136 * srcPacking - pixel unpacking parameters 5137 * transferOps - apply offset/bias/lookup ops? 5138 */ 5139 void 5140 _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, 5141 GLenum dstType, GLvoid *dest, 5142 GLenum srcType, const GLvoid *source, 5143 const struct gl_pixelstore_attrib *srcPacking, 5144 GLbitfield transferOps ) 5145 { 5146 ASSERT(srcType == GL_BITMAP || 5147 srcType == GL_UNSIGNED_BYTE || 5148 srcType == GL_BYTE || 5149 srcType == GL_UNSIGNED_SHORT || 5150 srcType == GL_SHORT || 5151 srcType == GL_UNSIGNED_INT || 5152 srcType == GL_INT || 5153 srcType == GL_UNSIGNED_INT_24_8_EXT || 5154 srcType == GL_HALF_FLOAT_ARB || 5155 srcType == GL_FLOAT || 5156 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5157 5158 ASSERT(dstType == GL_UNSIGNED_BYTE || 5159 dstType == GL_UNSIGNED_SHORT || 5160 dstType == GL_UNSIGNED_INT || 5161 dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 5162 5163 /* only shift and offset apply to stencil */ 5164 transferOps &= IMAGE_SHIFT_OFFSET_BIT; 5165 5166 /* 5167 * Try simple cases first 5168 */ 5169 if (transferOps == 0 && 5170 !ctx->Pixel.MapStencilFlag && 5171 srcType == GL_UNSIGNED_BYTE && 5172 dstType == GL_UNSIGNED_BYTE) { 5173 memcpy(dest, source, n * sizeof(GLubyte)); 5174 } 5175 else if (transferOps == 0 && 5176 !ctx->Pixel.MapStencilFlag && 5177 srcType == GL_UNSIGNED_INT && 5178 dstType == GL_UNSIGNED_INT && 5179 !srcPacking->SwapBytes) { 5180 memcpy(dest, source, n * sizeof(GLuint)); 5181 } 5182 else { 5183 /* 5184 * general solution 5185 */ 5186 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 5187 5188 if (!indexes) { 5189 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); 5190 return; 5191 } 5192 5193 extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source, 5194 srcPacking); 5195 5196 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 5197 /* shift and offset indexes */ 5198 _mesa_shift_and_offset_ci(ctx, n, indexes); 5199 } 5200 5201 if (ctx->Pixel.MapStencilFlag) { 5202 /* Apply stencil lookup table */ 5203 const GLuint mask = ctx->PixelMaps.StoS.Size - 1; 5204 GLuint i; 5205 for (i = 0; i < n; i++) { 5206 indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ]; 5207 } 5208 } 5209 5210 /* convert to dest type */ 5211 switch (dstType) { 5212 case GL_UNSIGNED_BYTE: 5213 { 5214 GLubyte *dst = (GLubyte *) dest; 5215 GLuint i; 5216 for (i = 0; i < n; i++) { 5217 dst[i] = (GLubyte) (indexes[i] & 0xff); 5218 } 5219 } 5220 break; 5221 case GL_UNSIGNED_SHORT: 5222 { 5223 GLuint *dst = (GLuint *) dest; 5224 GLuint i; 5225 for (i = 0; i < n; i++) { 5226 dst[i] = (GLushort) (indexes[i] & 0xffff); 5227 } 5228 } 5229 break; 5230 case GL_UNSIGNED_INT: 5231 memcpy(dest, indexes, n * sizeof(GLuint)); 5232 break; 5233 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5234 { 5235 GLuint *dst = (GLuint *) dest; 5236 GLuint i; 5237 for (i = 0; i < n; i++) { 5238 dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */ 5239 } 5240 } 5241 break; 5242 default: 5243 _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 5244 } 5245 5246 free(indexes); 5247 } 5248 } 5249 5250 5251 void 5252 _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, 5253 GLenum dstType, GLvoid *dest, const GLubyte *source, 5254 const struct gl_pixelstore_attrib *dstPacking ) 5255 { 5256 GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte)); 5257 5258 if (!stencil) { 5259 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); 5260 return; 5261 } 5262 5263 if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 5264 ctx->Pixel.MapStencilFlag) { 5265 /* make a copy of input */ 5266 memcpy(stencil, source, n * sizeof(GLubyte)); 5267 _mesa_apply_stencil_transfer_ops(ctx, n, stencil); 5268 source = stencil; 5269 } 5270 5271 switch (dstType) { 5272 case GL_UNSIGNED_BYTE: 5273 memcpy(dest, source, n); 5274 break; 5275 case GL_BYTE: 5276 { 5277 GLbyte *dst = (GLbyte *) dest; 5278 GLuint i; 5279 for (i=0;i<n;i++) { 5280 dst[i] = (GLbyte) (source[i] & 0x7f); 5281 } 5282 } 5283 break; 5284 case GL_UNSIGNED_SHORT: 5285 { 5286 GLushort *dst = (GLushort *) dest; 5287 GLuint i; 5288 for (i=0;i<n;i++) { 5289 dst[i] = (GLushort) source[i]; 5290 } 5291 if (dstPacking->SwapBytes) { 5292 _mesa_swap2( (GLushort *) dst, n ); 5293 } 5294 } 5295 break; 5296 case GL_SHORT: 5297 { 5298 GLshort *dst = (GLshort *) dest; 5299 GLuint i; 5300 for (i=0;i<n;i++) { 5301 dst[i] = (GLshort) source[i]; 5302 } 5303 if (dstPacking->SwapBytes) { 5304 _mesa_swap2( (GLushort *) dst, n ); 5305 } 5306 } 5307 break; 5308 case GL_UNSIGNED_INT: 5309 { 5310 GLuint *dst = (GLuint *) dest; 5311 GLuint i; 5312 for (i=0;i<n;i++) { 5313 dst[i] = (GLuint) source[i]; 5314 } 5315 if (dstPacking->SwapBytes) { 5316 _mesa_swap4( (GLuint *) dst, n ); 5317 } 5318 } 5319 break; 5320 case GL_INT: 5321 { 5322 GLint *dst = (GLint *) dest; 5323 GLuint i; 5324 for (i=0;i<n;i++) { 5325 dst[i] = (GLint) source[i]; 5326 } 5327 if (dstPacking->SwapBytes) { 5328 _mesa_swap4( (GLuint *) dst, n ); 5329 } 5330 } 5331 break; 5332 case GL_FLOAT: 5333 { 5334 GLfloat *dst = (GLfloat *) dest; 5335 GLuint i; 5336 for (i=0;i<n;i++) { 5337 dst[i] = (GLfloat) source[i]; 5338 } 5339 if (dstPacking->SwapBytes) { 5340 _mesa_swap4( (GLuint *) dst, n ); 5341 } 5342 } 5343 break; 5344 case GL_HALF_FLOAT_ARB: 5345 { 5346 GLhalfARB *dst = (GLhalfARB *) dest; 5347 GLuint i; 5348 for (i=0;i<n;i++) { 5349 dst[i] = _mesa_float_to_half( (float) source[i] ); 5350 } 5351 if (dstPacking->SwapBytes) { 5352 _mesa_swap2( (GLushort *) dst, n ); 5353 } 5354 } 5355 break; 5356 case GL_BITMAP: 5357 if (dstPacking->LsbFirst) { 5358 GLubyte *dst = (GLubyte *) dest; 5359 GLint shift = 0; 5360 GLuint i; 5361 for (i = 0; i < n; i++) { 5362 if (shift == 0) 5363 *dst = 0; 5364 *dst |= ((source[i] != 0) << shift); 5365 shift++; 5366 if (shift == 8) { 5367 shift = 0; 5368 dst++; 5369 } 5370 } 5371 } 5372 else { 5373 GLubyte *dst = (GLubyte *) dest; 5374 GLint shift = 7; 5375 GLuint i; 5376 for (i = 0; i < n; i++) { 5377 if (shift == 7) 5378 *dst = 0; 5379 *dst |= ((source[i] != 0) << shift); 5380 shift--; 5381 if (shift < 0) { 5382 shift = 7; 5383 dst++; 5384 } 5385 } 5386 } 5387 break; 5388 default: 5389 _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 5390 } 5391 5392 free(stencil); 5393 } 5394 5395 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \ 5396 do { \ 5397 GLuint i; \ 5398 const GLTYPE *src = (const GLTYPE *)source; \ 5399 for (i = 0; i < n; i++) { \ 5400 GLTYPE value = src[i]; \ 5401 if (srcPacking->SwapBytes) { \ 5402 if (sizeof(GLTYPE) == 2) { \ 5403 SWAP2BYTE(value); \ 5404 } else if (sizeof(GLTYPE) == 4) { \ 5405 SWAP4BYTE(value); \ 5406 } \ 5407 } \ 5408 depthValues[i] = GLTYPE2FLOAT(value); \ 5409 } \ 5410 } while (0) 5411 5412 5413 /** 5414 * Unpack a row of depth/z values from memory, returning GLushort, GLuint 5415 * or GLfloat values. 5416 * The glPixelTransfer (scale/bias) params will be applied. 5417 * 5418 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT 5419 * \param depthMax max value for returned GLushort or GLuint values 5420 * (ignored for GLfloat). 5421 */ 5422 void 5423 _mesa_unpack_depth_span( struct gl_context *ctx, GLuint n, 5424 GLenum dstType, GLvoid *dest, GLuint depthMax, 5425 GLenum srcType, const GLvoid *source, 5426 const struct gl_pixelstore_attrib *srcPacking ) 5427 { 5428 GLfloat *depthTemp = NULL, *depthValues; 5429 GLboolean needClamp = GL_FALSE; 5430 5431 /* Look for special cases first. 5432 * Not only are these faster, they're less prone to numeric conversion 5433 * problems. Otherwise, converting from an int type to a float then 5434 * back to an int type can introduce errors that will show up as 5435 * artifacts in things like depth peeling which uses glCopyTexImage. 5436 */ 5437 if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) { 5438 if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) { 5439 const GLuint *src = (const GLuint *) source; 5440 GLushort *dst = (GLushort *) dest; 5441 GLuint i; 5442 for (i = 0; i < n; i++) { 5443 dst[i] = src[i] >> 16; 5444 } 5445 return; 5446 } 5447 if (srcType == GL_UNSIGNED_SHORT 5448 && dstType == GL_UNSIGNED_INT 5449 && depthMax == 0xffffffff) { 5450 const GLushort *src = (const GLushort *) source; 5451 GLuint *dst = (GLuint *) dest; 5452 GLuint i; 5453 for (i = 0; i < n; i++) { 5454 dst[i] = src[i] | (src[i] << 16); 5455 } 5456 return; 5457 } 5458 if (srcType == GL_UNSIGNED_INT_24_8 5459 && dstType == GL_UNSIGNED_INT 5460 && depthMax == 0xffffff) { 5461 const GLuint *src = (const GLuint *) source; 5462 GLuint *dst = (GLuint *) dest; 5463 GLuint i; 5464 for (i = 0; i < n; i++) { 5465 dst[i] = src[i] >> 8; 5466 } 5467 return; 5468 } 5469 /* XXX may want to add additional cases here someday */ 5470 } 5471 5472 /* general case path follows */ 5473 5474 if (dstType == GL_FLOAT) { 5475 depthValues = (GLfloat *) dest; 5476 } 5477 else { 5478 depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat)); 5479 if (!depthTemp) { 5480 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 5481 return; 5482 } 5483 5484 depthValues = depthTemp; 5485 } 5486 5487 /* Convert incoming values to GLfloat. Some conversions will require 5488 * clamping, below. 5489 */ 5490 switch (srcType) { 5491 case GL_BYTE: 5492 DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ); 5493 needClamp = GL_TRUE; 5494 break; 5495 case GL_UNSIGNED_BYTE: 5496 DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); 5497 break; 5498 case GL_SHORT: 5499 DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ); 5500 needClamp = GL_TRUE; 5501 break; 5502 case GL_UNSIGNED_SHORT: 5503 DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); 5504 break; 5505 case GL_INT: 5506 DEPTH_VALUES(GLint, INT_TO_FLOAT); 5507 needClamp = GL_TRUE; 5508 break; 5509 case GL_UNSIGNED_INT: 5510 DEPTH_VALUES(GLuint, UINT_TO_FLOAT); 5511 break; 5512 case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */ 5513 if (dstType == GL_UNSIGNED_INT_24_8_EXT && 5514 depthMax == 0xffffff && 5515 ctx->Pixel.DepthScale == 1.0 && 5516 ctx->Pixel.DepthBias == 0.0) { 5517 const GLuint *src = (const GLuint *) source; 5518 GLuint *zValues = (GLuint *) dest; 5519 GLuint i; 5520 for (i = 0; i < n; i++) { 5521 GLuint value = src[i]; 5522 if (srcPacking->SwapBytes) { 5523 SWAP4BYTE(value); 5524 } 5525 zValues[i] = value & 0xffffff00; 5526 } 5527 free(depthTemp); 5528 return; 5529 } 5530 else { 5531 const GLuint *src = (const GLuint *) source; 5532 const GLfloat scale = 1.0f / 0xffffff; 5533 GLuint i; 5534 for (i = 0; i < n; i++) { 5535 GLuint value = src[i]; 5536 if (srcPacking->SwapBytes) { 5537 SWAP4BYTE(value); 5538 } 5539 depthValues[i] = (value >> 8) * scale; 5540 } 5541 } 5542 break; 5543 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5544 { 5545 GLuint i; 5546 const GLfloat *src = (const GLfloat *)source; 5547 for (i = 0; i < n; i++) { 5548 GLfloat value = src[i * 2]; 5549 if (srcPacking->SwapBytes) { 5550 SWAP4BYTE(value); 5551 } 5552 depthValues[i] = value; 5553 } 5554 needClamp = GL_TRUE; 5555 } 5556 break; 5557 case GL_FLOAT: 5558 DEPTH_VALUES(GLfloat, 1*); 5559 needClamp = GL_TRUE; 5560 break; 5561 case GL_HALF_FLOAT_ARB: 5562 { 5563 GLuint i; 5564 const GLhalfARB *src = (const GLhalfARB *) source; 5565 for (i = 0; i < n; i++) { 5566 GLhalfARB value = src[i]; 5567 if (srcPacking->SwapBytes) { 5568 SWAP2BYTE(value); 5569 } 5570 depthValues[i] = _mesa_half_to_float(value); 5571 } 5572 needClamp = GL_TRUE; 5573 } 5574 break; 5575 default: 5576 _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 5577 free(depthTemp); 5578 return; 5579 } 5580 5581 /* apply depth scale and bias */ 5582 { 5583 const GLfloat scale = ctx->Pixel.DepthScale; 5584 const GLfloat bias = ctx->Pixel.DepthBias; 5585 if (scale != 1.0 || bias != 0.0) { 5586 GLuint i; 5587 for (i = 0; i < n; i++) { 5588 depthValues[i] = depthValues[i] * scale + bias; 5589 } 5590 needClamp = GL_TRUE; 5591 } 5592 } 5593 5594 /* clamp to [0, 1] */ 5595 if (needClamp) { 5596 GLuint i; 5597 for (i = 0; i < n; i++) { 5598 depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0); 5599 } 5600 } 5601 5602 /* 5603 * Convert values to dstType 5604 */ 5605 if (dstType == GL_UNSIGNED_INT) { 5606 GLuint *zValues = (GLuint *) dest; 5607 GLuint i; 5608 if (depthMax <= 0xffffff) { 5609 /* no overflow worries */ 5610 for (i = 0; i < n; i++) { 5611 zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax); 5612 } 5613 } 5614 else { 5615 /* need to use double precision to prevent overflow problems */ 5616 for (i = 0; i < n; i++) { 5617 GLdouble z = depthValues[i] * (GLdouble) depthMax; 5618 if (z >= (GLdouble) 0xffffffff) 5619 zValues[i] = 0xffffffff; 5620 else 5621 zValues[i] = (GLuint) z; 5622 } 5623 } 5624 } 5625 else if (dstType == GL_UNSIGNED_SHORT) { 5626 GLushort *zValues = (GLushort *) dest; 5627 GLuint i; 5628 ASSERT(depthMax <= 0xffff); 5629 for (i = 0; i < n; i++) { 5630 zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax); 5631 } 5632 } 5633 else if (dstType == GL_FLOAT) { 5634 /* Nothing to do. depthValues is pointing to dest. */ 5635 } 5636 else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) { 5637 GLfloat *zValues = (GLfloat*) dest; 5638 GLuint i; 5639 for (i = 0; i < n; i++) { 5640 zValues[i*2] = depthValues[i]; 5641 } 5642 } 5643 else { 5644 ASSERT(0); 5645 } 5646 5647 free(depthTemp); 5648 } 5649 5650 5651 /* 5652 * Pack an array of depth values. The values are floats in [0,1]. 5653 */ 5654 void 5655 _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, 5656 GLenum dstType, const GLfloat *depthSpan, 5657 const struct gl_pixelstore_attrib *dstPacking ) 5658 { 5659 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 5660 if (!depthCopy) { 5661 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5662 return; 5663 } 5664 5665 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5666 memcpy(depthCopy, depthSpan, n * sizeof(GLfloat)); 5667 _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5668 depthSpan = depthCopy; 5669 } 5670 5671 switch (dstType) { 5672 case GL_UNSIGNED_BYTE: 5673 { 5674 GLubyte *dst = (GLubyte *) dest; 5675 GLuint i; 5676 for (i = 0; i < n; i++) { 5677 dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 5678 } 5679 } 5680 break; 5681 case GL_BYTE: 5682 { 5683 GLbyte *dst = (GLbyte *) dest; 5684 GLuint i; 5685 for (i = 0; i < n; i++) { 5686 dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 5687 } 5688 } 5689 break; 5690 case GL_UNSIGNED_SHORT: 5691 { 5692 GLushort *dst = (GLushort *) dest; 5693 GLuint i; 5694 for (i = 0; i < n; i++) { 5695 CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]); 5696 } 5697 if (dstPacking->SwapBytes) { 5698 _mesa_swap2( (GLushort *) dst, n ); 5699 } 5700 } 5701 break; 5702 case GL_SHORT: 5703 { 5704 GLshort *dst = (GLshort *) dest; 5705 GLuint i; 5706 for (i = 0; i < n; i++) { 5707 dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 5708 } 5709 if (dstPacking->SwapBytes) { 5710 _mesa_swap2( (GLushort *) dst, n ); 5711 } 5712 } 5713 break; 5714 case GL_UNSIGNED_INT: 5715 { 5716 GLuint *dst = (GLuint *) dest; 5717 GLuint i; 5718 for (i = 0; i < n; i++) { 5719 dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 5720 } 5721 if (dstPacking->SwapBytes) { 5722 _mesa_swap4( (GLuint *) dst, n ); 5723 } 5724 } 5725 break; 5726 case GL_INT: 5727 { 5728 GLint *dst = (GLint *) dest; 5729 GLuint i; 5730 for (i = 0; i < n; i++) { 5731 dst[i] = FLOAT_TO_INT( depthSpan[i] ); 5732 } 5733 if (dstPacking->SwapBytes) { 5734 _mesa_swap4( (GLuint *) dst, n ); 5735 } 5736 } 5737 break; 5738 case GL_FLOAT: 5739 { 5740 GLfloat *dst = (GLfloat *) dest; 5741 GLuint i; 5742 for (i = 0; i < n; i++) { 5743 dst[i] = depthSpan[i]; 5744 } 5745 if (dstPacking->SwapBytes) { 5746 _mesa_swap4( (GLuint *) dst, n ); 5747 } 5748 } 5749 break; 5750 case GL_HALF_FLOAT_ARB: 5751 { 5752 GLhalfARB *dst = (GLhalfARB *) dest; 5753 GLuint i; 5754 for (i = 0; i < n; i++) { 5755 dst[i] = _mesa_float_to_half(depthSpan[i]); 5756 } 5757 if (dstPacking->SwapBytes) { 5758 _mesa_swap2( (GLushort *) dst, n ); 5759 } 5760 } 5761 break; 5762 default: 5763 _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 5764 } 5765 5766 free(depthCopy); 5767 } 5768 5769 5770 5771 /** 5772 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc) 5773 */ 5774 void 5775 _mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, 5776 GLenum dstType, GLuint *dest, 5777 const GLfloat *depthVals, 5778 const GLubyte *stencilVals, 5779 const struct gl_pixelstore_attrib *dstPacking) 5780 { 5781 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 5782 GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte)); 5783 GLuint i; 5784 5785 if (!depthCopy || !stencilCopy) { 5786 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5787 free(depthCopy); 5788 free(stencilCopy); 5789 return; 5790 } 5791 5792 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 5793 memcpy(depthCopy, depthVals, n * sizeof(GLfloat)); 5794 _mesa_scale_and_bias_depth(ctx, n, depthCopy); 5795 depthVals = depthCopy; 5796 } 5797 5798 if (ctx->Pixel.IndexShift || 5799 ctx->Pixel.IndexOffset || 5800 ctx->Pixel.MapStencilFlag) { 5801 memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte)); 5802 _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); 5803 stencilVals = stencilCopy; 5804 } 5805 5806 switch (dstType) { 5807 case GL_UNSIGNED_INT_24_8: 5808 for (i = 0; i < n; i++) { 5809 GLuint z = (GLuint) (depthVals[i] * 0xffffff); 5810 dest[i] = (z << 8) | (stencilVals[i] & 0xff); 5811 } 5812 break; 5813 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 5814 for (i = 0; i < n; i++) { 5815 ((GLfloat*)dest)[i*2] = depthVals[i]; 5816 dest[i*2+1] = stencilVals[i] & 0xff; 5817 } 5818 break; 5819 } 5820 5821 if (dstPacking->SwapBytes) { 5822 _mesa_swap4(dest, n); 5823 } 5824 5825 free(depthCopy); 5826 free(stencilCopy); 5827 } 5828 5829 5830 5831 5832 /** 5833 * Unpack image data. Apply byte swapping, byte flipping (bitmap). 5834 * Return all image data in a contiguous block. This is used when we 5835 * compile glDrawPixels, glTexImage, etc into a display list. We 5836 * need a copy of the data in a standard format. 5837 */ 5838 void * 5839 _mesa_unpack_image( GLuint dimensions, 5840 GLsizei width, GLsizei height, GLsizei depth, 5841 GLenum format, GLenum type, const GLvoid *pixels, 5842 const struct gl_pixelstore_attrib *unpack ) 5843 { 5844 GLint bytesPerRow, compsPerRow; 5845 GLboolean flipBytes, swap2, swap4; 5846 5847 if (!pixels) 5848 return NULL; /* not necessarily an error */ 5849 5850 if (width <= 0 || height <= 0 || depth <= 0) 5851 return NULL; /* generate error later */ 5852 5853 if (type == GL_BITMAP) { 5854 bytesPerRow = (width + 7) >> 3; 5855 flipBytes = unpack->LsbFirst; 5856 swap2 = swap4 = GL_FALSE; 5857 compsPerRow = 0; 5858 } 5859 else { 5860 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 5861 GLint components = _mesa_components_in_format(format); 5862 GLint bytesPerComp; 5863 5864 if (_mesa_type_is_packed(type)) 5865 components = 1; 5866 5867 if (bytesPerPixel <= 0 || components <= 0) 5868 return NULL; /* bad format or type. generate error later */ 5869 bytesPerRow = bytesPerPixel * width; 5870 bytesPerComp = bytesPerPixel / components; 5871 flipBytes = GL_FALSE; 5872 swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 5873 swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 5874 compsPerRow = components * width; 5875 assert(compsPerRow >= width); 5876 } 5877 5878 { 5879 GLubyte *destBuffer 5880 = (GLubyte *) malloc(bytesPerRow * height * depth); 5881 GLubyte *dst; 5882 GLint img, row; 5883 if (!destBuffer) 5884 return NULL; /* generate GL_OUT_OF_MEMORY later */ 5885 5886 dst = destBuffer; 5887 for (img = 0; img < depth; img++) { 5888 for (row = 0; row < height; row++) { 5889 const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels, 5890 width, height, format, type, img, row, 0); 5891 5892 if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) { 5893 GLint i; 5894 flipBytes = GL_FALSE; 5895 if (unpack->LsbFirst) { 5896 GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7); 5897 GLubyte dstMask = 128; 5898 const GLubyte *s = src; 5899 GLubyte *d = dst; 5900 *d = 0; 5901 for (i = 0; i < width; i++) { 5902 if (*s & srcMask) { 5903 *d |= dstMask; 5904 } 5905 if (srcMask == 128) { 5906 srcMask = 1; 5907 s++; 5908 } 5909 else { 5910 srcMask = srcMask << 1; 5911 } 5912 if (dstMask == 1) { 5913 dstMask = 128; 5914 d++; 5915 *d = 0; 5916 } 5917 else { 5918 dstMask = dstMask >> 1; 5919 } 5920 } 5921 } 5922 else { 5923 GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7); 5924 GLubyte dstMask = 128; 5925 const GLubyte *s = src; 5926 GLubyte *d = dst; 5927 *d = 0; 5928 for (i = 0; i < width; i++) { 5929 if (*s & srcMask) { 5930 *d |= dstMask; 5931 } 5932 if (srcMask == 1) { 5933 srcMask = 128; 5934 s++; 5935 } 5936 else { 5937 srcMask = srcMask >> 1; 5938 } 5939 if (dstMask == 1) { 5940 dstMask = 128; 5941 d++; 5942 *d = 0; 5943 } 5944 else { 5945 dstMask = dstMask >> 1; 5946 } 5947 } 5948 } 5949 } 5950 else { 5951 memcpy(dst, src, bytesPerRow); 5952 } 5953 5954 /* byte flipping/swapping */ 5955 if (flipBytes) { 5956 flip_bytes((GLubyte *) dst, bytesPerRow); 5957 } 5958 else if (swap2) { 5959 _mesa_swap2((GLushort*) dst, compsPerRow); 5960 } 5961 else if (swap4) { 5962 _mesa_swap4((GLuint*) dst, compsPerRow); 5963 } 5964 dst += bytesPerRow; 5965 } 5966 } 5967 return destBuffer; 5968 } 5969 } 5970 5971 5972 5973 /** 5974 * If we unpack colors from a luminance surface, we'll get pixel colors 5975 * such as (l, l, l, a). 5976 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that 5977 * function will compute L=R+G+B before packing. The net effect is we'll 5978 * accidentally store luminance values = 3*l. 5979 * This function compensates for that by converting (aka rebasing) (l,l,l,a) 5980 * to be (l,0,0,a). 5981 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA 5982 * and INTENSITY. 5983 * 5984 * Finally, we also need to do this when the actual surface format does 5985 * not match the logical surface format. For example, suppose the user 5986 * requests a GL_LUMINANCE texture but the driver stores it as RGBA. 5987 * Again, we'll get pixel values like (l,l,l,a). 5988 */ 5989 void 5990 _mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) 5991 { 5992 GLuint i; 5993 5994 switch (baseFormat) { 5995 case GL_ALPHA: 5996 for (i = 0; i < n; i++) { 5997 rgba[i][RCOMP] = 0.0F; 5998 rgba[i][GCOMP] = 0.0F; 5999 rgba[i][BCOMP] = 0.0F; 6000 } 6001 break; 6002 case GL_INTENSITY: 6003 /* fall-through */ 6004 case GL_LUMINANCE: 6005 for (i = 0; i < n; i++) { 6006 rgba[i][GCOMP] = 0.0F; 6007 rgba[i][BCOMP] = 0.0F; 6008 rgba[i][ACOMP] = 1.0F; 6009 } 6010 break; 6011 case GL_LUMINANCE_ALPHA: 6012 for (i = 0; i < n; i++) { 6013 rgba[i][GCOMP] = 0.0F; 6014 rgba[i][BCOMP] = 0.0F; 6015 } 6016 break; 6017 default: 6018 /* no-op */ 6019 ; 6020 } 6021 } 6022 6023 6024 /** 6025 * As above, but GLuint components. 6026 */ 6027 void 6028 _mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) 6029 { 6030 GLuint i; 6031 6032 switch (baseFormat) { 6033 case GL_ALPHA: 6034 for (i = 0; i < n; i++) { 6035 rgba[i][RCOMP] = 0; 6036 rgba[i][GCOMP] = 0; 6037 rgba[i][BCOMP] = 0; 6038 } 6039 break; 6040 case GL_INTENSITY: 6041 /* fall-through */ 6042 case GL_LUMINANCE: 6043 for (i = 0; i < n; i++) { 6044 rgba[i][GCOMP] = 0; 6045 rgba[i][BCOMP] = 0; 6046 rgba[i][ACOMP] = 1; 6047 } 6048 break; 6049 case GL_LUMINANCE_ALPHA: 6050 for (i = 0; i < n; i++) { 6051 rgba[i][GCOMP] = 0; 6052 rgba[i][BCOMP] = 0; 6053 } 6054 break; 6055 default: 6056 /* no-op */ 6057 ; 6058 } 6059 } 6060 6061 6062