image.c revision b6bcae5698df88f7730d40004ce7ce0462e97a20
1/* $Id: image.c,v 1.53 2001/01/23 23:39:36 brianp Exp $ */ 2 3/* 4 * Mesa 3-D graphics library 5 * Version: 3.5 6 * 7 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 28#ifdef PC_HEADER 29#include "all.h" 30#else 31#include "glheader.h" 32#include "colormac.h" 33#include "context.h" 34#include "image.h" 35#include "histogram.h" 36#include "macros.h" 37#include "mem.h" 38#include "mmath.h" 39#include "pixel.h" 40#include "mtypes.h" 41#endif 42 43 44 45/* 46 * These are the image packing parameters for Mesa's internal images. 47 * That is, _mesa_unpack_image() returns image data in this format. 48 * When we execute image commands (glDrawPixels, glTexImage, etc) 49 * from within display lists we have to be sure to set the current 50 * unpacking params to these values! 51 */ 52const struct gl_pixelstore_attrib _mesa_native_packing = { 53 1, /* Alignment */ 54 0, /* RowLength */ 55 0, /* SkipPixels */ 56 0, /* SkipRows */ 57 0, /* ImageHeight */ 58 0, /* SkipImages */ 59 GL_FALSE, /* SwapBytes */ 60 GL_FALSE /* LsbFirst */ 61}; 62 63 64 65/* 66 * Flip the 8 bits in each byte of the given array. 67 * 68 * XXX try this trick to flip bytes someday: 69 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 70 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 71 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 72 */ 73static void 74flip_bytes( GLubyte *p, GLuint n ) 75{ 76 register GLuint i, a, b; 77 78 for (i=0;i<n;i++) { 79 b = (GLuint) p[i]; /* words are often faster than bytes */ 80 a = ((b & 0x01) << 7) | 81 ((b & 0x02) << 5) | 82 ((b & 0x04) << 3) | 83 ((b & 0x08) << 1) | 84 ((b & 0x10) >> 1) | 85 ((b & 0x20) >> 3) | 86 ((b & 0x40) >> 5) | 87 ((b & 0x80) >> 7); 88 p[i] = (GLubyte) a; 89 } 90} 91 92 93/* 94 * Flip the order of the 2 bytes in each word in the given array. 95 */ 96void 97_mesa_swap2( GLushort *p, GLuint n ) 98{ 99 register GLuint i; 100 101 for (i=0;i<n;i++) { 102 p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 103 } 104} 105 106 107 108/* 109 * Flip the order of the 4 bytes in each word in the given array. 110 */ 111void 112_mesa_swap4( GLuint *p, GLuint n ) 113{ 114 register GLuint i, a, b; 115 116 for (i=0;i<n;i++) { 117 b = p[i]; 118 a = (b >> 24) 119 | ((b >> 8) & 0xff00) 120 | ((b << 8) & 0xff0000) 121 | ((b << 24) & 0xff000000); 122 p[i] = a; 123 } 124} 125 126 127 128 129/* 130 * Return the size, in bytes, of the given GL datatype. 131 * Return 0 if GL_BITMAP. 132 * Return -1 if invalid type enum. 133 */ 134GLint _mesa_sizeof_type( GLenum type ) 135{ 136 switch (type) { 137 case GL_BITMAP: 138 return 0; 139 case GL_UNSIGNED_BYTE: 140 return sizeof(GLubyte); 141 case GL_BYTE: 142 return sizeof(GLbyte); 143 case GL_UNSIGNED_SHORT: 144 return sizeof(GLushort); 145 case GL_SHORT: 146 return sizeof(GLshort); 147 case GL_UNSIGNED_INT: 148 return sizeof(GLuint); 149 case GL_INT: 150 return sizeof(GLint); 151 case GL_FLOAT: 152 return sizeof(GLfloat); 153 default: 154 return -1; 155 } 156} 157 158 159/* 160 * Same as _mesa_sizeof_packed_type() but we also accept the 161 * packed pixel format datatypes. 162 */ 163GLint _mesa_sizeof_packed_type( GLenum type ) 164{ 165 switch (type) { 166 case GL_BITMAP: 167 return 0; 168 case GL_UNSIGNED_BYTE: 169 return sizeof(GLubyte); 170 case GL_BYTE: 171 return sizeof(GLbyte); 172 case GL_UNSIGNED_SHORT: 173 return sizeof(GLushort); 174 case GL_SHORT: 175 return sizeof(GLshort); 176 case GL_UNSIGNED_INT: 177 return sizeof(GLuint); 178 case GL_INT: 179 return sizeof(GLint); 180 case GL_FLOAT: 181 return sizeof(GLfloat); 182 case GL_UNSIGNED_BYTE_3_3_2: 183 return sizeof(GLubyte); 184 case GL_UNSIGNED_BYTE_2_3_3_REV: 185 return sizeof(GLubyte); 186 case GL_UNSIGNED_SHORT_5_6_5: 187 return sizeof(GLshort); 188 case GL_UNSIGNED_SHORT_5_6_5_REV: 189 return sizeof(GLshort); 190 case GL_UNSIGNED_SHORT_4_4_4_4: 191 return sizeof(GLshort); 192 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 193 return sizeof(GLshort); 194 case GL_UNSIGNED_SHORT_5_5_5_1: 195 return sizeof(GLshort); 196 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 197 return sizeof(GLshort); 198 case GL_UNSIGNED_INT_8_8_8_8: 199 return sizeof(GLuint); 200 case GL_UNSIGNED_INT_8_8_8_8_REV: 201 return sizeof(GLuint); 202 case GL_UNSIGNED_INT_10_10_10_2: 203 return sizeof(GLuint); 204 case GL_UNSIGNED_INT_2_10_10_10_REV: 205 return sizeof(GLuint); 206 default: 207 return -1; 208 } 209} 210 211 212 213/* 214 * Return the number of components in a GL enum pixel type. 215 * Return -1 if bad format. 216 */ 217GLint _mesa_components_in_format( GLenum format ) 218{ 219 switch (format) { 220 case GL_COLOR_INDEX: 221 case GL_COLOR_INDEX1_EXT: 222 case GL_COLOR_INDEX2_EXT: 223 case GL_COLOR_INDEX4_EXT: 224 case GL_COLOR_INDEX8_EXT: 225 case GL_COLOR_INDEX12_EXT: 226 case GL_COLOR_INDEX16_EXT: 227 case GL_STENCIL_INDEX: 228 case GL_DEPTH_COMPONENT: 229 case GL_RED: 230 case GL_GREEN: 231 case GL_BLUE: 232 case GL_ALPHA: 233 case GL_LUMINANCE: 234 case GL_INTENSITY: 235 return 1; 236 case GL_LUMINANCE_ALPHA: 237 return 2; 238 case GL_RGB: 239 return 3; 240 case GL_RGBA: 241 return 4; 242 case GL_BGR: 243 return 3; 244 case GL_BGRA: 245 return 4; 246 case GL_ABGR_EXT: 247 return 4; 248 default: 249 return -1; 250 } 251} 252 253 254/* 255 * Return bytes per pixel for given format and type 256 * Return -1 if bad format or type. 257 */ 258GLint _mesa_bytes_per_pixel( GLenum format, GLenum type ) 259{ 260 GLint comps = _mesa_components_in_format( format ); 261 if (comps < 0) 262 return -1; 263 264 switch (type) { 265 case GL_BITMAP: 266 return 0; /* special case */ 267 case GL_BYTE: 268 case GL_UNSIGNED_BYTE: 269 return comps * sizeof(GLubyte); 270 case GL_SHORT: 271 case GL_UNSIGNED_SHORT: 272 return comps * sizeof(GLshort); 273 case GL_INT: 274 case GL_UNSIGNED_INT: 275 return comps * sizeof(GLint); 276 case GL_FLOAT: 277 return comps * sizeof(GLfloat); 278 case GL_UNSIGNED_BYTE_3_3_2: 279 case GL_UNSIGNED_BYTE_2_3_3_REV: 280 if (format == GL_RGB || format == GL_BGR) 281 return sizeof(GLubyte); 282 else 283 return -1; /* error */ 284 case GL_UNSIGNED_SHORT_5_6_5: 285 case GL_UNSIGNED_SHORT_5_6_5_REV: 286 if (format == GL_RGB || format == GL_BGR) 287 return sizeof(GLshort); 288 else 289 return -1; /* error */ 290 case GL_UNSIGNED_SHORT_4_4_4_4: 291 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 292 case GL_UNSIGNED_SHORT_5_5_5_1: 293 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 294 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 295 return sizeof(GLushort); 296 else 297 return -1; 298 case GL_UNSIGNED_INT_8_8_8_8: 299 case GL_UNSIGNED_INT_8_8_8_8_REV: 300 case GL_UNSIGNED_INT_10_10_10_2: 301 case GL_UNSIGNED_INT_2_10_10_10_REV: 302 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT) 303 return sizeof(GLuint); 304 else 305 return -1; 306 default: 307 return -1; 308 } 309} 310 311 312/* 313 * Test if the given pixel format and type are legal. 314 * Return GL_TRUE for legal, GL_FALSE for illegal. 315 */ 316GLboolean 317_mesa_is_legal_format_and_type( GLenum format, GLenum type ) 318{ 319 switch (format) { 320 case GL_COLOR_INDEX: 321 case GL_STENCIL_INDEX: 322 switch (type) { 323 case GL_BITMAP: 324 case GL_BYTE: 325 case GL_UNSIGNED_BYTE: 326 case GL_SHORT: 327 case GL_UNSIGNED_SHORT: 328 case GL_INT: 329 case GL_UNSIGNED_INT: 330 case GL_FLOAT: 331 return GL_TRUE; 332 default: 333 return GL_FALSE; 334 } 335 case GL_RED: 336 case GL_GREEN: 337 case GL_BLUE: 338 case GL_ALPHA: 339 case GL_INTENSITY: 340 case GL_LUMINANCE: 341 case GL_LUMINANCE_ALPHA: 342 case GL_DEPTH_COMPONENT: 343 switch (type) { 344 case GL_BYTE: 345 case GL_UNSIGNED_BYTE: 346 case GL_SHORT: 347 case GL_UNSIGNED_SHORT: 348 case GL_INT: 349 case GL_UNSIGNED_INT: 350 case GL_FLOAT: 351 return GL_TRUE; 352 default: 353 return GL_FALSE; 354 } 355 case GL_RGB: 356 case GL_BGR: 357 switch (type) { 358 case GL_BYTE: 359 case GL_UNSIGNED_BYTE: 360 case GL_SHORT: 361 case GL_UNSIGNED_SHORT: 362 case GL_INT: 363 case GL_UNSIGNED_INT: 364 case GL_FLOAT: 365 case GL_UNSIGNED_BYTE_3_3_2: 366 case GL_UNSIGNED_BYTE_2_3_3_REV: 367 case GL_UNSIGNED_SHORT_5_6_5: 368 case GL_UNSIGNED_SHORT_5_6_5_REV: 369 return GL_TRUE; 370 default: 371 return GL_FALSE; 372 } 373 case GL_RGBA: 374 case GL_BGRA: 375 case GL_ABGR_EXT: 376 switch (type) { 377 case GL_BYTE: 378 case GL_UNSIGNED_BYTE: 379 case GL_SHORT: 380 case GL_UNSIGNED_SHORT: 381 case GL_INT: 382 case GL_UNSIGNED_INT: 383 case GL_FLOAT: 384 case GL_UNSIGNED_SHORT_4_4_4_4: 385 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 386 case GL_UNSIGNED_SHORT_5_5_5_1: 387 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 388 case GL_UNSIGNED_INT_8_8_8_8: 389 case GL_UNSIGNED_INT_8_8_8_8_REV: 390 case GL_UNSIGNED_INT_10_10_10_2: 391 case GL_UNSIGNED_INT_2_10_10_10_REV: 392 return GL_TRUE; 393 default: 394 return GL_FALSE; 395 } 396 default: 397 ; /* fall-through */ 398 } 399 return GL_FALSE; 400} 401 402 403 404/* 405 * Return the address of a pixel in an image (actually a volume). 406 * Pixel unpacking/packing parameters are observed according to 'packing'. 407 * Input: image - start of image data 408 * width, height - size of image 409 * format - image format 410 * type - pixel component type 411 * packing - the pixelstore attributes 412 * img - which image in the volume (0 for 1D or 2D images) 413 * row, column - location of pixel in the image 414 * Return: address of pixel at (image,row,column) in image or NULL if error. 415 */ 416GLvoid * 417_mesa_image_address( const struct gl_pixelstore_attrib *packing, 418 const GLvoid *image, GLsizei width, 419 GLsizei height, GLenum format, GLenum type, 420 GLint img, GLint row, GLint column ) 421{ 422 GLint alignment; /* 1, 2 or 4 */ 423 GLint pixels_per_row; 424 GLint rows_per_image; 425 GLint skiprows; 426 GLint skippixels; 427 GLint skipimages; /* for 3-D volume images */ 428 GLubyte *pixel_addr; 429 430 alignment = packing->Alignment; 431 if (packing->RowLength > 0) { 432 pixels_per_row = packing->RowLength; 433 } 434 else { 435 pixels_per_row = width; 436 } 437 if (packing->ImageHeight > 0) { 438 rows_per_image = packing->ImageHeight; 439 } 440 else { 441 rows_per_image = height; 442 } 443 skiprows = packing->SkipRows; 444 skippixels = packing->SkipPixels; 445 skipimages = packing->SkipImages; 446 447 if (type==GL_BITMAP) { 448 /* BITMAP data */ 449 GLint comp_per_pixel; /* components per pixel */ 450 GLint bytes_per_comp; /* bytes per component */ 451 GLint bytes_per_row; 452 GLint bytes_per_image; 453 454 /* Compute bytes per component */ 455 bytes_per_comp = _mesa_sizeof_packed_type( type ); 456 if (bytes_per_comp<0) { 457 return NULL; 458 } 459 460 /* Compute number of components per pixel */ 461 comp_per_pixel = _mesa_components_in_format( format ); 462 if (comp_per_pixel<0 && type != GL_BITMAP) { 463 return NULL; 464 } 465 466 bytes_per_row = alignment 467 * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 468 469 bytes_per_image = bytes_per_row * rows_per_image; 470 471 pixel_addr = (GLubyte *) image 472 + (skipimages + img) * bytes_per_image 473 + (skiprows + row) * bytes_per_row 474 + (skippixels + column) / 8; 475 } 476 else { 477 /* Non-BITMAP data */ 478 GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 479 480 bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 481 482 /* The pixel type and format should have been error checked earlier */ 483 assert(bytes_per_pixel > 0); 484 485 bytes_per_row = pixels_per_row * bytes_per_pixel; 486 remainder = bytes_per_row % alignment; 487 if (remainder > 0) 488 bytes_per_row += (alignment - remainder); 489 490 ASSERT(bytes_per_row % alignment == 0); 491 492 bytes_per_image = bytes_per_row * rows_per_image; 493 494 /* compute final pixel address */ 495 pixel_addr = (GLubyte *) image 496 + (skipimages + img) * bytes_per_image 497 + (skiprows + row) * bytes_per_row 498 + (skippixels + column) * bytes_per_pixel; 499 } 500 501 return (GLvoid *) pixel_addr; 502} 503 504 505 506/* 507 * Compute the stride between image rows (in bytes) for the given 508 * pixel packing parameters and image width, format and type. 509 */ 510GLint 511_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 512 GLint width, GLenum format, GLenum type ) 513{ 514 ASSERT(packing); 515 if (type == GL_BITMAP) { 516 /* BITMAP data */ 517 if (packing->RowLength == 0) { 518 GLint bytes = (width + 7) / 8; 519 return bytes; 520 } 521 else { 522 GLint bytes = (packing->RowLength + 7) / 8; 523 return bytes; 524 } 525 } 526 else { 527 /* Non-BITMAP data */ 528 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 529 GLint bytesPerRow, remainder; 530 if (bytesPerPixel <= 0) 531 return -1; /* error */ 532 if (packing->RowLength == 0) { 533 bytesPerRow = bytesPerPixel * width; 534 } 535 else { 536 bytesPerRow = bytesPerPixel * packing->RowLength; 537 } 538 remainder = bytesPerRow % packing->Alignment; 539 if (remainder > 0) 540 bytesPerRow += (packing->Alignment - remainder); 541 return bytesPerRow; 542 } 543} 544 545 546 547/* 548 * Unpack a 32x32 pixel polygon stipple from user memory using the 549 * current pixel unpack settings. 550 */ 551void 552_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 553 const struct gl_pixelstore_attrib *unpacking ) 554{ 555 GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking ); 556 if (ptrn) { 557 /* Convert pattern from GLubytes to GLuints and handle big/little 558 * endian differences 559 */ 560 GLubyte *p = ptrn; 561 GLint i; 562 for (i = 0; i < 32; i++) { 563 dest[i] = (p[0] << 24) 564 | (p[1] << 16) 565 | (p[2] << 8) 566 | (p[3] ); 567 p += 4; 568 } 569 FREE(ptrn); 570 } 571} 572 573 574 575/* 576 * Pack polygon stipple into user memory given current pixel packing 577 * settings. 578 */ 579void 580_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 581 const struct gl_pixelstore_attrib *packing ) 582{ 583 /* Convert pattern from GLuints to GLubytes to handle big/little 584 * endian differences. 585 */ 586 GLubyte ptrn[32*4]; 587 GLint i; 588 for (i = 0; i < 32; i++) { 589 ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 590 ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 591 ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 592 ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 593 } 594 595 _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 596} 597 598 599/* 600 * Unpack bitmap data. Resulting data will be in most-significant-bit-first 601 * order with row alignment = 1 byte. 602 */ 603GLvoid * 604_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 605 const struct gl_pixelstore_attrib *packing ) 606{ 607 GLint bytes, row, width_in_bytes; 608 GLubyte *buffer, *dst; 609 610 if (!pixels) 611 return NULL; 612 613 /* Alloc dest storage */ 614 bytes = ((width + 7) / 8 * height); 615 buffer = (GLubyte *) MALLOC( bytes ); 616 if (!buffer) 617 return NULL; 618 619 620 width_in_bytes = CEILING( width, 8 ); 621 dst = buffer; 622 for (row = 0; row < height; row++) { 623 GLubyte *src = _mesa_image_address( packing, pixels, width, height, 624 GL_COLOR_INDEX, GL_BITMAP, 625 0, row, 0 ); 626 if (!src) { 627 FREE(buffer); 628 return NULL; 629 } 630 631 if (packing->SkipPixels == 0) { 632 MEMCPY( dst, src, width_in_bytes ); 633 if (packing->LsbFirst) { 634 flip_bytes( dst, width_in_bytes ); 635 } 636 } 637 else { 638 /* handling SkipPixels is a bit tricky (no pun intended!) */ 639 GLint i; 640 if (packing->LsbFirst) { 641 GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 642 GLubyte dstMask = 128; 643 GLubyte *s = src; 644 GLubyte *d = dst; 645 *d = 0; 646 for (i = 0; i < width; i++) { 647 if (*s & srcMask) { 648 *d |= dstMask; 649 } 650 if (srcMask == 128) { 651 srcMask = 1; 652 s++; 653 } 654 else { 655 srcMask = srcMask << 1; 656 } 657 if (dstMask == 1) { 658 dstMask = 128; 659 d++; 660 *d = 0; 661 } 662 else { 663 dstMask = dstMask >> 1; 664 } 665 } 666 } 667 else { 668 GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 669 GLubyte dstMask = 128; 670 GLubyte *s = src; 671 GLubyte *d = dst; 672 *d = 0; 673 for (i = 0; i < width; i++) { 674 if (*s & srcMask) { 675 *d |= dstMask; 676 } 677 if (srcMask == 1) { 678 srcMask = 128; 679 s++; 680 } 681 else { 682 srcMask = srcMask >> 1; 683 } 684 if (dstMask == 1) { 685 dstMask = 128; 686 d++; 687 *d = 0; 688 } 689 else { 690 dstMask = dstMask >> 1; 691 } 692 } 693 } 694 } 695 dst += width_in_bytes; 696 } 697 698 return buffer; 699} 700 701 702/* 703 * Pack bitmap data. 704 */ 705void 706_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 707 GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 708{ 709 GLint row, width_in_bytes; 710 const GLubyte *src; 711 712 if (!source) 713 return; 714 715 width_in_bytes = CEILING( width, 8 ); 716 src = source; 717 for (row = 0; row < height; row++) { 718 GLubyte *dst = _mesa_image_address( packing, dest, width, height, 719 GL_COLOR_INDEX, GL_BITMAP, 720 0, row, 0 ); 721 if (!dst) 722 return; 723 724 if (packing->SkipPixels == 0) { 725 MEMCPY( dst, src, width_in_bytes ); 726 if (packing->LsbFirst) { 727 flip_bytes( dst, width_in_bytes ); 728 } 729 } 730 else { 731 /* handling SkipPixels is a bit tricky (no pun intended!) */ 732 GLint i; 733 if (packing->LsbFirst) { 734 GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 735 GLubyte dstMask = 128; 736 const GLubyte *s = src; 737 GLubyte *d = dst; 738 *d = 0; 739 for (i = 0; i < width; i++) { 740 if (*s & srcMask) { 741 *d |= dstMask; 742 } 743 if (srcMask == 128) { 744 srcMask = 1; 745 s++; 746 } 747 else { 748 srcMask = srcMask << 1; 749 } 750 if (dstMask == 1) { 751 dstMask = 128; 752 d++; 753 *d = 0; 754 } 755 else { 756 dstMask = dstMask >> 1; 757 } 758 } 759 } 760 else { 761 GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 762 GLubyte dstMask = 128; 763 const GLubyte *s = src; 764 GLubyte *d = dst; 765 *d = 0; 766 for (i = 0; i < width; i++) { 767 if (*s & srcMask) { 768 *d |= dstMask; 769 } 770 if (srcMask == 1) { 771 srcMask = 128; 772 s++; 773 } 774 else { 775 srcMask = srcMask >> 1; 776 } 777 if (dstMask == 1) { 778 dstMask = 128; 779 d++; 780 *d = 0; 781 } 782 else { 783 dstMask = dstMask >> 1; 784 } 785 } 786 } 787 } 788 src += width_in_bytes; 789 } 790} 791 792 793 794void 795_mesa_pack_float_rgba_span( GLcontext *ctx, 796 GLuint n, CONST GLfloat rgbaIn[][4], 797 GLenum dstFormat, GLenum dstType, 798 GLvoid *dstAddr, 799 const struct gl_pixelstore_attrib *dstPacking, 800 GLuint transferOps ) 801{ 802 const GLint comps = _mesa_components_in_format(dstFormat); 803 GLfloat luminance[MAX_WIDTH]; 804 GLfloat (*rgba)[4]; 805 GLuint i; 806 807 if (transferOps) { 808 /* make copy of incoming data */ 809 GLfloat rgbaCopy[MAX_WIDTH][4]; 810 for (i = 0; i < n; i++) { 811 rgbaCopy[i][0] = rgbaIn[i][0]; 812 rgbaCopy[i][1] = rgbaIn[i][1]; 813 rgbaCopy[i][2] = rgbaIn[i][2]; 814 rgbaCopy[i][3] = rgbaIn[i][3]; 815 } 816 817 rgba = (GLfloat (*)[4]) rgbaCopy; 818 819 /* scale & bias */ 820 if (transferOps & IMAGE_SCALE_BIAS_BIT) { 821 _mesa_scale_and_bias_rgba(ctx, n, rgba, 822 ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 823 ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 824 ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 825 ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 826 } 827 /* color map lookup */ 828 if (transferOps & IMAGE_MAP_COLOR_BIT) { 829 _mesa_map_rgba( ctx, n, rgba ); 830 } 831 /* GL_COLOR_TABLE lookup */ 832 if (transferOps & IMAGE_COLOR_TABLE_BIT) { 833 _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 834 } 835 /* convolution */ 836 if (transferOps & IMAGE_CONVOLUTION_BIT) { 837 /* this has to be done in the calling code */ 838 } 839 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 840 if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 841 _mesa_scale_and_bias_rgba(ctx, n, rgba, 842 ctx->Pixel.PostConvolutionScale[RCOMP], 843 ctx->Pixel.PostConvolutionScale[GCOMP], 844 ctx->Pixel.PostConvolutionScale[BCOMP], 845 ctx->Pixel.PostConvolutionScale[ACOMP], 846 ctx->Pixel.PostConvolutionBias[RCOMP], 847 ctx->Pixel.PostConvolutionBias[GCOMP], 848 ctx->Pixel.PostConvolutionBias[BCOMP], 849 ctx->Pixel.PostConvolutionBias[ACOMP]); 850 } 851 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 852 if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 853 _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 854 } 855 /* color matrix transform */ 856 if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 857 _mesa_transform_rgba(ctx, n, rgba); 858 } 859 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 860 if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 861 _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 862 } 863 /* update histogram count */ 864 if (transferOps & IMAGE_HISTOGRAM_BIT) { 865 _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 866 } 867 /* min/max here */ 868 if (transferOps & IMAGE_MIN_MAX_BIT) { 869 _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 870 if (ctx->MinMax.Sink) 871 return; 872 } 873 } 874 else { 875 /* use incoming data, not a copy */ 876 rgba = (GLfloat (*)[4]) rgbaIn; 877 } 878 879 /* XXX clamp rgba to [0,1]? */ 880 881 882 if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 883 for (i = 0; i < n; i++) { 884 GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 885 luminance[i] = CLAMP(sum, 0.0F, 1.0F); 886 } 887 } 888 889 /* 890 * Pack/store the pixels. Ugh! Lots of cases!!! 891 */ 892 switch (dstType) { 893 case GL_UNSIGNED_BYTE: 894 { 895 GLubyte *dst = (GLubyte *) dstAddr; 896 switch (dstFormat) { 897 case GL_RED: 898 for (i=0;i<n;i++) 899 dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 900 break; 901 case GL_GREEN: 902 for (i=0;i<n;i++) 903 dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 904 break; 905 case GL_BLUE: 906 for (i=0;i<n;i++) 907 dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 908 break; 909 case GL_ALPHA: 910 for (i=0;i<n;i++) 911 dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 912 break; 913 case GL_LUMINANCE: 914 for (i=0;i<n;i++) 915 dst[i] = FLOAT_TO_UBYTE(luminance[i]); 916 break; 917 case GL_LUMINANCE_ALPHA: 918 for (i=0;i<n;i++) { 919 dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 920 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 921 } 922 break; 923 case GL_RGB: 924 for (i=0;i<n;i++) { 925 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 926 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 927 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 928 } 929 break; 930 case GL_RGBA: 931 for (i=0;i<n;i++) { 932 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 933 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 934 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 935 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 936 } 937 break; 938 case GL_BGR: 939 for (i=0;i<n;i++) { 940 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 941 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 942 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 943 } 944 break; 945 case GL_BGRA: 946 for (i=0;i<n;i++) { 947 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 948 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 949 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 950 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 951 } 952 break; 953 case GL_ABGR_EXT: 954 for (i=0;i<n;i++) { 955 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 956 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 957 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 958 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 959 } 960 break; 961 default: 962 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 963 } 964 } 965 break; 966 case GL_BYTE: 967 { 968 GLbyte *dst = (GLbyte *) dstAddr; 969 switch (dstFormat) { 970 case GL_RED: 971 for (i=0;i<n;i++) 972 dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 973 break; 974 case GL_GREEN: 975 for (i=0;i<n;i++) 976 dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 977 break; 978 case GL_BLUE: 979 for (i=0;i<n;i++) 980 dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 981 break; 982 case GL_ALPHA: 983 for (i=0;i<n;i++) 984 dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 985 break; 986 case GL_LUMINANCE: 987 for (i=0;i<n;i++) 988 dst[i] = FLOAT_TO_BYTE(luminance[i]); 989 break; 990 case GL_LUMINANCE_ALPHA: 991 for (i=0;i<n;i++) { 992 dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 993 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 994 } 995 break; 996 case GL_RGB: 997 for (i=0;i<n;i++) { 998 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 999 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1000 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1001 } 1002 break; 1003 case GL_RGBA: 1004 for (i=0;i<n;i++) { 1005 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1006 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1007 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1008 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1009 } 1010 break; 1011 case GL_BGR: 1012 for (i=0;i<n;i++) { 1013 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1014 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1015 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1016 } 1017 break; 1018 case GL_BGRA: 1019 for (i=0;i<n;i++) { 1020 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1021 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1022 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1023 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1024 } 1025 case GL_ABGR_EXT: 1026 for (i=0;i<n;i++) { 1027 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 1028 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 1029 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 1030 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 1031 } 1032 break; 1033 default: 1034 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1035 } 1036 } 1037 break; 1038 case GL_UNSIGNED_SHORT: 1039 { 1040 GLushort *dst = (GLushort *) dstAddr; 1041 switch (dstFormat) { 1042 case GL_RED: 1043 for (i=0;i<n;i++) 1044 dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1045 break; 1046 case GL_GREEN: 1047 for (i=0;i<n;i++) 1048 dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1049 break; 1050 case GL_BLUE: 1051 for (i=0;i<n;i++) 1052 dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1053 break; 1054 case GL_ALPHA: 1055 for (i=0;i<n;i++) 1056 dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1057 break; 1058 case GL_LUMINANCE: 1059 for (i=0;i<n;i++) 1060 dst[i] = FLOAT_TO_USHORT(luminance[i]); 1061 break; 1062 case GL_LUMINANCE_ALPHA: 1063 for (i=0;i<n;i++) { 1064 dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]); 1065 dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1066 } 1067 break; 1068 case GL_RGB: 1069 for (i=0;i<n;i++) { 1070 dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1071 dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1072 dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1073 } 1074 break; 1075 case GL_RGBA: 1076 for (i=0;i<n;i++) { 1077 dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1078 dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1079 dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1080 dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1081 } 1082 break; 1083 case GL_BGR: 1084 for (i=0;i<n;i++) { 1085 dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1086 dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1087 dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1088 } 1089 break; 1090 case GL_BGRA: 1091 for (i=0;i<n;i++) { 1092 dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1093 dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1094 dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1095 dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1096 } 1097 break; 1098 case GL_ABGR_EXT: 1099 for (i=0;i<n;i++) { 1100 dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]); 1101 dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]); 1102 dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 1103 dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 1104 } 1105 break; 1106 default: 1107 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1108 } 1109 if (dstPacking->SwapBytes) { 1110 _mesa_swap2( (GLushort *) dst, n * comps); 1111 } 1112 } 1113 break; 1114 case GL_SHORT: 1115 { 1116 GLshort *dst = (GLshort *) dstAddr; 1117 switch (dstFormat) { 1118 case GL_RED: 1119 for (i=0;i<n;i++) 1120 dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1121 break; 1122 case GL_GREEN: 1123 for (i=0;i<n;i++) 1124 dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1125 break; 1126 case GL_BLUE: 1127 for (i=0;i<n;i++) 1128 dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1129 break; 1130 case GL_ALPHA: 1131 for (i=0;i<n;i++) 1132 dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1133 break; 1134 case GL_LUMINANCE: 1135 for (i=0;i<n;i++) 1136 dst[i] = FLOAT_TO_SHORT(luminance[i]); 1137 break; 1138 case GL_LUMINANCE_ALPHA: 1139 for (i=0;i<n;i++) { 1140 dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 1141 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1142 } 1143 break; 1144 case GL_RGB: 1145 for (i=0;i<n;i++) { 1146 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1147 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1148 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1149 } 1150 break; 1151 case GL_RGBA: 1152 for (i=0;i<n;i++) { 1153 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1154 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1155 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1156 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1157 } 1158 break; 1159 case GL_BGR: 1160 for (i=0;i<n;i++) { 1161 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1162 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1163 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1164 } 1165 break; 1166 case GL_BGRA: 1167 for (i=0;i<n;i++) { 1168 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1169 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1170 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1171 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1172 } 1173 case GL_ABGR_EXT: 1174 for (i=0;i<n;i++) { 1175 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 1176 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 1177 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 1178 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 1179 } 1180 break; 1181 default: 1182 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1183 } 1184 if (dstPacking->SwapBytes) { 1185 _mesa_swap2( (GLushort *) dst, n * comps ); 1186 } 1187 } 1188 break; 1189 case GL_UNSIGNED_INT: 1190 { 1191 GLuint *dst = (GLuint *) dstAddr; 1192 switch (dstFormat) { 1193 case GL_RED: 1194 for (i=0;i<n;i++) 1195 dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1196 break; 1197 case GL_GREEN: 1198 for (i=0;i<n;i++) 1199 dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1200 break; 1201 case GL_BLUE: 1202 for (i=0;i<n;i++) 1203 dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1204 break; 1205 case GL_ALPHA: 1206 for (i=0;i<n;i++) 1207 dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1208 break; 1209 case GL_LUMINANCE: 1210 for (i=0;i<n;i++) 1211 dst[i] = FLOAT_TO_UINT(luminance[i]); 1212 break; 1213 case GL_LUMINANCE_ALPHA: 1214 for (i=0;i<n;i++) { 1215 dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 1216 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1217 } 1218 break; 1219 case GL_RGB: 1220 for (i=0;i<n;i++) { 1221 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1222 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1223 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1224 } 1225 break; 1226 case GL_RGBA: 1227 for (i=0;i<n;i++) { 1228 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1229 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1230 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1231 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1232 } 1233 break; 1234 case GL_BGR: 1235 for (i=0;i<n;i++) { 1236 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1237 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1238 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1239 } 1240 break; 1241 case GL_BGRA: 1242 for (i=0;i<n;i++) { 1243 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1244 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1245 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1246 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1247 } 1248 break; 1249 case GL_ABGR_EXT: 1250 for (i=0;i<n;i++) { 1251 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 1252 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 1253 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 1254 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 1255 } 1256 break; 1257 default: 1258 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1259 } 1260 if (dstPacking->SwapBytes) { 1261 _mesa_swap4( (GLuint *) dst, n * comps ); 1262 } 1263 } 1264 break; 1265 case GL_INT: 1266 { 1267 GLint *dst = (GLint *) dstAddr; 1268 switch (dstFormat) { 1269 case GL_RED: 1270 for (i=0;i<n;i++) 1271 dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 1272 break; 1273 case GL_GREEN: 1274 for (i=0;i<n;i++) 1275 dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 1276 break; 1277 case GL_BLUE: 1278 for (i=0;i<n;i++) 1279 dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 1280 break; 1281 case GL_ALPHA: 1282 for (i=0;i<n;i++) 1283 dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 1284 break; 1285 case GL_LUMINANCE: 1286 for (i=0;i<n;i++) 1287 dst[i] = FLOAT_TO_INT(luminance[i]); 1288 break; 1289 case GL_LUMINANCE_ALPHA: 1290 for (i=0;i<n;i++) { 1291 dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 1292 dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 1293 } 1294 break; 1295 case GL_RGB: 1296 for (i=0;i<n;i++) { 1297 dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1298 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1299 dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1300 } 1301 break; 1302 case GL_RGBA: 1303 for (i=0;i<n;i++) { 1304 dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 1305 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1306 dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 1307 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1308 } 1309 break; 1310 case GL_BGR: 1311 for (i=0;i<n;i++) { 1312 dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1313 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1314 dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1315 } 1316 break; 1317 case GL_BGRA: 1318 for (i=0;i<n;i++) { 1319 dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 1320 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 1321 dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 1322 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 1323 } 1324 break; 1325 case GL_ABGR_EXT: 1326 for (i=0;i<n;i++) { 1327 dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 1328 dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 1329 dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 1330 dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 1331 } 1332 break; 1333 default: 1334 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1335 } 1336 if (dstPacking->SwapBytes) { 1337 _mesa_swap4( (GLuint *) dst, n * comps ); 1338 } 1339 } 1340 break; 1341 case GL_FLOAT: 1342 { 1343 GLfloat *dst = (GLfloat *) dstAddr; 1344 switch (dstFormat) { 1345 case GL_RED: 1346 for (i=0;i<n;i++) 1347 dst[i] = rgba[i][RCOMP]; 1348 break; 1349 case GL_GREEN: 1350 for (i=0;i<n;i++) 1351 dst[i] = rgba[i][GCOMP]; 1352 break; 1353 case GL_BLUE: 1354 for (i=0;i<n;i++) 1355 dst[i] = rgba[i][BCOMP]; 1356 break; 1357 case GL_ALPHA: 1358 for (i=0;i<n;i++) 1359 dst[i] = rgba[i][ACOMP]; 1360 break; 1361 case GL_LUMINANCE: 1362 for (i=0;i<n;i++) 1363 dst[i] = luminance[i]; 1364 break; 1365 case GL_LUMINANCE_ALPHA: 1366 for (i=0;i<n;i++) { 1367 dst[i*2+0] = luminance[i]; 1368 dst[i*2+1] = rgba[i][ACOMP]; 1369 } 1370 break; 1371 case GL_RGB: 1372 for (i=0;i<n;i++) { 1373 dst[i*3+0] = rgba[i][RCOMP]; 1374 dst[i*3+1] = rgba[i][GCOMP]; 1375 dst[i*3+2] = rgba[i][BCOMP]; 1376 } 1377 break; 1378 case GL_RGBA: 1379 for (i=0;i<n;i++) { 1380 dst[i*4+0] = rgba[i][RCOMP]; 1381 dst[i*4+1] = rgba[i][GCOMP]; 1382 dst[i*4+2] = rgba[i][BCOMP]; 1383 dst[i*4+3] = rgba[i][ACOMP]; 1384 } 1385 break; 1386 case GL_BGR: 1387 for (i=0;i<n;i++) { 1388 dst[i*3+0] = rgba[i][BCOMP]; 1389 dst[i*3+1] = rgba[i][GCOMP]; 1390 dst[i*3+2] = rgba[i][RCOMP]; 1391 } 1392 break; 1393 case GL_BGRA: 1394 for (i=0;i<n;i++) { 1395 dst[i*4+0] = rgba[i][BCOMP]; 1396 dst[i*4+1] = rgba[i][GCOMP]; 1397 dst[i*4+2] = rgba[i][RCOMP]; 1398 dst[i*4+3] = rgba[i][ACOMP]; 1399 } 1400 break; 1401 case GL_ABGR_EXT: 1402 for (i=0;i<n;i++) { 1403 dst[i*4+0] = rgba[i][ACOMP]; 1404 dst[i*4+1] = rgba[i][BCOMP]; 1405 dst[i*4+2] = rgba[i][GCOMP]; 1406 dst[i*4+3] = rgba[i][RCOMP]; 1407 } 1408 break; 1409 default: 1410 gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 1411 } 1412 if (dstPacking->SwapBytes) { 1413 _mesa_swap4( (GLuint *) dst, n * comps ); 1414 } 1415 } 1416 break; 1417 case GL_UNSIGNED_BYTE_3_3_2: 1418 if (dstFormat == GL_RGB) { 1419 GLubyte *dst = (GLubyte *) dstAddr; 1420 for (i=0;i<n;i++) { 1421 dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5) 1422 | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2) 1423 | (((GLint) (rgba[i][BCOMP] * 3.0F)) ); 1424 } 1425 } 1426 break; 1427 case GL_UNSIGNED_BYTE_2_3_3_REV: 1428 if (dstFormat == GL_RGB) { 1429 GLubyte *dst = (GLubyte *) dstAddr; 1430 for (i=0;i<n;i++) { 1431 dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) ) 1432 | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3) 1433 | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5); 1434 } 1435 } 1436 break; 1437 case GL_UNSIGNED_SHORT_5_6_5: 1438 if (dstFormat == GL_RGB) { 1439 GLushort *dst = (GLushort *) dstAddr; 1440 for (i=0;i<n;i++) { 1441 dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1442 | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1443 | (((GLint) (rgba[i][BCOMP] * 31.0F)) ); 1444 } 1445 } 1446 break; 1447 case GL_UNSIGNED_SHORT_5_6_5_REV: 1448 if (dstFormat == GL_RGB) { 1449 GLushort *dst = (GLushort *) dstAddr; 1450 for (i=0;i<n;i++) { 1451 dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1452 | (((GLint) (rgba[i][GCOMP] * 63.0F)) << 5) 1453 | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11); 1454 } 1455 } 1456 break; 1457 case GL_UNSIGNED_SHORT_4_4_4_4: 1458 if (dstFormat == GL_RGBA) { 1459 GLushort *dst = (GLushort *) dstAddr; 1460 for (i=0;i<n;i++) { 1461 dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12) 1462 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1463 | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1464 | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1465 } 1466 } 1467 else if (dstFormat == GL_BGRA) { 1468 GLushort *dst = (GLushort *) dstAddr; 1469 for (i=0;i<n;i++) { 1470 dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12) 1471 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1472 | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 4) 1473 | (((GLint) (rgba[i][ACOMP] * 15.0F)) ); 1474 } 1475 } 1476 else if (dstFormat == GL_ABGR_EXT) { 1477 GLushort *dst = (GLushort *) dstAddr; 1478 for (i=0;i<n;i++) { 1479 dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) << 4) 1480 | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1481 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12) 1482 | (((GLint) (rgba[i][RCOMP] * 15.0F)) ); 1483 } 1484 } 1485 break; 1486 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1487 if (dstFormat == GL_RGBA) { 1488 GLushort *dst = (GLushort *) dstAddr; 1489 for (i=0;i<n;i++) { 1490 dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) ) 1491 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1492 | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 8) 1493 | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1494 } 1495 } 1496 else if (dstFormat == GL_BGRA) { 1497 GLushort *dst = (GLushort *) dstAddr; 1498 for (i=0;i<n;i++) { 1499 dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) ) 1500 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 4) 1501 | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 8) 1502 | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12); 1503 } 1504 } 1505 else if (dstFormat == GL_ABGR_EXT) { 1506 GLushort *dst = (GLushort *) dstAddr; 1507 for (i=0;i<n;i++) { 1508 dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) ) 1509 | (((GLint) (rgba[i][BCOMP] * 15.0F)) << 4) 1510 | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 8) 1511 | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12); 1512 } 1513 } 1514 break; 1515 case GL_UNSIGNED_SHORT_5_5_5_1: 1516 if (dstFormat == GL_RGBA) { 1517 GLushort *dst = (GLushort *) dstAddr; 1518 for (i=0;i<n;i++) { 1519 dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11) 1520 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1521 | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 1) 1522 | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1523 } 1524 } 1525 else if (dstFormat == GL_BGRA) { 1526 GLushort *dst = (GLushort *) dstAddr; 1527 for (i=0;i<n;i++) { 1528 dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11) 1529 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 6) 1530 | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 1) 1531 | (((GLint) (rgba[i][ACOMP] * 1.0F)) ); 1532 } 1533 } 1534 else if (dstFormat == GL_ABGR_EXT) { 1535 GLushort *dst = (GLushort *) dstAddr; 1536 for (i=0;i<n;i++) { 1537 dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11) 1538 | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 6) 1539 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 1) 1540 | (((GLint) (rgba[i][RCOMP] * 1.0F)) ); 1541 } 1542 } 1543 break; 1544 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1545 if (dstFormat == GL_RGBA) { 1546 GLushort *dst = (GLushort *) dstAddr; 1547 for (i=0;i<n;i++) { 1548 dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) ) 1549 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1550 | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10) 1551 | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1552 } 1553 } 1554 else if (dstFormat == GL_BGRA) { 1555 GLushort *dst = (GLushort *) dstAddr; 1556 for (i=0;i<n;i++) { 1557 dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) ) 1558 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 5) 1559 | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10) 1560 | (((GLint) (rgba[i][ACOMP] * 1.0F)) << 15); 1561 } 1562 } 1563 else if (dstFormat == GL_ABGR_EXT) { 1564 GLushort *dst = (GLushort *) dstAddr; 1565 for (i=0;i<n;i++) { 1566 dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) ) 1567 | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 5) 1568 | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10) 1569 | (((GLint) (rgba[i][RCOMP] * 1.0F)) << 15); 1570 } 1571 } 1572 break; 1573 case GL_UNSIGNED_INT_8_8_8_8: 1574 if (dstFormat == GL_RGBA) { 1575 GLuint *dst = (GLuint *) dstAddr; 1576 for (i=0;i<n;i++) { 1577 dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24) 1578 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1579 | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1580 | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1581 } 1582 } 1583 else if (dstFormat == GL_BGRA) { 1584 GLuint *dst = (GLuint *) dstAddr; 1585 for (i=0;i<n;i++) { 1586 dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24) 1587 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1588 | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 8) 1589 | (((GLuint) (rgba[i][ACOMP] * 255.0F)) ); 1590 } 1591 } 1592 else if (dstFormat == GL_ABGR_EXT) { 1593 GLuint *dst = (GLuint *) dstAddr; 1594 for (i=0;i<n;i++) { 1595 dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24) 1596 | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1597 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1598 | (((GLuint) (rgba[i][RCOMP] * 255.0F)) ); 1599 } 1600 } 1601 break; 1602 case GL_UNSIGNED_INT_8_8_8_8_REV: 1603 if (dstFormat == GL_RGBA) { 1604 GLuint *dst = (GLuint *) dstAddr; 1605 for (i=0;i<n;i++) { 1606 dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) ) 1607 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1608 | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16) 1609 | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1610 } 1611 } 1612 else if (dstFormat == GL_BGRA) { 1613 GLuint *dst = (GLuint *) dstAddr; 1614 for (i=0;i<n;i++) { 1615 dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) ) 1616 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 8) 1617 | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16) 1618 | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24); 1619 } 1620 } 1621 else if (dstFormat == GL_ABGR_EXT) { 1622 GLuint *dst = (GLuint *) dstAddr; 1623 for (i=0;i<n;i++) { 1624 dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) ) 1625 | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 8) 1626 | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16) 1627 | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24); 1628 } 1629 } 1630 break; 1631 case GL_UNSIGNED_INT_10_10_10_2: 1632 if (dstFormat == GL_RGBA) { 1633 GLuint *dst = (GLuint *) dstAddr; 1634 for (i=0;i<n;i++) { 1635 dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22) 1636 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1637 | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 2) 1638 | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1639 } 1640 } 1641 else if (dstFormat == GL_BGRA) { 1642 GLuint *dst = (GLuint *) dstAddr; 1643 for (i=0;i<n;i++) { 1644 dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22) 1645 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12) 1646 | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 2) 1647 | (((GLuint) (rgba[i][ACOMP] * 3.0F)) ); 1648 } 1649 } 1650 else if (dstFormat == GL_ABGR_EXT) { 1651 GLuint *dst = (GLuint *) dstAddr; 1652 for (i=0;i<n;i++) { 1653 dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22) 1654 | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12) 1655 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 2) 1656 | (((GLuint) (rgba[i][RCOMP] * 3.0F)) ); 1657 } 1658 } 1659 break; 1660 case GL_UNSIGNED_INT_2_10_10_10_REV: 1661 if (dstFormat == GL_RGBA) { 1662 GLuint *dst = (GLuint *) dstAddr; 1663 for (i=0;i<n;i++) { 1664 dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) ) 1665 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1666 | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20) 1667 | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1668 } 1669 } 1670 else if (dstFormat == GL_BGRA) { 1671 GLuint *dst = (GLuint *) dstAddr; 1672 for (i=0;i<n;i++) { 1673 dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) ) 1674 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10) 1675 | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20) 1676 | (((GLuint) (rgba[i][ACOMP] * 3.0F)) << 30); 1677 } 1678 } 1679 else if (dstFormat == GL_ABGR_EXT) { 1680 GLuint *dst = (GLuint *) dstAddr; 1681 for (i=0;i<n;i++) { 1682 dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) ) 1683 | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10) 1684 | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20) 1685 | (((GLuint) (rgba[i][RCOMP] * 3.0F)) << 30); 1686 } 1687 } 1688 break; 1689 default: 1690 gl_problem(ctx, "bad type in _mesa_pack_float_rgba_span"); 1691 } 1692} 1693 1694 1695 1696/* 1697 * Pack the given RGBA span into client memory at 'dest' address 1698 * in the given pixel format and type. 1699 * Optionally apply the enabled pixel transfer ops. 1700 * Pack into memory using the given packing params struct. 1701 * This is used by glReadPixels and glGetTexImage?D() 1702 * Input: ctx - the context 1703 * n - number of pixels in the span 1704 * rgba - the pixels 1705 * format - dest packing format 1706 * type - dest packing datatype 1707 * destination - destination packing address 1708 * packing - pixel packing parameters 1709 * transferOps - bitmask of IMAGE_*_BIT operations to apply 1710 */ 1711void 1712_mesa_pack_rgba_span( GLcontext *ctx, 1713 GLuint n, CONST GLchan srcRgba[][4], 1714 GLenum dstFormat, GLenum dstType, 1715 GLvoid *dstAddr, 1716 const struct gl_pixelstore_attrib *dstPacking, 1717 GLuint transferOps) 1718{ 1719 ASSERT((ctx->NewState & _NEW_PIXEL) == 0); 1720 1721 /* Test for optimized case first */ 1722 if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) { 1723 /* common simple case */ 1724 MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan)); 1725 } 1726 else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) { 1727 /* common simple case */ 1728 GLint i; 1729 GLchan *dest = (GLchan *) dstAddr; 1730 for (i = 0; i < n; i++) { 1731 dest[0] = srcRgba[i][RCOMP]; 1732 dest[1] = srcRgba[i][GCOMP]; 1733 dest[2] = srcRgba[i][BCOMP]; 1734 dest += 3; 1735 } 1736 } 1737 else { 1738 /* general solution */ 1739 GLfloat rgba[MAX_WIDTH][4]; 1740 GLuint i; 1741 assert(n <= MAX_WIDTH); 1742 /* convert color components to floating point */ 1743 for (i=0;i<n;i++) { 1744 rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]); 1745 rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]); 1746 rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]); 1747 rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]); 1748 } 1749 _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba, 1750 dstFormat, dstType, dstAddr, 1751 dstPacking, transferOps); 1752 } 1753} 1754 1755 1756#define SWAP2BYTE(VALUE) \ 1757 { \ 1758 GLubyte *bytes = (GLubyte *) &(VALUE); \ 1759 GLubyte tmp = bytes[0]; \ 1760 bytes[0] = bytes[1]; \ 1761 bytes[1] = tmp; \ 1762 } 1763 1764#define SWAP4BYTE(VALUE) \ 1765 { \ 1766 GLubyte *bytes = (GLubyte *) &(VALUE); \ 1767 GLubyte tmp = bytes[0]; \ 1768 bytes[0] = bytes[3]; \ 1769 bytes[3] = tmp; \ 1770 tmp = bytes[1]; \ 1771 bytes[1] = bytes[2]; \ 1772 bytes[2] = tmp; \ 1773 } 1774 1775 1776static void 1777extract_uint_indexes(GLuint n, GLuint indexes[], 1778 GLenum srcFormat, GLenum srcType, const GLvoid *src, 1779 const struct gl_pixelstore_attrib *unpack ) 1780{ 1781 assert(srcFormat == GL_COLOR_INDEX); 1782 1783 ASSERT(srcType == GL_BITMAP || 1784 srcType == GL_UNSIGNED_BYTE || 1785 srcType == GL_BYTE || 1786 srcType == GL_UNSIGNED_SHORT || 1787 srcType == GL_SHORT || 1788 srcType == GL_UNSIGNED_INT || 1789 srcType == GL_INT || 1790 srcType == GL_FLOAT); 1791 1792 switch (srcType) { 1793 case GL_BITMAP: 1794 { 1795 GLubyte *ubsrc = (GLubyte *) src; 1796 if (unpack->LsbFirst) { 1797 GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 1798 GLuint i; 1799 for (i = 0; i < n; i++) { 1800 indexes[i] = (*ubsrc & mask) ? 1 : 0; 1801 if (mask == 128) { 1802 mask = 1; 1803 ubsrc++; 1804 } 1805 else { 1806 mask = mask << 1; 1807 } 1808 } 1809 } 1810 else { 1811 GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 1812 GLuint i; 1813 for (i = 0; i < n; i++) { 1814 indexes[i] = (*ubsrc & mask) ? 1 : 0; 1815 if (mask == 1) { 1816 mask = 128; 1817 ubsrc++; 1818 } 1819 else { 1820 mask = mask >> 1; 1821 } 1822 } 1823 } 1824 } 1825 break; 1826 case GL_UNSIGNED_BYTE: 1827 { 1828 GLuint i; 1829 const GLubyte *s = (const GLubyte *) src; 1830 for (i = 0; i < n; i++) 1831 indexes[i] = s[i]; 1832 } 1833 break; 1834 case GL_BYTE: 1835 { 1836 GLuint i; 1837 const GLbyte *s = (const GLbyte *) src; 1838 for (i = 0; i < n; i++) 1839 indexes[i] = s[i]; 1840 } 1841 break; 1842 case GL_UNSIGNED_SHORT: 1843 { 1844 GLuint i; 1845 const GLushort *s = (const GLushort *) src; 1846 if (unpack->SwapBytes) { 1847 for (i = 0; i < n; i++) { 1848 GLushort value = s[i]; 1849 SWAP2BYTE(value); 1850 indexes[i] = value; 1851 } 1852 } 1853 else { 1854 for (i = 0; i < n; i++) 1855 indexes[i] = s[i]; 1856 } 1857 } 1858 break; 1859 case GL_SHORT: 1860 { 1861 GLuint i; 1862 const GLshort *s = (const GLshort *) src; 1863 if (unpack->SwapBytes) { 1864 for (i = 0; i < n; i++) { 1865 GLshort value = s[i]; 1866 SWAP2BYTE(value); 1867 indexes[i] = value; 1868 } 1869 } 1870 else { 1871 for (i = 0; i < n; i++) 1872 indexes[i] = s[i]; 1873 } 1874 } 1875 break; 1876 case GL_UNSIGNED_INT: 1877 { 1878 GLuint i; 1879 const GLuint *s = (const GLuint *) src; 1880 if (unpack->SwapBytes) { 1881 for (i = 0; i < n; i++) { 1882 GLuint value = s[i]; 1883 SWAP4BYTE(value); 1884 indexes[i] = value; 1885 } 1886 } 1887 else { 1888 for (i = 0; i < n; i++) 1889 indexes[i] = s[i]; 1890 } 1891 } 1892 break; 1893 case GL_INT: 1894 { 1895 GLuint i; 1896 const GLint *s = (const GLint *) src; 1897 if (unpack->SwapBytes) { 1898 for (i = 0; i < n; i++) { 1899 GLint value = s[i]; 1900 SWAP4BYTE(value); 1901 indexes[i] = value; 1902 } 1903 } 1904 else { 1905 for (i = 0; i < n; i++) 1906 indexes[i] = s[i]; 1907 } 1908 } 1909 break; 1910 case GL_FLOAT: 1911 { 1912 GLuint i; 1913 const GLfloat *s = (const GLfloat *) src; 1914 if (unpack->SwapBytes) { 1915 for (i = 0; i < n; i++) { 1916 GLfloat value = s[i]; 1917 SWAP4BYTE(value); 1918 indexes[i] = (GLuint) value; 1919 } 1920 } 1921 else { 1922 for (i = 0; i < n; i++) 1923 indexes[i] = (GLuint) s[i]; 1924 } 1925 } 1926 break; 1927 default: 1928 gl_problem(NULL, "bad srcType in extract_uint_indexes"); 1929 return; 1930 } 1931} 1932 1933 1934 1935/* 1936 * This function extracts floating point RGBA values from arbitrary 1937 * image data. srcFormat and srcType are the format and type parameters 1938 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 1939 * 1940 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 1941 * implements the "Conversion to floating point", "Conversion to RGB", 1942 * and "Final Expansion to RGBA" operations. 1943 * 1944 * Args: n - number of pixels 1945 * rgba - output colors 1946 * srcFormat - format of incoming data 1947 * srcType - datatype of incoming data 1948 * src - source data pointer 1949 * swapBytes - perform byteswapping of incoming data? 1950 */ 1951static void 1952extract_float_rgba(GLuint n, GLfloat rgba[][4], 1953 GLenum srcFormat, GLenum srcType, const GLvoid *src, 1954 GLboolean swapBytes) 1955{ 1956 GLint redIndex, greenIndex, blueIndex, alphaIndex; 1957 GLint stride; 1958 GLint rComp, bComp, gComp, aComp; 1959 1960 ASSERT(srcFormat == GL_RED || 1961 srcFormat == GL_GREEN || 1962 srcFormat == GL_BLUE || 1963 srcFormat == GL_ALPHA || 1964 srcFormat == GL_LUMINANCE || 1965 srcFormat == GL_LUMINANCE_ALPHA || 1966 srcFormat == GL_INTENSITY || 1967 srcFormat == GL_RGB || 1968 srcFormat == GL_BGR || 1969 srcFormat == GL_RGBA || 1970 srcFormat == GL_BGRA || 1971 srcFormat == GL_ABGR_EXT); 1972 1973 ASSERT(srcType == GL_UNSIGNED_BYTE || 1974 srcType == GL_BYTE || 1975 srcType == GL_UNSIGNED_SHORT || 1976 srcType == GL_SHORT || 1977 srcType == GL_UNSIGNED_INT || 1978 srcType == GL_INT || 1979 srcType == GL_FLOAT || 1980 srcType == GL_UNSIGNED_BYTE_3_3_2 || 1981 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 1982 srcType == GL_UNSIGNED_SHORT_5_6_5 || 1983 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 1984 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 1985 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 1986 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 1987 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 1988 srcType == GL_UNSIGNED_INT_8_8_8_8 || 1989 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 1990 srcType == GL_UNSIGNED_INT_10_10_10_2 || 1991 srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 1992 1993 rComp = gComp = bComp = aComp = -1; 1994 1995 switch (srcFormat) { 1996 case GL_RED: 1997 redIndex = 0; 1998 greenIndex = blueIndex = alphaIndex = -1; 1999 stride = 1; 2000 break; 2001 case GL_GREEN: 2002 greenIndex = 0; 2003 redIndex = blueIndex = alphaIndex = -1; 2004 stride = 1; 2005 break; 2006 case GL_BLUE: 2007 blueIndex = 0; 2008 redIndex = greenIndex = alphaIndex = -1; 2009 stride = 1; 2010 break; 2011 case GL_ALPHA: 2012 redIndex = greenIndex = blueIndex = -1; 2013 alphaIndex = 0; 2014 stride = 1; 2015 break; 2016 case GL_LUMINANCE: 2017 redIndex = greenIndex = blueIndex = 0; 2018 alphaIndex = -1; 2019 stride = 1; 2020 break; 2021 case GL_LUMINANCE_ALPHA: 2022 redIndex = greenIndex = blueIndex = 0; 2023 alphaIndex = 1; 2024 stride = 2; 2025 break; 2026 case GL_INTENSITY: 2027 redIndex = 0; 2028 greenIndex = blueIndex = alphaIndex = -1; 2029 stride = 1; 2030 break; 2031 case GL_RGB: 2032 redIndex = 0; 2033 greenIndex = 1; 2034 blueIndex = 2; 2035 alphaIndex = -1; 2036 stride = 3; 2037 break; 2038 case GL_BGR: 2039 redIndex = 2; 2040 greenIndex = 1; 2041 blueIndex = 0; 2042 alphaIndex = -1; 2043 stride = 3; 2044 break; 2045 case GL_RGBA: 2046 redIndex = 0; 2047 greenIndex = 1; 2048 blueIndex = 2; 2049 alphaIndex = 3; 2050 rComp = 0; 2051 gComp = 1; 2052 bComp = 2; 2053 aComp = 3; 2054 stride = 4; 2055 break; 2056 case GL_BGRA: 2057 redIndex = 2; 2058 greenIndex = 1; 2059 blueIndex = 0; 2060 alphaIndex = 3; 2061 rComp = 2; 2062 gComp = 1; 2063 bComp = 0; 2064 aComp = 3; 2065 stride = 4; 2066 break; 2067 case GL_ABGR_EXT: 2068 redIndex = 3; 2069 greenIndex = 2; 2070 blueIndex = 1; 2071 alphaIndex = 0; 2072 rComp = 3; 2073 gComp = 2; 2074 bComp = 1; 2075 aComp = 0; 2076 stride = 4; 2077 break; 2078 default: 2079 gl_problem(NULL, "bad srcFormat in extract float data"); 2080 return; 2081 } 2082 2083 2084#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \ 2085 if ((INDEX) < 0) { \ 2086 GLuint i; \ 2087 for (i = 0; i < n; i++) { \ 2088 rgba[i][CHANNEL] = DEFAULT; \ 2089 } \ 2090 } \ 2091 else if (swapBytes) { \ 2092 const TYPE *s = (const TYPE *) src; \ 2093 GLuint i; \ 2094 for (i = 0; i < n; i++) { \ 2095 TYPE value = s[INDEX]; \ 2096 if (sizeof(TYPE) == 2) { \ 2097 SWAP2BYTE(value); \ 2098 } \ 2099 else if (sizeof(TYPE) == 4) { \ 2100 SWAP4BYTE(value); \ 2101 } \ 2102 rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \ 2103 s += stride; \ 2104 } \ 2105 } \ 2106 else { \ 2107 const TYPE *s = (const TYPE *) src; \ 2108 GLuint i; \ 2109 for (i = 0; i < n; i++) { \ 2110 rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \ 2111 s += stride; \ 2112 } \ 2113 } 2114 2115 switch (srcType) { 2116 case GL_UNSIGNED_BYTE: 2117 PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2118 PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2119 PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT); 2120 PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT); 2121 break; 2122 case GL_BYTE: 2123 PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2124 PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2125 PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT); 2126 PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT); 2127 break; 2128 case GL_UNSIGNED_SHORT: 2129 PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2130 PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2131 PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT); 2132 PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT); 2133 break; 2134 case GL_SHORT: 2135 PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2136 PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2137 PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT); 2138 PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT); 2139 break; 2140 case GL_UNSIGNED_INT: 2141 PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2142 PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2143 PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT); 2144 PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT); 2145 break; 2146 case GL_INT: 2147 PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT); 2148 PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT); 2149 PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT); 2150 PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT); 2151 break; 2152 case GL_FLOAT: 2153 PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat)); 2154 PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat)); 2155 PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat)); 2156 PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat)); 2157 break; 2158 case GL_UNSIGNED_BYTE_3_3_2: 2159 { 2160 const GLubyte *ubsrc = (const GLubyte *) src; 2161 GLuint i; 2162 for (i = 0; i < n; i ++) { 2163 GLubyte p = ubsrc[i]; 2164 rgba[i][RCOMP] = ((p >> 5) ) * (1.0F / 7.0F); 2165 rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F); 2166 rgba[i][BCOMP] = ((p ) & 0x3) * (1.0F / 3.0F); 2167 rgba[i][ACOMP] = 1.0F; 2168 } 2169 } 2170 break; 2171 case GL_UNSIGNED_BYTE_2_3_3_REV: 2172 { 2173 const GLubyte *ubsrc = (const GLubyte *) src; 2174 GLuint i; 2175 for (i = 0; i < n; i ++) { 2176 GLubyte p = ubsrc[i]; 2177 rgba[i][RCOMP] = ((p ) & 0x7) * (1.0F / 7.0F); 2178 rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F); 2179 rgba[i][BCOMP] = ((p >> 6) ) * (1.0F / 3.0F); 2180 rgba[i][ACOMP] = 1.0F; 2181 } 2182 } 2183 break; 2184 case GL_UNSIGNED_SHORT_5_6_5: 2185 if (swapBytes) { 2186 const GLushort *ussrc = (const GLushort *) src; 2187 GLuint i; 2188 for (i = 0; i < n; i ++) { 2189 GLushort p = ussrc[i]; 2190 SWAP2BYTE(p); 2191 rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2192 rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2193 rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2194 rgba[i][ACOMP] = 1.0F; 2195 } 2196 } 2197 else { 2198 const GLushort *ussrc = (const GLushort *) src; 2199 GLuint i; 2200 for (i = 0; i < n; i ++) { 2201 GLushort p = ussrc[i]; 2202 rgba[i][RCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2203 rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2204 rgba[i][BCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2205 rgba[i][ACOMP] = 1.0F; 2206 } 2207 } 2208 break; 2209 case GL_UNSIGNED_SHORT_5_6_5_REV: 2210 if (swapBytes) { 2211 const GLushort *ussrc = (const GLushort *) src; 2212 GLuint i; 2213 for (i = 0; i < n; i ++) { 2214 GLushort p = ussrc[i]; 2215 SWAP2BYTE(p); 2216 rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2217 rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2218 rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2219 rgba[i][ACOMP] = 1.0F; 2220 } 2221 } 2222 else { 2223 const GLushort *ussrc = (const GLushort *) src; 2224 GLuint i; 2225 for (i = 0; i < n; i ++) { 2226 GLushort p = ussrc[i]; 2227 rgba[i][RCOMP] = ((p ) & 0x1f) * (1.0F / 31.0F); 2228 rgba[i][GCOMP] = ((p >> 5) & 0x3f) * (1.0F / 63.0F); 2229 rgba[i][BCOMP] = ((p >> 11) ) * (1.0F / 31.0F); 2230 rgba[i][ACOMP] = 1.0F; 2231 } 2232 } 2233 break; 2234 case GL_UNSIGNED_SHORT_4_4_4_4: 2235 if (swapBytes) { 2236 const GLushort *ussrc = (const GLushort *) src; 2237 GLuint i; 2238 for (i = 0; i < n; i ++) { 2239 GLushort p = ussrc[i]; 2240 SWAP2BYTE(p); 2241 rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2242 rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2243 rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2244 rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2245 } 2246 } 2247 else { 2248 const GLushort *ussrc = (const GLushort *) src; 2249 GLuint i; 2250 for (i = 0; i < n; i ++) { 2251 GLushort p = ussrc[i]; 2252 rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F); 2253 rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2254 rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2255 rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2256 } 2257 } 2258 break; 2259 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2260 if (swapBytes) { 2261 const GLushort *ussrc = (const GLushort *) src; 2262 GLuint i; 2263 for (i = 0; i < n; i ++) { 2264 GLushort p = ussrc[i]; 2265 SWAP2BYTE(p); 2266 rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2267 rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2268 rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2269 rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2270 } 2271 } 2272 else { 2273 const GLushort *ussrc = (const GLushort *) src; 2274 GLuint i; 2275 for (i = 0; i < n; i ++) { 2276 GLushort p = ussrc[i]; 2277 rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F); 2278 rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F); 2279 rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F); 2280 rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F); 2281 } 2282 } 2283 break; 2284 case GL_UNSIGNED_SHORT_5_5_5_1: 2285 if (swapBytes) { 2286 const GLushort *ussrc = (const GLushort *) src; 2287 GLuint i; 2288 for (i = 0; i < n; i ++) { 2289 GLushort p = ussrc[i]; 2290 SWAP2BYTE(p); 2291 rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2292 rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2293 rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2294 rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2295 } 2296 } 2297 else { 2298 const GLushort *ussrc = (const GLushort *) src; 2299 GLuint i; 2300 for (i = 0; i < n; i ++) { 2301 GLushort p = ussrc[i]; 2302 rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F); 2303 rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F); 2304 rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F); 2305 rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F); 2306 } 2307 } 2308 break; 2309 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2310 if (swapBytes) { 2311 const GLushort *ussrc = (const GLushort *) src; 2312 GLuint i; 2313 for (i = 0; i < n; i ++) { 2314 GLushort p = ussrc[i]; 2315 SWAP2BYTE(p); 2316 rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2317 rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2318 rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2319 rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2320 } 2321 } 2322 else { 2323 const GLushort *ussrc = (const GLushort *) src; 2324 GLuint i; 2325 for (i = 0; i < n; i ++) { 2326 GLushort p = ussrc[i]; 2327 rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F); 2328 rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F); 2329 rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F); 2330 rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F); 2331 } 2332 } 2333 break; 2334 case GL_UNSIGNED_INT_8_8_8_8: 2335 if (swapBytes) { 2336 const GLuint *uisrc = (const GLuint *) src; 2337 GLuint i; 2338 for (i = 0; i < n; i ++) { 2339 GLuint p = uisrc[i]; 2340 rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2341 rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 2342 rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 2343 rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2344 } 2345 } 2346 else { 2347 const GLuint *uisrc = (const GLuint *) src; 2348 GLuint i; 2349 for (i = 0; i < n; i ++) { 2350 GLuint p = uisrc[i]; 2351 rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 2352 rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 2353 rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 2354 rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2355 } 2356 } 2357 break; 2358 case GL_UNSIGNED_INT_8_8_8_8_REV: 2359 if (swapBytes) { 2360 const GLuint *uisrc = (const GLuint *) src; 2361 GLuint i; 2362 for (i = 0; i < n; i ++) { 2363 GLuint p = uisrc[i]; 2364 rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) ); 2365 rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 2366 rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 2367 rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2368 } 2369 } 2370 else { 2371 const GLuint *uisrc = (const GLuint *) src; 2372 GLuint i; 2373 for (i = 0; i < n; i ++) { 2374 GLuint p = uisrc[i]; 2375 rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff); 2376 rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 2377 rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 2378 rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) ); 2379 } 2380 } 2381 break; 2382 case GL_UNSIGNED_INT_10_10_10_2: 2383 if (swapBytes) { 2384 const GLuint *uisrc = (const GLuint *) src; 2385 GLuint i; 2386 for (i = 0; i < n; i ++) { 2387 GLuint p = uisrc[i]; 2388 SWAP4BYTE(p); 2389 rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2390 rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2391 rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2392 rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2393 } 2394 } 2395 else { 2396 const GLuint *uisrc = (const GLuint *) src; 2397 GLuint i; 2398 for (i = 0; i < n; i ++) { 2399 GLuint p = uisrc[i]; 2400 rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F); 2401 rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); 2402 rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F); 2403 rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F); 2404 } 2405 } 2406 break; 2407 case GL_UNSIGNED_INT_2_10_10_10_REV: 2408 if (swapBytes) { 2409 const GLuint *uisrc = (const GLuint *) src; 2410 GLuint i; 2411 for (i = 0; i < n; i ++) { 2412 GLuint p = uisrc[i]; 2413 SWAP4BYTE(p); 2414 rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2415 rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2416 rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2417 rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2418 } 2419 } 2420 else { 2421 const GLuint *uisrc = (const GLuint *) src; 2422 GLuint i; 2423 for (i = 0; i < n; i ++) { 2424 GLuint p = uisrc[i]; 2425 rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F); 2426 rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); 2427 rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); 2428 rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F); 2429 } 2430 } 2431 break; 2432 default: 2433 gl_problem(NULL, "bad srcType in extract float data"); 2434 break; 2435 } 2436} 2437 2438 2439 2440/* 2441 * Unpack a row of color image data from a client buffer according to 2442 * the pixel unpacking parameters. 2443 * Return GLubyte values in the specified dest image format. 2444 * This is (or will be) used by glDrawPixels and glTexImage?D(). 2445 * Input: ctx - the context 2446 * n - number of pixels in the span 2447 * dstFormat - format of destination color array 2448 * dest - the destination color array 2449 * srcFormat - source image format 2450 * srcType - source image datatype 2451 * source - source image pointer 2452 * srcPacking - pixel unpacking parameters 2453 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 2454 * 2455 * XXX perhaps expand this to process whole images someday. 2456 */ 2457void 2458_mesa_unpack_chan_color_span( GLcontext *ctx, 2459 GLuint n, GLenum dstFormat, GLchan dest[], 2460 GLenum srcFormat, GLenum srcType, 2461 const GLvoid *source, 2462 const struct gl_pixelstore_attrib *srcPacking, 2463 GLuint transferOps ) 2464{ 2465 ASSERT(dstFormat == GL_ALPHA || 2466 dstFormat == GL_LUMINANCE || 2467 dstFormat == GL_LUMINANCE_ALPHA || 2468 dstFormat == GL_INTENSITY || 2469 dstFormat == GL_RGB || 2470 dstFormat == GL_RGBA || 2471 dstFormat == GL_COLOR_INDEX); 2472 2473 ASSERT(srcFormat == GL_RED || 2474 srcFormat == GL_GREEN || 2475 srcFormat == GL_BLUE || 2476 srcFormat == GL_ALPHA || 2477 srcFormat == GL_LUMINANCE || 2478 srcFormat == GL_LUMINANCE_ALPHA || 2479 srcFormat == GL_INTENSITY || 2480 srcFormat == GL_RGB || 2481 srcFormat == GL_BGR || 2482 srcFormat == GL_RGBA || 2483 srcFormat == GL_BGRA || 2484 srcFormat == GL_ABGR_EXT || 2485 srcFormat == GL_COLOR_INDEX); 2486 2487 ASSERT(srcType == GL_BITMAP || 2488 srcType == GL_UNSIGNED_BYTE || 2489 srcType == GL_BYTE || 2490 srcType == GL_UNSIGNED_SHORT || 2491 srcType == GL_SHORT || 2492 srcType == GL_UNSIGNED_INT || 2493 srcType == GL_INT || 2494 srcType == GL_FLOAT || 2495 srcType == GL_UNSIGNED_BYTE_3_3_2 || 2496 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2497 srcType == GL_UNSIGNED_SHORT_5_6_5 || 2498 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2499 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2500 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2501 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2502 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2503 srcType == GL_UNSIGNED_INT_8_8_8_8 || 2504 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2505 srcType == GL_UNSIGNED_INT_10_10_10_2 || 2506 srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2507 2508 /* this is intended for RGBA mode only */ 2509 assert(ctx->Visual.rgbMode); 2510 2511 /* Try simple cases first */ 2512 if (transferOps == 0 && srcType == CHAN_TYPE) { 2513 if (dstFormat == GL_RGBA) { 2514 if (srcFormat == GL_RGBA) { 2515 MEMCPY( dest, source, n * 4 * sizeof(GLchan) ); 2516 return; 2517 } 2518 else if (srcFormat == GL_RGB) { 2519 GLuint i; 2520 const GLchan *src = (const GLchan *) source; 2521 GLchan *dst = dest; 2522 for (i = 0; i < n; i++) { 2523 dst[0] = src[0]; 2524 dst[1] = src[1]; 2525 dst[2] = src[2]; 2526 dst[3] = CHAN_MAX; 2527 src += 3; 2528 dst += 4; 2529 } 2530 return; 2531 } 2532 } 2533 else if (dstFormat == GL_RGB) { 2534 if (srcFormat == GL_RGB) { 2535 MEMCPY( dest, source, n * 3 * sizeof(GLchan) ); 2536 return; 2537 } 2538 else if (srcFormat == GL_RGBA) { 2539 GLuint i; 2540 const GLchan *src = (const GLchan *) source; 2541 GLchan *dst = dest; 2542 for (i = 0; i < n; i++) { 2543 dst[0] = src[0]; 2544 dst[1] = src[1]; 2545 dst[2] = src[2]; 2546 src += 4; 2547 dst += 3; 2548 } 2549 return; 2550 } 2551 } 2552 else if (dstFormat == srcFormat) { 2553 GLint comps = _mesa_components_in_format(srcFormat); 2554 assert(comps > 0); 2555 MEMCPY( dest, source, n * comps * sizeof(GLchan) ); 2556 return; 2557 } 2558 } 2559 2560 2561 /* general solution begins here */ 2562 { 2563 GLfloat rgba[MAX_WIDTH][4]; 2564 GLint dstComponents; 2565 GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2566 GLint dstLuminanceIndex, dstIntensityIndex; 2567 2568 dstComponents = _mesa_components_in_format( dstFormat ); 2569 /* source & dest image formats should have been error checked by now */ 2570 assert(dstComponents > 0); 2571 2572 /* 2573 * Extract image data and convert to RGBA floats 2574 */ 2575 assert(n <= MAX_WIDTH); 2576 if (srcFormat == GL_COLOR_INDEX) { 2577 GLuint indexes[MAX_WIDTH]; 2578 extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2579 srcPacking); 2580 2581 if (dstFormat == GL_COLOR_INDEX 2582 && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2583 _mesa_map_ci(ctx, n, indexes); 2584 } 2585 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2586 _mesa_shift_and_offset_ci(ctx, n, indexes); 2587 } 2588 2589 if (dstFormat == GL_COLOR_INDEX) { 2590 /* convert to GLchan and return */ 2591 GLuint i; 2592 for (i = 0; i < n; i++) { 2593 dest[i] = (GLchan) (indexes[i] & 0xff); 2594 } 2595 return; 2596 } 2597 else { 2598 /* Convert indexes to RGBA */ 2599 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2600 } 2601 } 2602 else { 2603 extract_float_rgba(n, rgba, srcFormat, srcType, source, 2604 srcPacking->SwapBytes); 2605 2606 /* scale and bias colors */ 2607 if (transferOps & IMAGE_SCALE_BIAS_BIT) { 2608 _mesa_scale_and_bias_rgba(ctx, n, rgba, 2609 ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 2610 ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 2611 ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 2612 ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2613 } 2614 /* color map lookup */ 2615 if (transferOps & IMAGE_MAP_COLOR_BIT) { 2616 _mesa_map_rgba(ctx, n, rgba); 2617 } 2618 } 2619 2620 if (transferOps) { 2621 /* GL_COLOR_TABLE lookup */ 2622 if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2623 _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2624 } 2625 /* convolution */ 2626 if (transferOps & IMAGE_CONVOLUTION_BIT) { 2627 /* this has to be done in the calling code */ 2628 } 2629 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 2630 if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 2631 _mesa_scale_and_bias_rgba(ctx, n, rgba, 2632 ctx->Pixel.PostConvolutionScale[RCOMP], 2633 ctx->Pixel.PostConvolutionScale[GCOMP], 2634 ctx->Pixel.PostConvolutionScale[BCOMP], 2635 ctx->Pixel.PostConvolutionScale[ACOMP], 2636 ctx->Pixel.PostConvolutionBias[RCOMP], 2637 ctx->Pixel.PostConvolutionBias[GCOMP], 2638 ctx->Pixel.PostConvolutionBias[BCOMP], 2639 ctx->Pixel.PostConvolutionBias[ACOMP]); 2640 } 2641 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2642 if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2643 _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2644 } 2645 /* color matrix transform */ 2646 if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2647 _mesa_transform_rgba(ctx, n, rgba); 2648 } 2649 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2650 if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2651 _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2652 } 2653 /* update histogram count */ 2654 if (transferOps & IMAGE_HISTOGRAM_BIT) { 2655 _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 2656 } 2657 /* min/max here */ 2658 if (transferOps & IMAGE_MIN_MAX_BIT) { 2659 _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2660 } 2661 } 2662 2663 /* clamp to [0,1] */ 2664 { 2665 GLuint i; 2666 for (i = 0; i < n; i++) { 2667 rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2668 rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2669 rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2670 rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2671 } 2672 } 2673 2674 /* Now determine which color channels we need to produce. 2675 * And determine the dest index (offset) within each color tuple. 2676 */ 2677 switch (dstFormat) { 2678 case GL_ALPHA: 2679 dstAlphaIndex = 0; 2680 dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2681 dstLuminanceIndex = dstIntensityIndex = -1; 2682 break; 2683 case GL_LUMINANCE: 2684 dstLuminanceIndex = 0; 2685 dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2686 dstIntensityIndex = -1; 2687 break; 2688 case GL_LUMINANCE_ALPHA: 2689 dstLuminanceIndex = 0; 2690 dstAlphaIndex = 1; 2691 dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2692 dstIntensityIndex = -1; 2693 break; 2694 case GL_INTENSITY: 2695 dstIntensityIndex = 0; 2696 dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2697 dstLuminanceIndex = -1; 2698 break; 2699 case GL_RGB: 2700 dstRedIndex = 0; 2701 dstGreenIndex = 1; 2702 dstBlueIndex = 2; 2703 dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2704 break; 2705 case GL_RGBA: 2706 dstRedIndex = 0; 2707 dstGreenIndex = 1; 2708 dstBlueIndex = 2; 2709 dstAlphaIndex = 3; 2710 dstLuminanceIndex = dstIntensityIndex = -1; 2711 break; 2712 default: 2713 gl_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()"); 2714 return; 2715 } 2716 2717 2718 /* Now return the GLchan data in the requested dstFormat */ 2719 2720 if (dstRedIndex >= 0) { 2721 GLchan *dst = dest; 2722 GLuint i; 2723 for (i = 0; i < n; i++) { 2724 CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]); 2725 dst += dstComponents; 2726 } 2727 } 2728 2729 if (dstGreenIndex >= 0) { 2730 GLchan *dst = dest; 2731 GLuint i; 2732 for (i = 0; i < n; i++) { 2733 CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]); 2734 dst += dstComponents; 2735 } 2736 } 2737 2738 if (dstBlueIndex >= 0) { 2739 GLchan *dst = dest; 2740 GLuint i; 2741 for (i = 0; i < n; i++) { 2742 CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]); 2743 dst += dstComponents; 2744 } 2745 } 2746 2747 if (dstAlphaIndex >= 0) { 2748 GLchan *dst = dest; 2749 GLuint i; 2750 for (i = 0; i < n; i++) { 2751 CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]); 2752 dst += dstComponents; 2753 } 2754 } 2755 2756 if (dstIntensityIndex >= 0) { 2757 GLchan *dst = dest; 2758 GLuint i; 2759 assert(dstIntensityIndex == 0); 2760 assert(dstComponents == 1); 2761 for (i = 0; i < n; i++) { 2762 /* Intensity comes from red channel */ 2763 CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 2764 } 2765 } 2766 2767 if (dstLuminanceIndex >= 0) { 2768 GLchan *dst = dest; 2769 GLuint i; 2770 assert(dstLuminanceIndex == 0); 2771 for (i = 0; i < n; i++) { 2772 /* Luminance comes from red channel */ 2773 CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 2774 dst += dstComponents; 2775 } 2776 } 2777 } 2778} 2779 2780 2781void 2782_mesa_unpack_float_color_span( GLcontext *ctx, 2783 GLuint n, GLenum dstFormat, GLfloat dest[], 2784 GLenum srcFormat, GLenum srcType, 2785 const GLvoid *source, 2786 const struct gl_pixelstore_attrib *srcPacking, 2787 GLuint transferOps, GLboolean clamp ) 2788{ 2789 ASSERT(dstFormat == GL_ALPHA || 2790 dstFormat == GL_LUMINANCE || 2791 dstFormat == GL_LUMINANCE_ALPHA || 2792 dstFormat == GL_INTENSITY || 2793 dstFormat == GL_RGB || 2794 dstFormat == GL_RGBA || 2795 dstFormat == GL_COLOR_INDEX); 2796 2797 ASSERT(srcFormat == GL_RED || 2798 srcFormat == GL_GREEN || 2799 srcFormat == GL_BLUE || 2800 srcFormat == GL_ALPHA || 2801 srcFormat == GL_LUMINANCE || 2802 srcFormat == GL_LUMINANCE_ALPHA || 2803 srcFormat == GL_INTENSITY || 2804 srcFormat == GL_RGB || 2805 srcFormat == GL_BGR || 2806 srcFormat == GL_RGBA || 2807 srcFormat == GL_BGRA || 2808 srcFormat == GL_ABGR_EXT || 2809 srcFormat == GL_COLOR_INDEX); 2810 2811 ASSERT(srcType == GL_BITMAP || 2812 srcType == GL_UNSIGNED_BYTE || 2813 srcType == GL_BYTE || 2814 srcType == GL_UNSIGNED_SHORT || 2815 srcType == GL_SHORT || 2816 srcType == GL_UNSIGNED_INT || 2817 srcType == GL_INT || 2818 srcType == GL_FLOAT || 2819 srcType == GL_UNSIGNED_BYTE_3_3_2 || 2820 srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 2821 srcType == GL_UNSIGNED_SHORT_5_6_5 || 2822 srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 2823 srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 2824 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 2825 srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 2826 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 2827 srcType == GL_UNSIGNED_INT_8_8_8_8 || 2828 srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 2829 srcType == GL_UNSIGNED_INT_10_10_10_2 || 2830 srcType == GL_UNSIGNED_INT_2_10_10_10_REV); 2831 2832 /* this is intended for RGBA mode only */ 2833 assert(ctx->Visual.rgbMode); 2834 2835 /* general solution, no special cases, yet */ 2836 { 2837 GLfloat rgba[MAX_WIDTH][4]; 2838 GLint dstComponents; 2839 GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex; 2840 GLint dstLuminanceIndex, dstIntensityIndex; 2841 2842 dstComponents = _mesa_components_in_format( dstFormat ); 2843 /* source & dest image formats should have been error checked by now */ 2844 assert(dstComponents > 0); 2845 2846 /* 2847 * Extract image data and convert to RGBA floats 2848 */ 2849 assert(n <= MAX_WIDTH); 2850 if (srcFormat == GL_COLOR_INDEX) { 2851 GLuint indexes[MAX_WIDTH]; 2852 extract_uint_indexes(n, indexes, srcFormat, srcType, source, 2853 srcPacking); 2854 2855 if (dstFormat == GL_COLOR_INDEX 2856 && (transferOps & IMAGE_MAP_COLOR_BIT)) { 2857 _mesa_map_ci(ctx, n, indexes); 2858 } 2859 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 2860 _mesa_shift_and_offset_ci(ctx, n, indexes); 2861 } 2862 2863 if (dstFormat == GL_COLOR_INDEX) { 2864 /* convert to GLchan and return */ 2865 GLuint i; 2866 for (i = 0; i < n; i++) { 2867 dest[i] = (GLchan) (indexes[i] & 0xff); 2868 } 2869 return; 2870 } 2871 else { 2872 /* Convert indexes to RGBA */ 2873 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 2874 } 2875 } 2876 else { 2877 extract_float_rgba(n, rgba, srcFormat, srcType, source, 2878 srcPacking->SwapBytes); 2879 2880 /* scale and bias colors */ 2881 if (transferOps & IMAGE_SCALE_BIAS_BIT) { 2882 _mesa_scale_and_bias_rgba(ctx, n, rgba, 2883 ctx->Pixel.RedScale, ctx->Pixel.GreenScale, 2884 ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale, 2885 ctx->Pixel.RedBias, ctx->Pixel.GreenBias, 2886 ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias); 2887 } 2888 /* color map lookup */ 2889 if (transferOps & IMAGE_MAP_COLOR_BIT) { 2890 _mesa_map_rgba(ctx, n, rgba); 2891 } 2892 } 2893 2894 if (transferOps) { 2895 /* GL_COLOR_TABLE lookup */ 2896 if (transferOps & IMAGE_COLOR_TABLE_BIT) { 2897 _mesa_lookup_rgba(&ctx->ColorTable, n, rgba); 2898 } 2899 /* convolution */ 2900 if (transferOps & IMAGE_CONVOLUTION_BIT) { 2901 /* XXX to do */ 2902 } 2903 /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */ 2904 if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) { 2905 _mesa_scale_and_bias_rgba(ctx, n, rgba, 2906 ctx->Pixel.PostConvolutionScale[RCOMP], 2907 ctx->Pixel.PostConvolutionScale[GCOMP], 2908 ctx->Pixel.PostConvolutionScale[BCOMP], 2909 ctx->Pixel.PostConvolutionScale[ACOMP], 2910 ctx->Pixel.PostConvolutionBias[RCOMP], 2911 ctx->Pixel.PostConvolutionBias[GCOMP], 2912 ctx->Pixel.PostConvolutionBias[BCOMP], 2913 ctx->Pixel.PostConvolutionBias[ACOMP]); 2914 } 2915 /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */ 2916 if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) { 2917 _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba); 2918 } 2919 /* color matrix transform */ 2920 if (transferOps & IMAGE_COLOR_MATRIX_BIT) { 2921 _mesa_transform_rgba(ctx, n, rgba); 2922 } 2923 /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */ 2924 if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) { 2925 _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba); 2926 } 2927 /* update histogram count */ 2928 if (transferOps & IMAGE_HISTOGRAM_BIT) { 2929 _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba); 2930 } 2931 /* min/max here */ 2932 if (transferOps & IMAGE_MIN_MAX_BIT) { 2933 _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba); 2934 } 2935 } 2936 2937 /* clamp to [0,1] */ 2938 if (clamp) { 2939 GLuint i; 2940 for (i = 0; i < n; i++) { 2941 rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); 2942 rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); 2943 rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); 2944 rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); 2945 } 2946 } 2947 2948 /* Now determine which color channels we need to produce. 2949 * And determine the dest index (offset) within each color tuple. 2950 */ 2951 switch (dstFormat) { 2952 case GL_ALPHA: 2953 dstAlphaIndex = 0; 2954 dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2955 dstLuminanceIndex = dstIntensityIndex = -1; 2956 break; 2957 case GL_LUMINANCE: 2958 dstLuminanceIndex = 0; 2959 dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2960 dstIntensityIndex = -1; 2961 break; 2962 case GL_LUMINANCE_ALPHA: 2963 dstLuminanceIndex = 0; 2964 dstAlphaIndex = 1; 2965 dstRedIndex = dstGreenIndex = dstBlueIndex = -1; 2966 dstIntensityIndex = -1; 2967 break; 2968 case GL_INTENSITY: 2969 dstIntensityIndex = 0; 2970 dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1; 2971 dstLuminanceIndex = -1; 2972 break; 2973 case GL_RGB: 2974 dstRedIndex = 0; 2975 dstGreenIndex = 1; 2976 dstBlueIndex = 2; 2977 dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1; 2978 break; 2979 case GL_RGBA: 2980 dstRedIndex = 0; 2981 dstGreenIndex = 1; 2982 dstBlueIndex = 2; 2983 dstAlphaIndex = 3; 2984 dstLuminanceIndex = dstIntensityIndex = -1; 2985 break; 2986 default: 2987 gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()"); 2988 return; 2989 } 2990 2991 /* Now pack results in the requested dstFormat */ 2992 if (dstRedIndex >= 0) { 2993 GLfloat *dst = dest; 2994 GLuint i; 2995 for (i = 0; i < n; i++) { 2996 dst[dstRedIndex] = rgba[i][RCOMP]; 2997 dst += dstComponents; 2998 } 2999 } 3000 3001 if (dstGreenIndex >= 0) { 3002 GLfloat *dst = dest; 3003 GLuint i; 3004 for (i = 0; i < n; i++) { 3005 dst[dstGreenIndex] = rgba[i][GCOMP]; 3006 dst += dstComponents; 3007 } 3008 } 3009 3010 if (dstBlueIndex >= 0) { 3011 GLfloat *dst = dest; 3012 GLuint i; 3013 for (i = 0; i < n; i++) { 3014 dst[dstBlueIndex] = rgba[i][BCOMP]; 3015 dst += dstComponents; 3016 } 3017 } 3018 3019 if (dstAlphaIndex >= 0) { 3020 GLfloat *dst = dest; 3021 GLuint i; 3022 for (i = 0; i < n; i++) { 3023 dst[dstAlphaIndex] = rgba[i][ACOMP]; 3024 dst += dstComponents; 3025 } 3026 } 3027 3028 if (dstIntensityIndex >= 0) { 3029 GLfloat *dst = dest; 3030 GLuint i; 3031 assert(dstIntensityIndex == 0); 3032 assert(dstComponents == 1); 3033 for (i = 0; i < n; i++) { 3034 /* Intensity comes from red channel */ 3035 dst[i] = rgba[i][RCOMP]; 3036 } 3037 } 3038 3039 if (dstLuminanceIndex >= 0) { 3040 GLfloat *dst = dest; 3041 GLuint i; 3042 assert(dstLuminanceIndex == 0); 3043 for (i = 0; i < n; i++) { 3044 /* Luminance comes from red channel */ 3045 dst[0] = rgba[i][RCOMP]; 3046 dst += dstComponents; 3047 } 3048 } 3049 } 3050} 3051 3052 3053 3054 3055/* 3056 * Unpack a row of color index data from a client buffer according to 3057 * the pixel unpacking parameters. 3058 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 3059 * 3060 * Args: ctx - the context 3061 * n - number of pixels 3062 * dstType - destination datatype 3063 * dest - destination array 3064 * srcType - source pixel type 3065 * source - source data pointer 3066 * srcPacking - pixel unpacking parameters 3067 * transferOps - the pixel transfer operations to apply 3068 */ 3069void 3070_mesa_unpack_index_span( const GLcontext *ctx, GLuint n, 3071 GLenum dstType, GLvoid *dest, 3072 GLenum srcType, const GLvoid *source, 3073 const struct gl_pixelstore_attrib *srcPacking, 3074 GLuint transferOps ) 3075{ 3076 ASSERT(srcType == GL_BITMAP || 3077 srcType == GL_UNSIGNED_BYTE || 3078 srcType == GL_BYTE || 3079 srcType == GL_UNSIGNED_SHORT || 3080 srcType == GL_SHORT || 3081 srcType == GL_UNSIGNED_INT || 3082 srcType == GL_INT || 3083 srcType == GL_FLOAT); 3084 3085 ASSERT(dstType == GL_UNSIGNED_BYTE || 3086 dstType == GL_UNSIGNED_SHORT || 3087 dstType == GL_UNSIGNED_INT); 3088 3089 3090 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 3091 3092 /* 3093 * Try simple cases first 3094 */ 3095 if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 3096 && dstType == GL_UNSIGNED_BYTE) { 3097 MEMCPY(dest, source, n * sizeof(GLubyte)); 3098 } 3099 else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 3100 && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 3101 MEMCPY(dest, source, n * sizeof(GLuint)); 3102 } 3103 else { 3104 /* 3105 * general solution 3106 */ 3107 GLuint indexes[MAX_WIDTH]; 3108 assert(n <= MAX_WIDTH); 3109 3110 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3111 srcPacking); 3112 3113 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3114 /* shift and offset indexes */ 3115 _mesa_shift_and_offset_ci(ctx, n, indexes); 3116 } 3117 if (transferOps & IMAGE_MAP_COLOR_BIT) { 3118 /* Apply lookup table */ 3119 _mesa_map_ci(ctx, n, indexes); 3120 } 3121 3122 /* convert to dest type */ 3123 switch (dstType) { 3124 case GL_UNSIGNED_BYTE: 3125 { 3126 GLubyte *dst = (GLubyte *) dest; 3127 GLuint i; 3128 for (i = 0; i < n; i++) { 3129 dst[i] = (GLubyte) (indexes[i] & 0xff); 3130 } 3131 } 3132 break; 3133 case GL_UNSIGNED_SHORT: 3134 { 3135 GLuint *dst = (GLuint *) dest; 3136 GLuint i; 3137 for (i = 0; i < n; i++) { 3138 dst[i] = (GLushort) (indexes[i] & 0xffff); 3139 } 3140 } 3141 break; 3142 case GL_UNSIGNED_INT: 3143 MEMCPY(dest, indexes, n * sizeof(GLuint)); 3144 break; 3145 default: 3146 gl_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 3147 } 3148 } 3149} 3150 3151 3152/* 3153 * Unpack a row of stencil data from a client buffer according to 3154 * the pixel unpacking parameters. 3155 * This is (or will be) used by glDrawPixels 3156 * 3157 * Args: ctx - the context 3158 * n - number of pixels 3159 * dstType - destination datatype 3160 * dest - destination array 3161 * srcType - source pixel type 3162 * source - source data pointer 3163 * srcPacking - pixel unpacking parameters 3164 * transferOps - apply offset/bias/lookup ops? 3165 */ 3166void 3167_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n, 3168 GLenum dstType, GLvoid *dest, 3169 GLenum srcType, const GLvoid *source, 3170 const struct gl_pixelstore_attrib *srcPacking, 3171 GLuint transferOps ) 3172{ 3173 ASSERT(srcType == GL_BITMAP || 3174 srcType == GL_UNSIGNED_BYTE || 3175 srcType == GL_BYTE || 3176 srcType == GL_UNSIGNED_SHORT || 3177 srcType == GL_SHORT || 3178 srcType == GL_UNSIGNED_INT || 3179 srcType == GL_INT || 3180 srcType == GL_FLOAT); 3181 3182 ASSERT(dstType == GL_UNSIGNED_BYTE || 3183 dstType == GL_UNSIGNED_SHORT || 3184 dstType == GL_UNSIGNED_INT); 3185 3186 /* only shift and offset apply to stencil */ 3187 transferOps &= IMAGE_SHIFT_OFFSET_BIT; 3188 3189 /* 3190 * Try simple cases first 3191 */ 3192 if (transferOps == 0 && 3193 srcType == GL_UNSIGNED_BYTE && 3194 dstType == GL_UNSIGNED_BYTE) { 3195 MEMCPY(dest, source, n * sizeof(GLubyte)); 3196 } 3197 else if (transferOps == 0 && 3198 srcType == GL_UNSIGNED_INT && 3199 dstType == GL_UNSIGNED_INT && 3200 !srcPacking->SwapBytes) { 3201 MEMCPY(dest, source, n * sizeof(GLuint)); 3202 } 3203 else { 3204 /* 3205 * general solution 3206 */ 3207 GLuint indexes[MAX_WIDTH]; 3208 assert(n <= MAX_WIDTH); 3209 3210 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 3211 srcPacking); 3212 3213 if (transferOps) { 3214 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 3215 /* shift and offset indexes */ 3216 _mesa_shift_and_offset_ci(ctx, n, indexes); 3217 } 3218 3219 if (ctx->Pixel.MapStencilFlag) { 3220 /* Apply stencil lookup table */ 3221 GLuint mask = ctx->Pixel.MapStoSsize - 1; 3222 GLuint i; 3223 for (i=0;i<n;i++) { 3224 indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ]; 3225 } 3226 } 3227 } 3228 3229 /* convert to dest type */ 3230 switch (dstType) { 3231 case GL_UNSIGNED_BYTE: 3232 { 3233 GLubyte *dst = (GLubyte *) dest; 3234 GLuint i; 3235 for (i = 0; i < n; i++) { 3236 dst[i] = (GLubyte) (indexes[i] & 0xff); 3237 } 3238 } 3239 break; 3240 case GL_UNSIGNED_SHORT: 3241 { 3242 GLuint *dst = (GLuint *) dest; 3243 GLuint i; 3244 for (i = 0; i < n; i++) { 3245 dst[i] = (GLushort) (indexes[i] & 0xffff); 3246 } 3247 } 3248 break; 3249 case GL_UNSIGNED_INT: 3250 MEMCPY(dest, indexes, n * sizeof(GLuint)); 3251 break; 3252 default: 3253 gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 3254 } 3255 } 3256} 3257 3258 3259 3260void 3261_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest, 3262 GLenum srcType, const GLvoid *source, 3263 const struct gl_pixelstore_attrib *srcPacking, 3264 GLuint transferOps ) 3265{ 3266 GLfloat *depth = MALLOC(n * sizeof(GLfloat)); 3267 if (!depth) 3268 return; 3269 3270 switch (srcType) { 3271 case GL_BYTE: 3272 { 3273 GLuint i; 3274 const GLubyte *src = (const GLubyte *) source; 3275 for (i = 0; i < n; i++) { 3276 depth[i] = BYTE_TO_FLOAT(src[i]); 3277 } 3278 } 3279 break; 3280 case GL_UNSIGNED_BYTE: 3281 { 3282 GLuint i; 3283 const GLubyte *src = (const GLubyte *) source; 3284 for (i = 0; i < n; i++) { 3285 depth[i] = UBYTE_TO_FLOAT(src[i]); 3286 } 3287 } 3288 break; 3289 case GL_SHORT: 3290 { 3291 GLuint i; 3292 const GLshort *src = (const GLshort *) source; 3293 for (i = 0; i < n; i++) { 3294 depth[i] = SHORT_TO_FLOAT(src[i]); 3295 } 3296 } 3297 break; 3298 case GL_UNSIGNED_SHORT: 3299 { 3300 GLuint i; 3301 const GLushort *src = (const GLushort *) source; 3302 for (i = 0; i < n; i++) { 3303 depth[i] = USHORT_TO_FLOAT(src[i]); 3304 } 3305 } 3306 break; 3307 case GL_INT: 3308 { 3309 GLuint i; 3310 const GLint *src = (const GLint *) source; 3311 for (i = 0; i < n; i++) { 3312 depth[i] = INT_TO_FLOAT(src[i]); 3313 } 3314 } 3315 break; 3316 case GL_UNSIGNED_INT: 3317 { 3318 GLuint i; 3319 const GLuint *src = (const GLuint *) source; 3320 for (i = 0; i < n; i++) { 3321 depth[i] = UINT_TO_FLOAT(src[i]); 3322 } 3323 } 3324 break; 3325 case GL_FLOAT: 3326 MEMCPY(depth, source, n * sizeof(GLfloat)); 3327 break; 3328 default: 3329 gl_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 3330 FREE(depth); 3331 return; 3332 } 3333 3334 3335 /* apply depth scale and bias */ 3336 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 3337 GLuint i; 3338 for (i = 0; i < n; i++) { 3339 depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias; 3340 } 3341 } 3342 3343 /* clamp depth values to [0,1] and convert from floats to integers */ 3344 { 3345 const GLfloat zs = ctx->DepthMaxF; 3346 GLuint i; 3347 for (i = 0; i < n; i++) { 3348 dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs); 3349 } 3350 } 3351 3352 FREE(depth); 3353} 3354 3355 3356 3357/* 3358 * Unpack image data. Apply byteswapping, byte flipping (bitmap). 3359 * Return all image data in a contiguous block. 3360 */ 3361void * 3362_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth, 3363 GLenum format, GLenum type, const GLvoid *pixels, 3364 const struct gl_pixelstore_attrib *unpack ) 3365{ 3366 GLint bytesPerRow, compsPerRow; 3367 GLboolean flipBytes, swap2, swap4; 3368 3369 if (!pixels) 3370 return NULL; /* not necessarily an error */ 3371 3372 if (width <= 0 || height <= 0 || depth <= 0) 3373 return NULL; /* generate error later */ 3374 3375 if (format == GL_BITMAP) { 3376 bytesPerRow = (width + 7) >> 3; 3377 flipBytes = !unpack->LsbFirst; 3378 swap2 = swap4 = GL_FALSE; 3379 compsPerRow = 0; 3380 } 3381 else { 3382 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 3383 const GLint components = _mesa_components_in_format(format); 3384 GLint bytesPerComp; 3385 if (bytesPerPixel <= 0 || components <= 0) 3386 return NULL; /* bad format or type. generate error later */ 3387 bytesPerRow = bytesPerPixel * width; 3388 bytesPerComp = bytesPerPixel / components; 3389 flipBytes = GL_FALSE; 3390 swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 3391 swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 3392 compsPerRow = components * width; 3393 assert(compsPerRow >= width); 3394 } 3395 3396 { 3397 GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth); 3398 GLubyte *dst; 3399 GLint img, row; 3400 if (!destBuffer) 3401 return NULL; /* generate GL_OUT_OF_MEMORY later */ 3402 3403 dst = destBuffer; 3404 for (img = 0; img < depth; img++) { 3405 for (row = 0; row < height; row++) { 3406 const GLvoid *src = _mesa_image_address(unpack, pixels, 3407 width, height, format, type, img, row, 0); 3408 MEMCPY(dst, src, bytesPerRow); 3409 /* byte flipping/swapping */ 3410 if (flipBytes) { 3411 flip_bytes((GLubyte *) dst, bytesPerRow); 3412 } 3413 else if (swap2) { 3414 _mesa_swap2((GLushort*) dst, compsPerRow); 3415 } 3416 else if (swap4) { 3417 _mesa_swap4((GLuint*) dst, compsPerRow); 3418 } 3419 dst += bytesPerRow; 3420 } 3421 } 3422 return destBuffer; 3423 } 3424} 3425