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