image.c revision 2134d2f35baadf4117e48aa3315608403622b79a
1/* 2 * Mesa 3-D graphics library 3 * Version: 7.5 4 * 5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6 * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included 16 * in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27/** 28 * \file image.c 29 * Image handling. 30 */ 31 32 33#include "glheader.h" 34#include "colormac.h" 35#include "image.h" 36#include "imports.h" 37#include "macros.h" 38#include "mfeatures.h" 39#include "mtypes.h" 40 41 42 43/** 44 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 45 */ 46GLboolean 47_mesa_type_is_packed(GLenum type) 48{ 49 switch (type) { 50 case GL_UNSIGNED_BYTE_3_3_2: 51 case GL_UNSIGNED_BYTE_2_3_3_REV: 52 case MESA_UNSIGNED_BYTE_4_4: 53 case GL_UNSIGNED_SHORT_5_6_5: 54 case GL_UNSIGNED_SHORT_5_6_5_REV: 55 case GL_UNSIGNED_SHORT_4_4_4_4: 56 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 57 case GL_UNSIGNED_SHORT_5_5_5_1: 58 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 59 case GL_UNSIGNED_INT_8_8_8_8: 60 case GL_UNSIGNED_INT_8_8_8_8_REV: 61 case GL_UNSIGNED_INT_10_10_10_2: 62 case GL_UNSIGNED_INT_2_10_10_10_REV: 63 case GL_UNSIGNED_SHORT_8_8_MESA: 64 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 65 case GL_UNSIGNED_INT_24_8_EXT: 66 case GL_UNSIGNED_INT_5_9_9_9_REV: 67 case GL_UNSIGNED_INT_10F_11F_11F_REV: 68 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 69 return GL_TRUE; 70 } 71 72 return GL_FALSE; 73} 74 75 76 77/** 78 * Flip the order of the 2 bytes in each word in the given array. 79 * 80 * \param p array. 81 * \param n number of words. 82 */ 83void 84_mesa_swap2( GLushort *p, GLuint n ) 85{ 86 GLuint i; 87 for (i = 0; i < n; i++) { 88 p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); 89 } 90} 91 92 93 94/* 95 * Flip the order of the 4 bytes in each word in the given array. 96 */ 97void 98_mesa_swap4( GLuint *p, GLuint n ) 99{ 100 GLuint i, a, b; 101 for (i = 0; i < n; i++) { 102 b = p[i]; 103 a = (b >> 24) 104 | ((b >> 8) & 0xff00) 105 | ((b << 8) & 0xff0000) 106 | ((b << 24) & 0xff000000); 107 p[i] = a; 108 } 109} 110 111 112/** 113 * Get the size of a GL data type. 114 * 115 * \param type GL data type. 116 * 117 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 118 * if an invalid type enum. 119 */ 120GLint 121_mesa_sizeof_type( GLenum type ) 122{ 123 switch (type) { 124 case GL_BITMAP: 125 return 0; 126 case GL_UNSIGNED_BYTE: 127 return sizeof(GLubyte); 128 case GL_BYTE: 129 return sizeof(GLbyte); 130 case GL_UNSIGNED_SHORT: 131 return sizeof(GLushort); 132 case GL_SHORT: 133 return sizeof(GLshort); 134 case GL_UNSIGNED_INT: 135 return sizeof(GLuint); 136 case GL_INT: 137 return sizeof(GLint); 138 case GL_FLOAT: 139 return sizeof(GLfloat); 140 case GL_DOUBLE: 141 return sizeof(GLdouble); 142 case GL_HALF_FLOAT_ARB: 143 return sizeof(GLhalfARB); 144 case GL_FIXED: 145 return sizeof(GLfixed); 146 default: 147 return -1; 148 } 149} 150 151 152/** 153 * Same as _mesa_sizeof_type() but also accepting the packed pixel 154 * format data types. 155 */ 156GLint 157_mesa_sizeof_packed_type( GLenum type ) 158{ 159 switch (type) { 160 case GL_BITMAP: 161 return 0; 162 case GL_UNSIGNED_BYTE: 163 return sizeof(GLubyte); 164 case GL_BYTE: 165 return sizeof(GLbyte); 166 case GL_UNSIGNED_SHORT: 167 return sizeof(GLushort); 168 case GL_SHORT: 169 return sizeof(GLshort); 170 case GL_UNSIGNED_INT: 171 return sizeof(GLuint); 172 case GL_INT: 173 return sizeof(GLint); 174 case GL_HALF_FLOAT_ARB: 175 return sizeof(GLhalfARB); 176 case GL_FLOAT: 177 return sizeof(GLfloat); 178 case GL_UNSIGNED_BYTE_3_3_2: 179 case GL_UNSIGNED_BYTE_2_3_3_REV: 180 case MESA_UNSIGNED_BYTE_4_4: 181 return sizeof(GLubyte); 182 case GL_UNSIGNED_SHORT_5_6_5: 183 case GL_UNSIGNED_SHORT_5_6_5_REV: 184 case GL_UNSIGNED_SHORT_4_4_4_4: 185 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 186 case GL_UNSIGNED_SHORT_5_5_5_1: 187 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 188 case GL_UNSIGNED_SHORT_8_8_MESA: 189 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 190 return sizeof(GLushort); 191 case GL_UNSIGNED_INT_8_8_8_8: 192 case GL_UNSIGNED_INT_8_8_8_8_REV: 193 case GL_UNSIGNED_INT_10_10_10_2: 194 case GL_UNSIGNED_INT_2_10_10_10_REV: 195 case GL_UNSIGNED_INT_24_8_EXT: 196 case GL_UNSIGNED_INT_5_9_9_9_REV: 197 case GL_UNSIGNED_INT_10F_11F_11F_REV: 198 return sizeof(GLuint); 199 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 200 return 8; 201 default: 202 return -1; 203 } 204} 205 206 207/** 208 * Get the number of components in a pixel format. 209 * 210 * \param format pixel format. 211 * 212 * \return the number of components in the given format, or -1 if a bad format. 213 */ 214GLint 215_mesa_components_in_format( GLenum format ) 216{ 217 switch (format) { 218 case GL_COLOR_INDEX: 219 case GL_STENCIL_INDEX: 220 case GL_DEPTH_COMPONENT: 221 case GL_RED: 222 case GL_RED_INTEGER_EXT: 223 case GL_GREEN: 224 case GL_GREEN_INTEGER_EXT: 225 case GL_BLUE: 226 case GL_BLUE_INTEGER_EXT: 227 case GL_ALPHA: 228 case GL_ALPHA_INTEGER_EXT: 229 case GL_LUMINANCE: 230 case GL_LUMINANCE_INTEGER_EXT: 231 case GL_INTENSITY: 232 return 1; 233 234 case GL_LUMINANCE_ALPHA: 235 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 236 case GL_RG: 237 case GL_YCBCR_MESA: 238 case GL_DEPTH_STENCIL_EXT: 239 case GL_DUDV_ATI: 240 case GL_DU8DV8_ATI: 241 return 2; 242 243 case GL_RGB: 244 case GL_BGR: 245 case GL_RGB_INTEGER_EXT: 246 case GL_BGR_INTEGER_EXT: 247 return 3; 248 249 case GL_RGBA: 250 case GL_BGRA: 251 case GL_ABGR_EXT: 252 case GL_RGBA_INTEGER_EXT: 253 case GL_BGRA_INTEGER_EXT: 254 return 4; 255 256 default: 257 return -1; 258 } 259} 260 261 262/** 263 * Get the bytes per pixel of pixel format type pair. 264 * 265 * \param format pixel format. 266 * \param type pixel type. 267 * 268 * \return bytes per pixel, or -1 if a bad format or type was given. 269 */ 270GLint 271_mesa_bytes_per_pixel( GLenum format, GLenum type ) 272{ 273 GLint comps = _mesa_components_in_format( format ); 274 if (comps < 0) 275 return -1; 276 277 switch (type) { 278 case GL_BITMAP: 279 return 0; /* special case */ 280 case GL_BYTE: 281 case GL_UNSIGNED_BYTE: 282 return comps * sizeof(GLubyte); 283 case GL_SHORT: 284 case GL_UNSIGNED_SHORT: 285 return comps * sizeof(GLshort); 286 case GL_INT: 287 case GL_UNSIGNED_INT: 288 return comps * sizeof(GLint); 289 case GL_FLOAT: 290 return comps * sizeof(GLfloat); 291 case GL_HALF_FLOAT_ARB: 292 return comps * sizeof(GLhalfARB); 293 case GL_UNSIGNED_BYTE_3_3_2: 294 case GL_UNSIGNED_BYTE_2_3_3_REV: 295 if (format == GL_RGB || format == GL_BGR || 296 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 297 return sizeof(GLubyte); 298 else 299 return -1; /* error */ 300 case GL_UNSIGNED_SHORT_5_6_5: 301 case GL_UNSIGNED_SHORT_5_6_5_REV: 302 if (format == GL_RGB || format == GL_BGR || 303 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 304 return sizeof(GLushort); 305 else 306 return -1; /* error */ 307 case GL_UNSIGNED_SHORT_4_4_4_4: 308 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 309 case GL_UNSIGNED_SHORT_5_5_5_1: 310 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 311 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 312 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 313 return sizeof(GLushort); 314 else 315 return -1; 316 case GL_UNSIGNED_INT_8_8_8_8: 317 case GL_UNSIGNED_INT_8_8_8_8_REV: 318 case GL_UNSIGNED_INT_10_10_10_2: 319 case GL_UNSIGNED_INT_2_10_10_10_REV: 320 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 321 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 322 return sizeof(GLuint); 323 else 324 return -1; 325 case GL_UNSIGNED_SHORT_8_8_MESA: 326 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 327 if (format == GL_YCBCR_MESA) 328 return sizeof(GLushort); 329 else 330 return -1; 331 case GL_UNSIGNED_INT_24_8_EXT: 332 if (format == GL_DEPTH_STENCIL_EXT) 333 return sizeof(GLuint); 334 else 335 return -1; 336 case GL_UNSIGNED_INT_5_9_9_9_REV: 337 if (format == GL_RGB) 338 return sizeof(GLuint); 339 else 340 return -1; 341 case GL_UNSIGNED_INT_10F_11F_11F_REV: 342 if (format == GL_RGB) 343 return sizeof(GLuint); 344 else 345 return -1; 346 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 347 if (format == GL_DEPTH_STENCIL) 348 return 8; 349 else 350 return -1; 351 default: 352 return -1; 353 } 354} 355 356 357/** 358 * Test for a legal pixel format and type. 359 * 360 * \param format pixel format. 361 * \param type pixel type. 362 * 363 * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE 364 * otherwise. 365 */ 366GLboolean 367_mesa_is_legal_format_and_type(const struct gl_context *ctx, 368 GLenum format, GLenum type) 369{ 370 switch (format) { 371 case GL_COLOR_INDEX: 372 case GL_STENCIL_INDEX: 373 switch (type) { 374 case GL_BITMAP: 375 case GL_BYTE: 376 case GL_UNSIGNED_BYTE: 377 case GL_SHORT: 378 case GL_UNSIGNED_SHORT: 379 case GL_INT: 380 case GL_UNSIGNED_INT: 381 case GL_FLOAT: 382 return GL_TRUE; 383 case GL_HALF_FLOAT_ARB: 384 return ctx->Extensions.ARB_half_float_pixel; 385 default: 386 return GL_FALSE; 387 } 388 case GL_RED: 389 case GL_GREEN: 390 case GL_BLUE: 391 case GL_ALPHA: 392#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 393 case GL_INTENSITY: 394#endif 395 case GL_LUMINANCE: 396 case GL_LUMINANCE_ALPHA: 397 case GL_DEPTH_COMPONENT: 398 switch (type) { 399 case GL_BYTE: 400 case GL_UNSIGNED_BYTE: 401 case GL_SHORT: 402 case GL_UNSIGNED_SHORT: 403 case GL_INT: 404 case GL_UNSIGNED_INT: 405 case GL_FLOAT: 406 return GL_TRUE; 407 case GL_HALF_FLOAT_ARB: 408 return ctx->Extensions.ARB_half_float_pixel; 409 default: 410 return GL_FALSE; 411 } 412 case GL_RG: 413 if (!ctx->Extensions.ARB_texture_rg) 414 return GL_FALSE; 415 416 switch (type) { 417 case GL_BYTE: 418 case GL_UNSIGNED_BYTE: 419 case GL_SHORT: 420 case GL_UNSIGNED_SHORT: 421 case GL_INT: 422 case GL_UNSIGNED_INT: 423 case GL_FLOAT: 424 return GL_TRUE; 425 case GL_HALF_FLOAT_ARB: 426 return ctx->Extensions.ARB_half_float_pixel; 427 default: 428 return GL_FALSE; 429 } 430 case GL_RGB: 431 switch (type) { 432 case GL_BYTE: 433 case GL_UNSIGNED_BYTE: 434 case GL_SHORT: 435 case GL_UNSIGNED_SHORT: 436 case GL_INT: 437 case GL_UNSIGNED_INT: 438 case GL_FLOAT: 439 case GL_UNSIGNED_BYTE_3_3_2: 440 case GL_UNSIGNED_BYTE_2_3_3_REV: 441 case GL_UNSIGNED_SHORT_5_6_5: 442 case GL_UNSIGNED_SHORT_5_6_5_REV: 443 return GL_TRUE; 444 case GL_HALF_FLOAT_ARB: 445 return ctx->Extensions.ARB_half_float_pixel; 446 case GL_UNSIGNED_INT_5_9_9_9_REV: 447 return ctx->Extensions.EXT_texture_shared_exponent; 448 case GL_UNSIGNED_INT_10F_11F_11F_REV: 449 return ctx->Extensions.EXT_packed_float; 450 default: 451 return GL_FALSE; 452 } 453 case GL_BGR: 454 switch (type) { 455 /* NOTE: no packed types are supported with BGR. That's 456 * intentional, according to the GL spec. 457 */ 458 case GL_BYTE: 459 case GL_UNSIGNED_BYTE: 460 case GL_SHORT: 461 case GL_UNSIGNED_SHORT: 462 case GL_INT: 463 case GL_UNSIGNED_INT: 464 case GL_FLOAT: 465 return GL_TRUE; 466 case GL_HALF_FLOAT_ARB: 467 return ctx->Extensions.ARB_half_float_pixel; 468 default: 469 return GL_FALSE; 470 } 471 case GL_RGBA: 472 case GL_BGRA: 473 case GL_ABGR_EXT: 474 switch (type) { 475 case GL_BYTE: 476 case GL_UNSIGNED_BYTE: 477 case GL_SHORT: 478 case GL_UNSIGNED_SHORT: 479 case GL_INT: 480 case GL_UNSIGNED_INT: 481 case GL_FLOAT: 482 case GL_UNSIGNED_SHORT_4_4_4_4: 483 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 484 case GL_UNSIGNED_SHORT_5_5_5_1: 485 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 486 case GL_UNSIGNED_INT_8_8_8_8: 487 case GL_UNSIGNED_INT_8_8_8_8_REV: 488 case GL_UNSIGNED_INT_10_10_10_2: 489 case GL_UNSIGNED_INT_2_10_10_10_REV: 490 return GL_TRUE; 491 case GL_HALF_FLOAT_ARB: 492 return ctx->Extensions.ARB_half_float_pixel; 493 default: 494 return GL_FALSE; 495 } 496 case GL_YCBCR_MESA: 497 if (type == GL_UNSIGNED_SHORT_8_8_MESA || 498 type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 499 return GL_TRUE; 500 else 501 return GL_FALSE; 502 case GL_DEPTH_STENCIL_EXT: 503 if ((ctx->Extensions.EXT_packed_depth_stencil && 504 type == GL_UNSIGNED_INT_24_8_EXT) || 505 (ctx->Extensions.ARB_depth_buffer_float && 506 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)) 507 return GL_TRUE; 508 else 509 return GL_FALSE; 510 case GL_DUDV_ATI: 511 case GL_DU8DV8_ATI: 512 switch (type) { 513 case GL_BYTE: 514 case GL_UNSIGNED_BYTE: 515 case GL_SHORT: 516 case GL_UNSIGNED_SHORT: 517 case GL_INT: 518 case GL_UNSIGNED_INT: 519 case GL_FLOAT: 520 return GL_TRUE; 521 default: 522 return GL_FALSE; 523 } 524 525 /* integer-valued formats */ 526 case GL_RED_INTEGER_EXT: 527 case GL_GREEN_INTEGER_EXT: 528 case GL_BLUE_INTEGER_EXT: 529 case GL_ALPHA_INTEGER_EXT: 530 switch (type) { 531 case GL_BYTE: 532 case GL_UNSIGNED_BYTE: 533 case GL_SHORT: 534 case GL_UNSIGNED_SHORT: 535 case GL_INT: 536 case GL_UNSIGNED_INT: 537 return ctx->Extensions.EXT_texture_integer; 538 default: 539 return GL_FALSE; 540 } 541 542 case GL_RGB_INTEGER_EXT: 543 switch (type) { 544 case GL_BYTE: 545 case GL_UNSIGNED_BYTE: 546 case GL_SHORT: 547 case GL_UNSIGNED_SHORT: 548 case GL_INT: 549 case GL_UNSIGNED_INT: 550 return ctx->Extensions.EXT_texture_integer; 551 case GL_UNSIGNED_BYTE_3_3_2: 552 case GL_UNSIGNED_BYTE_2_3_3_REV: 553 case GL_UNSIGNED_SHORT_5_6_5: 554 case GL_UNSIGNED_SHORT_5_6_5_REV: 555 return ctx->Extensions.ARB_texture_rgb10_a2ui; 556 default: 557 return GL_FALSE; 558 } 559 560 case GL_BGR_INTEGER_EXT: 561 switch (type) { 562 case GL_BYTE: 563 case GL_UNSIGNED_BYTE: 564 case GL_SHORT: 565 case GL_UNSIGNED_SHORT: 566 case GL_INT: 567 case GL_UNSIGNED_INT: 568 /* NOTE: no packed formats w/ BGR format */ 569 return ctx->Extensions.EXT_texture_integer; 570 default: 571 return GL_FALSE; 572 } 573 574 case GL_RGBA_INTEGER_EXT: 575 case GL_BGRA_INTEGER_EXT: 576 switch (type) { 577 case GL_BYTE: 578 case GL_UNSIGNED_BYTE: 579 case GL_SHORT: 580 case GL_UNSIGNED_SHORT: 581 case GL_INT: 582 case GL_UNSIGNED_INT: 583 return ctx->Extensions.EXT_texture_integer; 584 case GL_UNSIGNED_SHORT_4_4_4_4: 585 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 586 case GL_UNSIGNED_SHORT_5_5_5_1: 587 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 588 case GL_UNSIGNED_INT_8_8_8_8: 589 case GL_UNSIGNED_INT_8_8_8_8_REV: 590 case GL_UNSIGNED_INT_10_10_10_2: 591 case GL_UNSIGNED_INT_2_10_10_10_REV: 592 return ctx->Extensions.ARB_texture_rgb10_a2ui; 593 default: 594 return GL_FALSE; 595 } 596 597 case GL_LUMINANCE_INTEGER_EXT: 598 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 599 switch (type) { 600 case GL_BYTE: 601 case GL_UNSIGNED_BYTE: 602 case GL_SHORT: 603 case GL_UNSIGNED_SHORT: 604 case GL_INT: 605 case GL_UNSIGNED_INT: 606 return ctx->Extensions.EXT_texture_integer; 607 default: 608 return GL_FALSE; 609 } 610 611 default: 612 ; /* fall-through */ 613 } 614 return GL_FALSE; 615} 616 617 618/** 619 * Test if the given image format is a color/RGBA format (i.e., not color 620 * index, depth, stencil, etc). 621 * \param format the image format value (may by an internal texture format) 622 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 623 */ 624GLboolean 625_mesa_is_color_format(GLenum format) 626{ 627 switch (format) { 628 case GL_RED: 629 case GL_GREEN: 630 case GL_BLUE: 631 case GL_ALPHA: 632 case GL_ALPHA4: 633 case GL_ALPHA8: 634 case GL_ALPHA12: 635 case GL_ALPHA16: 636 case 1: 637 case GL_LUMINANCE: 638 case GL_LUMINANCE4: 639 case GL_LUMINANCE8: 640 case GL_LUMINANCE12: 641 case GL_LUMINANCE16: 642 case 2: 643 case GL_LUMINANCE_ALPHA: 644 case GL_LUMINANCE4_ALPHA4: 645 case GL_LUMINANCE6_ALPHA2: 646 case GL_LUMINANCE8_ALPHA8: 647 case GL_LUMINANCE12_ALPHA4: 648 case GL_LUMINANCE12_ALPHA12: 649 case GL_LUMINANCE16_ALPHA16: 650 case GL_INTENSITY: 651 case GL_INTENSITY4: 652 case GL_INTENSITY8: 653 case GL_INTENSITY12: 654 case GL_INTENSITY16: 655 case GL_R8: 656 case GL_R16: 657 case GL_RG: 658 case GL_RG8: 659 case GL_RG16: 660 case 3: 661 case GL_RGB: 662 case GL_BGR: 663 case GL_R3_G3_B2: 664 case GL_RGB4: 665 case GL_RGB5: 666 case GL_RGB8: 667 case GL_RGB10: 668 case GL_RGB12: 669 case GL_RGB16: 670 case 4: 671 case GL_ABGR_EXT: 672 case GL_RGBA: 673 case GL_BGRA: 674 case GL_RGBA2: 675 case GL_RGBA4: 676 case GL_RGB5_A1: 677 case GL_RGBA8: 678 case GL_RGB10_A2: 679 case GL_RGBA12: 680 case GL_RGBA16: 681 /* float texture formats */ 682 case GL_ALPHA16F_ARB: 683 case GL_ALPHA32F_ARB: 684 case GL_LUMINANCE16F_ARB: 685 case GL_LUMINANCE32F_ARB: 686 case GL_LUMINANCE_ALPHA16F_ARB: 687 case GL_LUMINANCE_ALPHA32F_ARB: 688 case GL_INTENSITY16F_ARB: 689 case GL_INTENSITY32F_ARB: 690 case GL_R16F: 691 case GL_R32F: 692 case GL_RG16F: 693 case GL_RG32F: 694 case GL_RGB16F_ARB: 695 case GL_RGB32F_ARB: 696 case GL_RGBA16F_ARB: 697 case GL_RGBA32F_ARB: 698 /* compressed formats */ 699 case GL_COMPRESSED_ALPHA: 700 case GL_COMPRESSED_LUMINANCE: 701 case GL_COMPRESSED_LUMINANCE_ALPHA: 702 case GL_COMPRESSED_INTENSITY: 703 case GL_COMPRESSED_RED: 704 case GL_COMPRESSED_RG: 705 case GL_COMPRESSED_RGB: 706 case GL_COMPRESSED_RGBA: 707 case GL_RGB_S3TC: 708 case GL_RGB4_S3TC: 709 case GL_RGBA_S3TC: 710 case GL_RGBA4_S3TC: 711 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 712 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 713 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 714 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 715 case GL_COMPRESSED_RGB_FXT1_3DFX: 716 case GL_COMPRESSED_RGBA_FXT1_3DFX: 717#if FEATURE_EXT_texture_sRGB 718 case GL_SRGB_EXT: 719 case GL_SRGB8_EXT: 720 case GL_SRGB_ALPHA_EXT: 721 case GL_SRGB8_ALPHA8_EXT: 722 case GL_SLUMINANCE_ALPHA_EXT: 723 case GL_SLUMINANCE8_ALPHA8_EXT: 724 case GL_SLUMINANCE_EXT: 725 case GL_SLUMINANCE8_EXT: 726 case GL_COMPRESSED_SRGB_EXT: 727 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 728 case GL_COMPRESSED_SRGB_ALPHA_EXT: 729 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 730 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 731 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 732 case GL_COMPRESSED_SLUMINANCE_EXT: 733 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 734#endif /* FEATURE_EXT_texture_sRGB */ 735 case GL_COMPRESSED_RED_RGTC1: 736 case GL_COMPRESSED_SIGNED_RED_RGTC1: 737 case GL_COMPRESSED_RG_RGTC2: 738 case GL_COMPRESSED_SIGNED_RG_RGTC2: 739 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 740 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 741 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 742 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 743 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 744 /* generic integer formats */ 745 case GL_RED_INTEGER_EXT: 746 case GL_GREEN_INTEGER_EXT: 747 case GL_BLUE_INTEGER_EXT: 748 case GL_ALPHA_INTEGER_EXT: 749 case GL_RGB_INTEGER_EXT: 750 case GL_RGBA_INTEGER_EXT: 751 case GL_BGR_INTEGER_EXT: 752 case GL_BGRA_INTEGER_EXT: 753 case GL_LUMINANCE_INTEGER_EXT: 754 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 755 /* sized integer formats */ 756 case GL_RGBA32UI_EXT: 757 case GL_RGB32UI_EXT: 758 case GL_ALPHA32UI_EXT: 759 case GL_INTENSITY32UI_EXT: 760 case GL_LUMINANCE32UI_EXT: 761 case GL_LUMINANCE_ALPHA32UI_EXT: 762 case GL_RGBA16UI_EXT: 763 case GL_RGB16UI_EXT: 764 case GL_ALPHA16UI_EXT: 765 case GL_INTENSITY16UI_EXT: 766 case GL_LUMINANCE16UI_EXT: 767 case GL_LUMINANCE_ALPHA16UI_EXT: 768 case GL_RGBA8UI_EXT: 769 case GL_RGB8UI_EXT: 770 case GL_ALPHA8UI_EXT: 771 case GL_INTENSITY8UI_EXT: 772 case GL_LUMINANCE8UI_EXT: 773 case GL_LUMINANCE_ALPHA8UI_EXT: 774 case GL_RGBA32I_EXT: 775 case GL_RGB32I_EXT: 776 case GL_ALPHA32I_EXT: 777 case GL_INTENSITY32I_EXT: 778 case GL_LUMINANCE32I_EXT: 779 case GL_LUMINANCE_ALPHA32I_EXT: 780 case GL_RGBA16I_EXT: 781 case GL_RGB16I_EXT: 782 case GL_ALPHA16I_EXT: 783 case GL_INTENSITY16I_EXT: 784 case GL_LUMINANCE16I_EXT: 785 case GL_LUMINANCE_ALPHA16I_EXT: 786 case GL_RGBA8I_EXT: 787 case GL_RGB8I_EXT: 788 case GL_ALPHA8I_EXT: 789 case GL_INTENSITY8I_EXT: 790 case GL_LUMINANCE8I_EXT: 791 case GL_LUMINANCE_ALPHA8I_EXT: 792 /* signed, normalized texture formats */ 793 case GL_RED_SNORM: 794 case GL_R8_SNORM: 795 case GL_R16_SNORM: 796 case GL_RG_SNORM: 797 case GL_RG8_SNORM: 798 case GL_RG16_SNORM: 799 case GL_RGB_SNORM: 800 case GL_RGB8_SNORM: 801 case GL_RGB16_SNORM: 802 case GL_RGBA_SNORM: 803 case GL_RGBA8_SNORM: 804 case GL_RGBA16_SNORM: 805 case GL_ALPHA_SNORM: 806 case GL_ALPHA8_SNORM: 807 case GL_ALPHA16_SNORM: 808 case GL_LUMINANCE_SNORM: 809 case GL_LUMINANCE8_SNORM: 810 case GL_LUMINANCE16_SNORM: 811 case GL_LUMINANCE_ALPHA_SNORM: 812 case GL_LUMINANCE8_ALPHA8_SNORM: 813 case GL_LUMINANCE16_ALPHA16_SNORM: 814 case GL_INTENSITY_SNORM: 815 case GL_INTENSITY8_SNORM: 816 case GL_INTENSITY16_SNORM: 817 case GL_RGB9_E5: 818 case GL_R11F_G11F_B10F: 819 case GL_RGB10_A2UI: 820 return GL_TRUE; 821 case GL_YCBCR_MESA: /* not considered to be RGB */ 822 /* fall-through */ 823 default: 824 return GL_FALSE; 825 } 826} 827 828 829/** 830 * Test if the given image format is a depth component format. 831 */ 832GLboolean 833_mesa_is_depth_format(GLenum format) 834{ 835 switch (format) { 836 case GL_DEPTH_COMPONENT: 837 case GL_DEPTH_COMPONENT16: 838 case GL_DEPTH_COMPONENT24: 839 case GL_DEPTH_COMPONENT32: 840 case GL_DEPTH_COMPONENT32F: 841 return GL_TRUE; 842 default: 843 return GL_FALSE; 844 } 845} 846 847 848/** 849 * Test if the given image format is a stencil format. 850 */ 851GLboolean 852_mesa_is_stencil_format(GLenum format) 853{ 854 switch (format) { 855 case GL_STENCIL_INDEX: 856 return GL_TRUE; 857 default: 858 return GL_FALSE; 859 } 860} 861 862 863/** 864 * Test if the given image format is a YCbCr format. 865 */ 866GLboolean 867_mesa_is_ycbcr_format(GLenum format) 868{ 869 switch (format) { 870 case GL_YCBCR_MESA: 871 return GL_TRUE; 872 default: 873 return GL_FALSE; 874 } 875} 876 877 878/** 879 * Test if the given image format is a depth+stencil format. 880 */ 881GLboolean 882_mesa_is_depthstencil_format(GLenum format) 883{ 884 switch (format) { 885 case GL_DEPTH24_STENCIL8_EXT: 886 case GL_DEPTH_STENCIL_EXT: 887 case GL_DEPTH32F_STENCIL8: 888 return GL_TRUE; 889 default: 890 return GL_FALSE; 891 } 892} 893 894 895/** 896 * Test if the given image format is a depth or stencil format. 897 */ 898GLboolean 899_mesa_is_depth_or_stencil_format(GLenum format) 900{ 901 switch (format) { 902 case GL_DEPTH_COMPONENT: 903 case GL_DEPTH_COMPONENT16: 904 case GL_DEPTH_COMPONENT24: 905 case GL_DEPTH_COMPONENT32: 906 case GL_STENCIL_INDEX: 907 case GL_STENCIL_INDEX1_EXT: 908 case GL_STENCIL_INDEX4_EXT: 909 case GL_STENCIL_INDEX8_EXT: 910 case GL_STENCIL_INDEX16_EXT: 911 case GL_DEPTH_STENCIL_EXT: 912 case GL_DEPTH24_STENCIL8_EXT: 913 case GL_DEPTH_COMPONENT32F: 914 case GL_DEPTH32F_STENCIL8: 915 return GL_TRUE; 916 default: 917 return GL_FALSE; 918 } 919} 920 921 922/** 923 * Test if the given image format is a dudv format. 924 */ 925GLboolean 926_mesa_is_dudv_format(GLenum format) 927{ 928 switch (format) { 929 case GL_DUDV_ATI: 930 case GL_DU8DV8_ATI: 931 return GL_TRUE; 932 default: 933 return GL_FALSE; 934 } 935} 936 937 938/** 939 * Test if the given format is an integer (non-normalized) format. 940 */ 941GLboolean 942_mesa_is_integer_format(GLenum format) 943{ 944 switch (format) { 945 /* generic integer formats */ 946 case GL_RED_INTEGER_EXT: 947 case GL_GREEN_INTEGER_EXT: 948 case GL_BLUE_INTEGER_EXT: 949 case GL_ALPHA_INTEGER_EXT: 950 case GL_RGB_INTEGER_EXT: 951 case GL_RGBA_INTEGER_EXT: 952 case GL_BGR_INTEGER_EXT: 953 case GL_BGRA_INTEGER_EXT: 954 case GL_LUMINANCE_INTEGER_EXT: 955 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 956 /* specific integer formats */ 957 case GL_RGBA32UI_EXT: 958 case GL_RGB32UI_EXT: 959 case GL_RG32UI: 960 case GL_R32UI: 961 case GL_ALPHA32UI_EXT: 962 case GL_INTENSITY32UI_EXT: 963 case GL_LUMINANCE32UI_EXT: 964 case GL_LUMINANCE_ALPHA32UI_EXT: 965 case GL_RGBA16UI_EXT: 966 case GL_RGB16UI_EXT: 967 case GL_RG16UI: 968 case GL_R16UI: 969 case GL_ALPHA16UI_EXT: 970 case GL_INTENSITY16UI_EXT: 971 case GL_LUMINANCE16UI_EXT: 972 case GL_LUMINANCE_ALPHA16UI_EXT: 973 case GL_RGBA8UI_EXT: 974 case GL_RGB8UI_EXT: 975 case GL_RG8UI: 976 case GL_R8UI: 977 case GL_ALPHA8UI_EXT: 978 case GL_INTENSITY8UI_EXT: 979 case GL_LUMINANCE8UI_EXT: 980 case GL_LUMINANCE_ALPHA8UI_EXT: 981 case GL_RGBA32I_EXT: 982 case GL_RGB32I_EXT: 983 case GL_RG32I: 984 case GL_R32I: 985 case GL_ALPHA32I_EXT: 986 case GL_INTENSITY32I_EXT: 987 case GL_LUMINANCE32I_EXT: 988 case GL_LUMINANCE_ALPHA32I_EXT: 989 case GL_RGBA16I_EXT: 990 case GL_RGB16I_EXT: 991 case GL_RG16I: 992 case GL_R16I: 993 case GL_ALPHA16I_EXT: 994 case GL_INTENSITY16I_EXT: 995 case GL_LUMINANCE16I_EXT: 996 case GL_LUMINANCE_ALPHA16I_EXT: 997 case GL_RGBA8I_EXT: 998 case GL_RGB8I_EXT: 999 case GL_RG8I: 1000 case GL_R8I: 1001 case GL_ALPHA8I_EXT: 1002 case GL_INTENSITY8I_EXT: 1003 case GL_LUMINANCE8I_EXT: 1004 case GL_LUMINANCE_ALPHA8I_EXT: 1005 case GL_RGB10_A2UI: 1006 return GL_TRUE; 1007 default: 1008 return GL_FALSE; 1009 } 1010} 1011 1012 1013/** 1014 * Test if an image format is a supported compressed format. 1015 * \param format the internal format token provided by the user. 1016 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 1017 */ 1018GLboolean 1019_mesa_is_compressed_format(struct gl_context *ctx, GLenum format) 1020{ 1021 switch (format) { 1022 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1023 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1024 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1025 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1026 return ctx->Extensions.EXT_texture_compression_s3tc; 1027 case GL_RGB_S3TC: 1028 case GL_RGB4_S3TC: 1029 case GL_RGBA_S3TC: 1030 case GL_RGBA4_S3TC: 1031 return ctx->Extensions.S3_s3tc; 1032 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1033 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1034 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1035 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1036 return ctx->Extensions.EXT_texture_sRGB 1037 && ctx->Extensions.EXT_texture_compression_s3tc; 1038 case GL_COMPRESSED_RGB_FXT1_3DFX: 1039 case GL_COMPRESSED_RGBA_FXT1_3DFX: 1040 return ctx->Extensions.TDFX_texture_compression_FXT1; 1041 case GL_COMPRESSED_RED_RGTC1: 1042 case GL_COMPRESSED_SIGNED_RED_RGTC1: 1043 case GL_COMPRESSED_RG_RGTC2: 1044 case GL_COMPRESSED_SIGNED_RG_RGTC2: 1045 return ctx->Extensions.ARB_texture_compression_rgtc; 1046 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 1047 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 1048 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 1049 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 1050 return ctx->Extensions.EXT_texture_compression_latc; 1051 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1052 return ctx->Extensions.ATI_texture_compression_3dc; 1053#if FEATURE_ES 1054 case GL_PALETTE4_RGB8_OES: 1055 case GL_PALETTE4_RGBA8_OES: 1056 case GL_PALETTE4_R5_G6_B5_OES: 1057 case GL_PALETTE4_RGBA4_OES: 1058 case GL_PALETTE4_RGB5_A1_OES: 1059 case GL_PALETTE8_RGB8_OES: 1060 case GL_PALETTE8_RGBA8_OES: 1061 case GL_PALETTE8_R5_G6_B5_OES: 1062 case GL_PALETTE8_RGBA4_OES: 1063 case GL_PALETTE8_RGB5_A1_OES: 1064 return ctx->API == API_OPENGLES; 1065#endif 1066 default: 1067 return GL_FALSE; 1068 } 1069} 1070 1071 1072/** 1073 * Does the given base texture/renderbuffer format have the channel 1074 * named by 'pname'? 1075 */ 1076GLboolean 1077_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 1078{ 1079 switch (pname) { 1080 case GL_TEXTURE_RED_SIZE: 1081 case GL_TEXTURE_RED_TYPE: 1082 case GL_RENDERBUFFER_RED_SIZE_EXT: 1083 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 1084 if (base_format == GL_RED || 1085 base_format == GL_RG || 1086 base_format == GL_RGB || 1087 base_format == GL_RGBA) { 1088 return GL_TRUE; 1089 } 1090 return GL_FALSE; 1091 case GL_TEXTURE_GREEN_SIZE: 1092 case GL_TEXTURE_GREEN_TYPE: 1093 case GL_RENDERBUFFER_GREEN_SIZE_EXT: 1094 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 1095 if (base_format == GL_RG || 1096 base_format == GL_RGB || 1097 base_format == GL_RGBA) { 1098 return GL_TRUE; 1099 } 1100 return GL_FALSE; 1101 case GL_TEXTURE_BLUE_SIZE: 1102 case GL_TEXTURE_BLUE_TYPE: 1103 case GL_RENDERBUFFER_BLUE_SIZE_EXT: 1104 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 1105 if (base_format == GL_RGB || 1106 base_format == GL_RGBA) { 1107 return GL_TRUE; 1108 } 1109 return GL_FALSE; 1110 case GL_TEXTURE_ALPHA_SIZE: 1111 case GL_TEXTURE_ALPHA_TYPE: 1112 case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 1113 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 1114 if (base_format == GL_RGBA || 1115 base_format == GL_ALPHA || 1116 base_format == GL_LUMINANCE_ALPHA) { 1117 return GL_TRUE; 1118 } 1119 return GL_FALSE; 1120 case GL_TEXTURE_LUMINANCE_SIZE: 1121 case GL_TEXTURE_LUMINANCE_TYPE: 1122 if (base_format == GL_LUMINANCE || 1123 base_format == GL_LUMINANCE_ALPHA) { 1124 return GL_TRUE; 1125 } 1126 return GL_FALSE; 1127 case GL_TEXTURE_INTENSITY_SIZE: 1128 case GL_TEXTURE_INTENSITY_TYPE: 1129 if (base_format == GL_INTENSITY) { 1130 return GL_TRUE; 1131 } 1132 return GL_FALSE; 1133 case GL_TEXTURE_DEPTH_SIZE: 1134 case GL_TEXTURE_DEPTH_TYPE: 1135 case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 1136 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 1137 if (base_format == GL_DEPTH_STENCIL || 1138 base_format == GL_DEPTH_COMPONENT) { 1139 return GL_TRUE; 1140 } 1141 return GL_FALSE; 1142 case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 1143 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 1144 if (base_format == GL_DEPTH_STENCIL || 1145 base_format == GL_STENCIL_INDEX) { 1146 return GL_TRUE; 1147 } 1148 return GL_FALSE; 1149 default: 1150 _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 1151 __FUNCTION__, pname); 1152 return GL_FALSE; 1153 } 1154 1155 return GL_FALSE; 1156} 1157 1158 1159/** 1160 * Return the address of a specific pixel in an image (1D, 2D or 3D). 1161 * 1162 * Pixel unpacking/packing parameters are observed according to \p packing. 1163 * 1164 * \param dimensions either 1, 2 or 3 to indicate dimensionality of image 1165 * \param image starting address of image data 1166 * \param width the image width 1167 * \param height theimage height 1168 * \param format the pixel format 1169 * \param type the pixel data type 1170 * \param packing the pixelstore attributes 1171 * \param img which image in the volume (0 for 1D or 2D images) 1172 * \param row row of pixel in the image (0 for 1D images) 1173 * \param column column of pixel in the image 1174 * 1175 * \return address of pixel on success, or NULL on error. 1176 * 1177 * \sa gl_pixelstore_attrib. 1178 */ 1179GLvoid * 1180_mesa_image_address( GLuint dimensions, 1181 const struct gl_pixelstore_attrib *packing, 1182 const GLvoid *image, 1183 GLsizei width, GLsizei height, 1184 GLenum format, GLenum type, 1185 GLint img, GLint row, GLint column ) 1186{ 1187 GLint alignment; /* 1, 2 or 4 */ 1188 GLint pixels_per_row; 1189 GLint rows_per_image; 1190 GLint skiprows; 1191 GLint skippixels; 1192 GLint skipimages; /* for 3-D volume images */ 1193 GLubyte *pixel_addr; 1194 1195 ASSERT(dimensions >= 1 && dimensions <= 3); 1196 1197 alignment = packing->Alignment; 1198 if (packing->RowLength > 0) { 1199 pixels_per_row = packing->RowLength; 1200 } 1201 else { 1202 pixels_per_row = width; 1203 } 1204 if (packing->ImageHeight > 0) { 1205 rows_per_image = packing->ImageHeight; 1206 } 1207 else { 1208 rows_per_image = height; 1209 } 1210 1211 skippixels = packing->SkipPixels; 1212 /* Note: SKIP_ROWS _is_ used for 1D images */ 1213 skiprows = packing->SkipRows; 1214 /* Note: SKIP_IMAGES is only used for 3D images */ 1215 skipimages = (dimensions == 3) ? packing->SkipImages : 0; 1216 1217 if (type == GL_BITMAP) { 1218 /* BITMAP data */ 1219 GLint comp_per_pixel; /* components per pixel */ 1220 GLint bytes_per_comp; /* bytes per component */ 1221 GLint bytes_per_row; 1222 GLint bytes_per_image; 1223 1224 /* Compute bytes per component */ 1225 bytes_per_comp = _mesa_sizeof_packed_type( type ); 1226 if (bytes_per_comp < 0) { 1227 return NULL; 1228 } 1229 1230 /* Compute number of components per pixel */ 1231 comp_per_pixel = _mesa_components_in_format( format ); 1232 if (comp_per_pixel < 0) { 1233 return NULL; 1234 } 1235 1236 bytes_per_row = alignment 1237 * CEILING( comp_per_pixel*pixels_per_row, 8*alignment ); 1238 1239 bytes_per_image = bytes_per_row * rows_per_image; 1240 1241 pixel_addr = (GLubyte *) image 1242 + (skipimages + img) * bytes_per_image 1243 + (skiprows + row) * bytes_per_row 1244 + (skippixels + column) / 8; 1245 } 1246 else { 1247 /* Non-BITMAP data */ 1248 GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image; 1249 GLint topOfImage; 1250 1251 bytes_per_pixel = _mesa_bytes_per_pixel( format, type ); 1252 1253 /* The pixel type and format should have been error checked earlier */ 1254 assert(bytes_per_pixel > 0); 1255 1256 bytes_per_row = pixels_per_row * bytes_per_pixel; 1257 remainder = bytes_per_row % alignment; 1258 if (remainder > 0) 1259 bytes_per_row += (alignment - remainder); 1260 1261 ASSERT(bytes_per_row % alignment == 0); 1262 1263 bytes_per_image = bytes_per_row * rows_per_image; 1264 1265 if (packing->Invert) { 1266 /* set pixel_addr to the last row */ 1267 topOfImage = bytes_per_row * (height - 1); 1268 bytes_per_row = -bytes_per_row; 1269 } 1270 else { 1271 topOfImage = 0; 1272 } 1273 1274 /* compute final pixel address */ 1275 pixel_addr = (GLubyte *) image 1276 + (skipimages + img) * bytes_per_image 1277 + topOfImage 1278 + (skiprows + row) * bytes_per_row 1279 + (skippixels + column) * bytes_per_pixel; 1280 } 1281 1282 return (GLvoid *) pixel_addr; 1283} 1284 1285 1286GLvoid * 1287_mesa_image_address1d( const struct gl_pixelstore_attrib *packing, 1288 const GLvoid *image, 1289 GLsizei width, 1290 GLenum format, GLenum type, 1291 GLint column ) 1292{ 1293 return _mesa_image_address(1, packing, image, width, 1, 1294 format, type, 0, 0, column); 1295} 1296 1297 1298GLvoid * 1299_mesa_image_address2d( const struct gl_pixelstore_attrib *packing, 1300 const GLvoid *image, 1301 GLsizei width, GLsizei height, 1302 GLenum format, GLenum type, 1303 GLint row, GLint column ) 1304{ 1305 return _mesa_image_address(2, packing, image, width, height, 1306 format, type, 0, row, column); 1307} 1308 1309 1310GLvoid * 1311_mesa_image_address3d( const struct gl_pixelstore_attrib *packing, 1312 const GLvoid *image, 1313 GLsizei width, GLsizei height, 1314 GLenum format, GLenum type, 1315 GLint img, GLint row, GLint column ) 1316{ 1317 return _mesa_image_address(3, packing, image, width, height, 1318 format, type, img, row, column); 1319} 1320 1321 1322 1323/** 1324 * Compute the stride (in bytes) between image rows. 1325 * 1326 * \param packing the pixelstore attributes 1327 * \param width image width. 1328 * \param format pixel format. 1329 * \param type pixel data type. 1330 * 1331 * \return the stride in bytes for the given parameters, or -1 if error 1332 */ 1333GLint 1334_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing, 1335 GLint width, GLenum format, GLenum type ) 1336{ 1337 GLint bytesPerRow, remainder; 1338 1339 ASSERT(packing); 1340 1341 if (type == GL_BITMAP) { 1342 if (packing->RowLength == 0) { 1343 bytesPerRow = (width + 7) / 8; 1344 } 1345 else { 1346 bytesPerRow = (packing->RowLength + 7) / 8; 1347 } 1348 } 1349 else { 1350 /* Non-BITMAP data */ 1351 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 1352 if (bytesPerPixel <= 0) 1353 return -1; /* error */ 1354 if (packing->RowLength == 0) { 1355 bytesPerRow = bytesPerPixel * width; 1356 } 1357 else { 1358 bytesPerRow = bytesPerPixel * packing->RowLength; 1359 } 1360 } 1361 1362 remainder = bytesPerRow % packing->Alignment; 1363 if (remainder > 0) { 1364 bytesPerRow += (packing->Alignment - remainder); 1365 } 1366 1367 if (packing->Invert) { 1368 /* negate the bytes per row (negative row stride) */ 1369 bytesPerRow = -bytesPerRow; 1370 } 1371 1372 return bytesPerRow; 1373} 1374 1375 1376/* 1377 * Compute the stride between images in a 3D texture (in bytes) for the given 1378 * pixel packing parameters and image width, format and type. 1379 */ 1380GLint 1381_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing, 1382 GLint width, GLint height, 1383 GLenum format, GLenum type ) 1384{ 1385 GLint bytesPerRow, bytesPerImage, remainder; 1386 1387 ASSERT(packing); 1388 1389 if (type == GL_BITMAP) { 1390 if (packing->RowLength == 0) { 1391 bytesPerRow = (width + 7) / 8; 1392 } 1393 else { 1394 bytesPerRow = (packing->RowLength + 7) / 8; 1395 } 1396 } 1397 else { 1398 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 1399 1400 if (bytesPerPixel <= 0) 1401 return -1; /* error */ 1402 if (packing->RowLength == 0) { 1403 bytesPerRow = bytesPerPixel * width; 1404 } 1405 else { 1406 bytesPerRow = bytesPerPixel * packing->RowLength; 1407 } 1408 } 1409 1410 remainder = bytesPerRow % packing->Alignment; 1411 if (remainder > 0) 1412 bytesPerRow += (packing->Alignment - remainder); 1413 1414 if (packing->ImageHeight == 0) 1415 bytesPerImage = bytesPerRow * height; 1416 else 1417 bytesPerImage = bytesPerRow * packing->ImageHeight; 1418 1419 return bytesPerImage; 1420} 1421 1422 1423 1424/** 1425 * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel. 1426 * This is typically used to convert a bitmap into a GLubyte/pixel texture. 1427 * "On" bits will set texels to \p onValue. 1428 * "Off" bits will not modify texels. 1429 * \param width src bitmap width in pixels 1430 * \param height src bitmap height in pixels 1431 * \param unpack bitmap unpacking state 1432 * \param bitmap the src bitmap data 1433 * \param destBuffer start of dest buffer 1434 * \param destStride row stride in dest buffer 1435 * \param onValue if bit is 1, set destBuffer pixel to this value 1436 */ 1437void 1438_mesa_expand_bitmap(GLsizei width, GLsizei height, 1439 const struct gl_pixelstore_attrib *unpack, 1440 const GLubyte *bitmap, 1441 GLubyte *destBuffer, GLint destStride, 1442 GLubyte onValue) 1443{ 1444 const GLubyte *srcRow = (const GLubyte *) 1445 _mesa_image_address2d(unpack, bitmap, width, height, 1446 GL_COLOR_INDEX, GL_BITMAP, 0, 0); 1447 const GLint srcStride = _mesa_image_row_stride(unpack, width, 1448 GL_COLOR_INDEX, GL_BITMAP); 1449 GLint row, col; 1450 1451#define SET_PIXEL(COL, ROW) \ 1452 destBuffer[(ROW) * destStride + (COL)] = onValue; 1453 1454 for (row = 0; row < height; row++) { 1455 const GLubyte *src = srcRow; 1456 1457 if (unpack->LsbFirst) { 1458 /* Lsb first */ 1459 GLubyte mask = 1U << (unpack->SkipPixels & 0x7); 1460 for (col = 0; col < width; col++) { 1461 1462 if (*src & mask) { 1463 SET_PIXEL(col, row); 1464 } 1465 1466 if (mask == 128U) { 1467 src++; 1468 mask = 1U; 1469 } 1470 else { 1471 mask = mask << 1; 1472 } 1473 } 1474 1475 /* get ready for next row */ 1476 if (mask != 1) 1477 src++; 1478 } 1479 else { 1480 /* Msb first */ 1481 GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); 1482 for (col = 0; col < width; col++) { 1483 1484 if (*src & mask) { 1485 SET_PIXEL(col, row); 1486 } 1487 1488 if (mask == 1U) { 1489 src++; 1490 mask = 128U; 1491 } 1492 else { 1493 mask = mask >> 1; 1494 } 1495 } 1496 1497 /* get ready for next row */ 1498 if (mask != 128) 1499 src++; 1500 } 1501 1502 srcRow += srcStride; 1503 } /* row */ 1504 1505#undef SET_PIXEL 1506} 1507 1508 1509 1510 1511/** 1512 * Convert an array of RGBA colors from one datatype to another. 1513 * NOTE: src may equal dst. In that case, we use a temporary buffer. 1514 */ 1515void 1516_mesa_convert_colors(GLenum srcType, const GLvoid *src, 1517 GLenum dstType, GLvoid *dst, 1518 GLuint count, const GLubyte mask[]) 1519{ 1520 GLuint tempBuffer[MAX_WIDTH][4]; 1521 const GLboolean useTemp = (src == dst); 1522 1523 ASSERT(srcType != dstType); 1524 1525 switch (srcType) { 1526 case GL_UNSIGNED_BYTE: 1527 if (dstType == GL_UNSIGNED_SHORT) { 1528 const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src; 1529 GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst); 1530 GLuint i; 1531 for (i = 0; i < count; i++) { 1532 if (!mask || mask[i]) { 1533 dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]); 1534 dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]); 1535 dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]); 1536 dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]); 1537 } 1538 } 1539 if (useTemp) 1540 memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort)); 1541 } 1542 else { 1543 const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src; 1544 GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst); 1545 GLuint i; 1546 ASSERT(dstType == GL_FLOAT); 1547 for (i = 0; i < count; i++) { 1548 if (!mask || mask[i]) { 1549 dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]); 1550 dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]); 1551 dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]); 1552 dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]); 1553 } 1554 } 1555 if (useTemp) 1556 memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat)); 1557 } 1558 break; 1559 case GL_UNSIGNED_SHORT: 1560 if (dstType == GL_UNSIGNED_BYTE) { 1561 const GLushort (*src2)[4] = (const GLushort (*)[4]) src; 1562 GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst); 1563 GLuint i; 1564 for (i = 0; i < count; i++) { 1565 if (!mask || mask[i]) { 1566 dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]); 1567 dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]); 1568 dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]); 1569 dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]); 1570 } 1571 } 1572 if (useTemp) 1573 memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte)); 1574 } 1575 else { 1576 const GLushort (*src2)[4] = (const GLushort (*)[4]) src; 1577 GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst); 1578 GLuint i; 1579 ASSERT(dstType == GL_FLOAT); 1580 for (i = 0; i < count; i++) { 1581 if (!mask || mask[i]) { 1582 dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]); 1583 dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]); 1584 dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]); 1585 dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]); 1586 } 1587 } 1588 if (useTemp) 1589 memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat)); 1590 } 1591 break; 1592 case GL_FLOAT: 1593 if (dstType == GL_UNSIGNED_BYTE) { 1594 const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src; 1595 GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst); 1596 GLuint i; 1597 for (i = 0; i < count; i++) { 1598 if (!mask || mask[i]) 1599 _mesa_unclamped_float_rgba_to_ubyte(dst1[i], src4[i]); 1600 } 1601 if (useTemp) 1602 memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte)); 1603 } 1604 else { 1605 const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src; 1606 GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst); 1607 GLuint i; 1608 ASSERT(dstType == GL_UNSIGNED_SHORT); 1609 for (i = 0; i < count; i++) { 1610 if (!mask || mask[i]) { 1611 UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]); 1612 UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]); 1613 UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]); 1614 UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]); 1615 } 1616 } 1617 if (useTemp) 1618 memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort)); 1619 } 1620 break; 1621 default: 1622 _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors"); 1623 } 1624} 1625 1626 1627 1628 1629/** 1630 * Perform basic clipping for glDrawPixels. The image's position and size 1631 * and the unpack SkipPixels and SkipRows are adjusted so that the image 1632 * region is entirely within the window and scissor bounds. 1633 * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1). 1634 * If Pixel.ZoomY is -1, *destY will be changed to be the first row which 1635 * we'll actually write. Beforehand, *destY-1 is the first drawing row. 1636 * 1637 * \return GL_TRUE if image is ready for drawing or 1638 * GL_FALSE if image was completely clipped away (draw nothing) 1639 */ 1640GLboolean 1641_mesa_clip_drawpixels(const struct gl_context *ctx, 1642 GLint *destX, GLint *destY, 1643 GLsizei *width, GLsizei *height, 1644 struct gl_pixelstore_attrib *unpack) 1645{ 1646 const struct gl_framebuffer *buffer = ctx->DrawBuffer; 1647 1648 if (unpack->RowLength == 0) { 1649 unpack->RowLength = *width; 1650 } 1651 1652 ASSERT(ctx->Pixel.ZoomX == 1.0F); 1653 ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F); 1654 1655 /* left clipping */ 1656 if (*destX < buffer->_Xmin) { 1657 unpack->SkipPixels += (buffer->_Xmin - *destX); 1658 *width -= (buffer->_Xmin - *destX); 1659 *destX = buffer->_Xmin; 1660 } 1661 /* right clipping */ 1662 if (*destX + *width > buffer->_Xmax) 1663 *width -= (*destX + *width - buffer->_Xmax); 1664 1665 if (*width <= 0) 1666 return GL_FALSE; 1667 1668 if (ctx->Pixel.ZoomY == 1.0F) { 1669 /* bottom clipping */ 1670 if (*destY < buffer->_Ymin) { 1671 unpack->SkipRows += (buffer->_Ymin - *destY); 1672 *height -= (buffer->_Ymin - *destY); 1673 *destY = buffer->_Ymin; 1674 } 1675 /* top clipping */ 1676 if (*destY + *height > buffer->_Ymax) 1677 *height -= (*destY + *height - buffer->_Ymax); 1678 } 1679 else { /* upside down */ 1680 /* top clipping */ 1681 if (*destY > buffer->_Ymax) { 1682 unpack->SkipRows += (*destY - buffer->_Ymax); 1683 *height -= (*destY - buffer->_Ymax); 1684 *destY = buffer->_Ymax; 1685 } 1686 /* bottom clipping */ 1687 if (*destY - *height < buffer->_Ymin) 1688 *height -= (buffer->_Ymin - (*destY - *height)); 1689 /* adjust destY so it's the first row to write to */ 1690 (*destY)--; 1691 } 1692 1693 if (*height <= 0) 1694 return GL_FALSE; 1695 1696 return GL_TRUE; 1697} 1698 1699 1700/** 1701 * Perform clipping for glReadPixels. The image's window position 1702 * and size, and the pack skipPixels, skipRows and rowLength are adjusted 1703 * so that the image region is entirely within the window bounds. 1704 * Note: this is different from _mesa_clip_drawpixels() in that the 1705 * scissor box is ignored, and we use the bounds of the current readbuffer 1706 * surface. 1707 * 1708 * \return GL_TRUE if region to read is in bounds 1709 * GL_FALSE if region is completely out of bounds (nothing to read) 1710 */ 1711GLboolean 1712_mesa_clip_readpixels(const struct gl_context *ctx, 1713 GLint *srcX, GLint *srcY, 1714 GLsizei *width, GLsizei *height, 1715 struct gl_pixelstore_attrib *pack) 1716{ 1717 const struct gl_framebuffer *buffer = ctx->ReadBuffer; 1718 1719 if (pack->RowLength == 0) { 1720 pack->RowLength = *width; 1721 } 1722 1723 /* left clipping */ 1724 if (*srcX < 0) { 1725 pack->SkipPixels += (0 - *srcX); 1726 *width -= (0 - *srcX); 1727 *srcX = 0; 1728 } 1729 /* right clipping */ 1730 if (*srcX + *width > (GLsizei) buffer->Width) 1731 *width -= (*srcX + *width - buffer->Width); 1732 1733 if (*width <= 0) 1734 return GL_FALSE; 1735 1736 /* bottom clipping */ 1737 if (*srcY < 0) { 1738 pack->SkipRows += (0 - *srcY); 1739 *height -= (0 - *srcY); 1740 *srcY = 0; 1741 } 1742 /* top clipping */ 1743 if (*srcY + *height > (GLsizei) buffer->Height) 1744 *height -= (*srcY + *height - buffer->Height); 1745 1746 if (*height <= 0) 1747 return GL_FALSE; 1748 1749 return GL_TRUE; 1750} 1751 1752 1753/** 1754 * Do clipping for a glCopyTexSubImage call. 1755 * The framebuffer source region might extend outside the framebuffer 1756 * bounds. Clip the source region against the framebuffer bounds and 1757 * adjust the texture/dest position and size accordingly. 1758 * 1759 * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise. 1760 */ 1761GLboolean 1762_mesa_clip_copytexsubimage(const struct gl_context *ctx, 1763 GLint *destX, GLint *destY, 1764 GLint *srcX, GLint *srcY, 1765 GLsizei *width, GLsizei *height) 1766{ 1767 const struct gl_framebuffer *fb = ctx->ReadBuffer; 1768 const GLint srcX0 = *srcX, srcY0 = *srcY; 1769 1770 if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height, 1771 srcX, srcY, width, height)) { 1772 *destX = *destX + *srcX - srcX0; 1773 *destY = *destY + *srcY - srcY0; 1774 1775 return GL_TRUE; 1776 } 1777 else { 1778 return GL_FALSE; 1779 } 1780} 1781 1782 1783 1784/** 1785 * Clip the rectangle defined by (x, y, width, height) against the bounds 1786 * specified by [xmin, xmax) and [ymin, ymax). 1787 * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise. 1788 */ 1789GLboolean 1790_mesa_clip_to_region(GLint xmin, GLint ymin, 1791 GLint xmax, GLint ymax, 1792 GLint *x, GLint *y, 1793 GLsizei *width, GLsizei *height ) 1794{ 1795 /* left clipping */ 1796 if (*x < xmin) { 1797 *width -= (xmin - *x); 1798 *x = xmin; 1799 } 1800 1801 /* right clipping */ 1802 if (*x + *width > xmax) 1803 *width -= (*x + *width - xmax); 1804 1805 if (*width <= 0) 1806 return GL_FALSE; 1807 1808 /* bottom (or top) clipping */ 1809 if (*y < ymin) { 1810 *height -= (ymin - *y); 1811 *y = ymin; 1812 } 1813 1814 /* top (or bottom) clipping */ 1815 if (*y + *height > ymax) 1816 *height -= (*y + *height - ymax); 1817 1818 if (*height <= 0) 1819 return GL_FALSE; 1820 1821 return GL_TRUE; 1822} 1823 1824 1825/** 1826 * Clip dst coords against Xmax (or Ymax). 1827 */ 1828static inline void 1829clip_right_or_top(GLint *srcX0, GLint *srcX1, 1830 GLint *dstX0, GLint *dstX1, 1831 GLint maxValue) 1832{ 1833 GLfloat t, bias; 1834 1835 if (*dstX1 > maxValue) { 1836 /* X1 outside right edge */ 1837 ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */ 1838 t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0); 1839 /* chop off [t, 1] part */ 1840 ASSERT(t >= 0.0 && t <= 1.0); 1841 *dstX1 = maxValue; 1842 bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; 1843 *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias); 1844 } 1845 else if (*dstX0 > maxValue) { 1846 /* X0 outside right edge */ 1847 ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */ 1848 t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1); 1849 /* chop off [t, 1] part */ 1850 ASSERT(t >= 0.0 && t <= 1.0); 1851 *dstX0 = maxValue; 1852 bias = (*srcX0 < *srcX1) ? -0.5F : 0.5F; 1853 *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias); 1854 } 1855} 1856 1857 1858/** 1859 * Clip dst coords against Xmin (or Ymin). 1860 */ 1861static inline void 1862clip_left_or_bottom(GLint *srcX0, GLint *srcX1, 1863 GLint *dstX0, GLint *dstX1, 1864 GLint minValue) 1865{ 1866 GLfloat t, bias; 1867 1868 if (*dstX0 < minValue) { 1869 /* X0 outside left edge */ 1870 ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */ 1871 t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0); 1872 /* chop off [0, t] part */ 1873 ASSERT(t >= 0.0 && t <= 1.0); 1874 *dstX0 = minValue; 1875 bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; /* flipped??? */ 1876 *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias); 1877 } 1878 else if (*dstX1 < minValue) { 1879 /* X1 outside left edge */ 1880 ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */ 1881 t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1); 1882 /* chop off [0, t] part */ 1883 ASSERT(t >= 0.0 && t <= 1.0); 1884 *dstX1 = minValue; 1885 bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; 1886 *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias); 1887 } 1888} 1889 1890 1891/** 1892 * Do clipping of blit src/dest rectangles. 1893 * The dest rect is clipped against both the buffer bounds and scissor bounds. 1894 * The src rect is just clipped against the buffer bounds. 1895 * 1896 * When either the src or dest rect is clipped, the other is also clipped 1897 * proportionately! 1898 * 1899 * Note that X0 need not be less than X1 (same for Y) for either the source 1900 * and dest rects. That makes the clipping a little trickier. 1901 * 1902 * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped 1903 */ 1904GLboolean 1905_mesa_clip_blit(struct gl_context *ctx, 1906 GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1, 1907 GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1) 1908{ 1909 const GLint srcXmin = 0; 1910 const GLint srcXmax = ctx->ReadBuffer->Width; 1911 const GLint srcYmin = 0; 1912 const GLint srcYmax = ctx->ReadBuffer->Height; 1913 1914 /* these include scissor bounds */ 1915 const GLint dstXmin = ctx->DrawBuffer->_Xmin; 1916 const GLint dstXmax = ctx->DrawBuffer->_Xmax; 1917 const GLint dstYmin = ctx->DrawBuffer->_Ymin; 1918 const GLint dstYmax = ctx->DrawBuffer->_Ymax; 1919 1920 /* 1921 printf("PreClipX: src: %d .. %d dst: %d .. %d\n", 1922 *srcX0, *srcX1, *dstX0, *dstX1); 1923 printf("PreClipY: src: %d .. %d dst: %d .. %d\n", 1924 *srcY0, *srcY1, *dstY0, *dstY1); 1925 */ 1926 1927 /* trivial rejection tests */ 1928 if (*dstX0 == *dstX1) 1929 return GL_FALSE; /* no width */ 1930 if (*dstX0 <= dstXmin && *dstX1 <= dstXmin) 1931 return GL_FALSE; /* totally out (left) of bounds */ 1932 if (*dstX0 >= dstXmax && *dstX1 >= dstXmax) 1933 return GL_FALSE; /* totally out (right) of bounds */ 1934 1935 if (*dstY0 == *dstY1) 1936 return GL_FALSE; 1937 if (*dstY0 <= dstYmin && *dstY1 <= dstYmin) 1938 return GL_FALSE; 1939 if (*dstY0 >= dstYmax && *dstY1 >= dstYmax) 1940 return GL_FALSE; 1941 1942 if (*srcX0 == *srcX1) 1943 return GL_FALSE; 1944 if (*srcX0 <= srcXmin && *srcX1 <= srcXmin) 1945 return GL_FALSE; 1946 if (*srcX0 >= srcXmax && *srcX1 >= srcXmax) 1947 return GL_FALSE; 1948 1949 if (*srcY0 == *srcY1) 1950 return GL_FALSE; 1951 if (*srcY0 <= srcYmin && *srcY1 <= srcYmin) 1952 return GL_FALSE; 1953 if (*srcY0 >= srcYmax && *srcY1 >= srcYmax) 1954 return GL_FALSE; 1955 1956 /* 1957 * dest clip 1958 */ 1959 clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax); 1960 clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax); 1961 clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin); 1962 clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin); 1963 1964 /* 1965 * src clip (just swap src/dst values from above) 1966 */ 1967 clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax); 1968 clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax); 1969 clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin); 1970 clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin); 1971 1972 /* 1973 printf("PostClipX: src: %d .. %d dst: %d .. %d\n", 1974 *srcX0, *srcX1, *dstX0, *dstX1); 1975 printf("PostClipY: src: %d .. %d dst: %d .. %d\n", 1976 *srcY0, *srcY1, *dstY0, *dstY1); 1977 */ 1978 1979 ASSERT(*dstX0 >= dstXmin); 1980 ASSERT(*dstX0 <= dstXmax); 1981 ASSERT(*dstX1 >= dstXmin); 1982 ASSERT(*dstX1 <= dstXmax); 1983 1984 ASSERT(*dstY0 >= dstYmin); 1985 ASSERT(*dstY0 <= dstYmax); 1986 ASSERT(*dstY1 >= dstYmin); 1987 ASSERT(*dstY1 <= dstYmax); 1988 1989 ASSERT(*srcX0 >= srcXmin); 1990 ASSERT(*srcX0 <= srcXmax); 1991 ASSERT(*srcX1 >= srcXmin); 1992 ASSERT(*srcX1 <= srcXmax); 1993 1994 ASSERT(*srcY0 >= srcYmin); 1995 ASSERT(*srcY0 <= srcYmax); 1996 ASSERT(*srcY1 >= srcYmin); 1997 ASSERT(*srcY1 <= srcYmax); 1998 1999 return GL_TRUE; 2000} 2001