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