pack.c revision 3464ebd5
13464ebd5Sriastradh/* 23464ebd5Sriastradh * Mesa 3-D graphics library 33464ebd5Sriastradh * 43464ebd5Sriastradh * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 53464ebd5Sriastradh * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 63464ebd5Sriastradh * 73464ebd5Sriastradh * Permission is hereby granted, free of charge, to any person obtaining a 83464ebd5Sriastradh * copy of this software and associated documentation files (the "Software"), 93464ebd5Sriastradh * to deal in the Software without restriction, including without limitation 103464ebd5Sriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense, 113464ebd5Sriastradh * and/or sell copies of the Software, and to permit persons to whom the 123464ebd5Sriastradh * Software is furnished to do so, subject to the following conditions: 133464ebd5Sriastradh * 143464ebd5Sriastradh * The above copyright notice and this permission notice shall be included 153464ebd5Sriastradh * in all copies or substantial portions of the Software. 163464ebd5Sriastradh * 173464ebd5Sriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183464ebd5Sriastradh * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 193464ebd5Sriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 203464ebd5Sriastradh * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 213464ebd5Sriastradh * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 223464ebd5Sriastradh * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 233464ebd5Sriastradh */ 243464ebd5Sriastradh 253464ebd5Sriastradh 263464ebd5Sriastradh/** 273464ebd5Sriastradh * \file pack.c 283464ebd5Sriastradh * Image and pixel span packing and unpacking. 293464ebd5Sriastradh */ 303464ebd5Sriastradh 313464ebd5Sriastradh 323464ebd5Sriastradh#include "glheader.h" 333464ebd5Sriastradh#include "colormac.h" 343464ebd5Sriastradh#include "enums.h" 353464ebd5Sriastradh#include "image.h" 363464ebd5Sriastradh#include "imports.h" 373464ebd5Sriastradh#include "mtypes.h" 383464ebd5Sriastradh#include "pack.h" 393464ebd5Sriastradh#include "pixeltransfer.h" 403464ebd5Sriastradh#include "imports.h" 413464ebd5Sriastradh#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 423464ebd5Sriastradh#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 433464ebd5Sriastradh 443464ebd5Sriastradh 453464ebd5Sriastradh/** 463464ebd5Sriastradh * NOTE: 473464ebd5Sriastradh * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when 483464ebd5Sriastradh * we later convert the float to a packed integer value (such as for 493464ebd5Sriastradh * GL_RGB5_A1) because we'll wind up with a non-zero value. 503464ebd5Sriastradh * 513464ebd5Sriastradh * We redefine the macros here so zero is handled correctly. 523464ebd5Sriastradh */ 533464ebd5Sriastradh#undef BYTE_TO_FLOAT 543464ebd5Sriastradh#define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F))) 553464ebd5Sriastradh 563464ebd5Sriastradh#undef SHORT_TO_FLOAT 573464ebd5Sriastradh#define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F))) 583464ebd5Sriastradh 593464ebd5Sriastradh 603464ebd5Sriastradh 613464ebd5Sriastradh/** Compute ceiling of integer quotient of A divided by B. */ 623464ebd5Sriastradh#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) 633464ebd5Sriastradh 643464ebd5Sriastradh 653464ebd5Sriastradh/** 663464ebd5Sriastradh * Flip the 8 bits in each byte of the given array. 673464ebd5Sriastradh * 683464ebd5Sriastradh * \param p array. 693464ebd5Sriastradh * \param n number of bytes. 703464ebd5Sriastradh * 713464ebd5Sriastradh * \todo try this trick to flip bytes someday: 723464ebd5Sriastradh * \code 733464ebd5Sriastradh * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); 743464ebd5Sriastradh * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); 753464ebd5Sriastradh * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); 763464ebd5Sriastradh * \endcode 773464ebd5Sriastradh */ 783464ebd5Sriastradhstatic void 793464ebd5Sriastradhflip_bytes( GLubyte *p, GLuint n ) 803464ebd5Sriastradh{ 813464ebd5Sriastradh GLuint i, a, b; 823464ebd5Sriastradh for (i = 0; i < n; i++) { 833464ebd5Sriastradh b = (GLuint) p[i]; /* words are often faster than bytes */ 843464ebd5Sriastradh a = ((b & 0x01) << 7) | 853464ebd5Sriastradh ((b & 0x02) << 5) | 863464ebd5Sriastradh ((b & 0x04) << 3) | 873464ebd5Sriastradh ((b & 0x08) << 1) | 883464ebd5Sriastradh ((b & 0x10) >> 1) | 893464ebd5Sriastradh ((b & 0x20) >> 3) | 903464ebd5Sriastradh ((b & 0x40) >> 5) | 913464ebd5Sriastradh ((b & 0x80) >> 7); 923464ebd5Sriastradh p[i] = (GLubyte) a; 933464ebd5Sriastradh } 943464ebd5Sriastradh} 953464ebd5Sriastradh 963464ebd5Sriastradh 973464ebd5Sriastradh 983464ebd5Sriastradh/* 993464ebd5Sriastradh * Unpack a 32x32 pixel polygon stipple from user memory using the 1003464ebd5Sriastradh * current pixel unpack settings. 1013464ebd5Sriastradh */ 1023464ebd5Sriastradhvoid 1033464ebd5Sriastradh_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32], 1043464ebd5Sriastradh const struct gl_pixelstore_attrib *unpacking ) 1053464ebd5Sriastradh{ 1063464ebd5Sriastradh GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking); 1073464ebd5Sriastradh if (ptrn) { 1083464ebd5Sriastradh /* Convert pattern from GLubytes to GLuints and handle big/little 1093464ebd5Sriastradh * endian differences 1103464ebd5Sriastradh */ 1113464ebd5Sriastradh GLubyte *p = ptrn; 1123464ebd5Sriastradh GLint i; 1133464ebd5Sriastradh for (i = 0; i < 32; i++) { 1143464ebd5Sriastradh dest[i] = (p[0] << 24) 1153464ebd5Sriastradh | (p[1] << 16) 1163464ebd5Sriastradh | (p[2] << 8) 1173464ebd5Sriastradh | (p[3] ); 1183464ebd5Sriastradh p += 4; 1193464ebd5Sriastradh } 1203464ebd5Sriastradh free(ptrn); 1213464ebd5Sriastradh } 1223464ebd5Sriastradh} 1233464ebd5Sriastradh 1243464ebd5Sriastradh 1253464ebd5Sriastradh/* 1263464ebd5Sriastradh * Pack polygon stipple into user memory given current pixel packing 1273464ebd5Sriastradh * settings. 1283464ebd5Sriastradh */ 1293464ebd5Sriastradhvoid 1303464ebd5Sriastradh_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest, 1313464ebd5Sriastradh const struct gl_pixelstore_attrib *packing ) 1323464ebd5Sriastradh{ 1333464ebd5Sriastradh /* Convert pattern from GLuints to GLubytes to handle big/little 1343464ebd5Sriastradh * endian differences. 1353464ebd5Sriastradh */ 1363464ebd5Sriastradh GLubyte ptrn[32*4]; 1373464ebd5Sriastradh GLint i; 1383464ebd5Sriastradh for (i = 0; i < 32; i++) { 1393464ebd5Sriastradh ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff); 1403464ebd5Sriastradh ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff); 1413464ebd5Sriastradh ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff); 1423464ebd5Sriastradh ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff); 1433464ebd5Sriastradh } 1443464ebd5Sriastradh 1453464ebd5Sriastradh _mesa_pack_bitmap(32, 32, ptrn, dest, packing); 1463464ebd5Sriastradh} 1473464ebd5Sriastradh 1483464ebd5Sriastradh 1493464ebd5Sriastradh/* 1503464ebd5Sriastradh * Unpack bitmap data. Resulting data will be in most-significant-bit-first 1513464ebd5Sriastradh * order with row alignment = 1 byte. 1523464ebd5Sriastradh */ 1533464ebd5SriastradhGLvoid * 1543464ebd5Sriastradh_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, 1553464ebd5Sriastradh const struct gl_pixelstore_attrib *packing ) 1563464ebd5Sriastradh{ 1573464ebd5Sriastradh GLint bytes, row, width_in_bytes; 1583464ebd5Sriastradh GLubyte *buffer, *dst; 1593464ebd5Sriastradh 1603464ebd5Sriastradh if (!pixels) 1613464ebd5Sriastradh return NULL; 1623464ebd5Sriastradh 1633464ebd5Sriastradh /* Alloc dest storage */ 1643464ebd5Sriastradh bytes = ((width + 7) / 8 * height); 1653464ebd5Sriastradh buffer = (GLubyte *) malloc( bytes ); 1663464ebd5Sriastradh if (!buffer) 1673464ebd5Sriastradh return NULL; 1683464ebd5Sriastradh 1693464ebd5Sriastradh width_in_bytes = CEILING( width, 8 ); 1703464ebd5Sriastradh dst = buffer; 1713464ebd5Sriastradh for (row = 0; row < height; row++) { 1723464ebd5Sriastradh const GLubyte *src = (const GLubyte *) 1733464ebd5Sriastradh _mesa_image_address2d(packing, pixels, width, height, 1743464ebd5Sriastradh GL_COLOR_INDEX, GL_BITMAP, row, 0); 1753464ebd5Sriastradh if (!src) { 1763464ebd5Sriastradh free(buffer); 1773464ebd5Sriastradh return NULL; 1783464ebd5Sriastradh } 1793464ebd5Sriastradh 1803464ebd5Sriastradh if ((packing->SkipPixels & 7) == 0) { 1813464ebd5Sriastradh memcpy( dst, src, width_in_bytes ); 1823464ebd5Sriastradh if (packing->LsbFirst) { 1833464ebd5Sriastradh flip_bytes( dst, width_in_bytes ); 1843464ebd5Sriastradh } 1853464ebd5Sriastradh } 1863464ebd5Sriastradh else { 1873464ebd5Sriastradh /* handling SkipPixels is a bit tricky (no pun intended!) */ 1883464ebd5Sriastradh GLint i; 1893464ebd5Sriastradh if (packing->LsbFirst) { 1903464ebd5Sriastradh GLubyte srcMask = 1 << (packing->SkipPixels & 0x7); 1913464ebd5Sriastradh GLubyte dstMask = 128; 1923464ebd5Sriastradh const GLubyte *s = src; 1933464ebd5Sriastradh GLubyte *d = dst; 1943464ebd5Sriastradh *d = 0; 1953464ebd5Sriastradh for (i = 0; i < width; i++) { 1963464ebd5Sriastradh if (*s & srcMask) { 1973464ebd5Sriastradh *d |= dstMask; 1983464ebd5Sriastradh } 1993464ebd5Sriastradh if (srcMask == 128) { 2003464ebd5Sriastradh srcMask = 1; 2013464ebd5Sriastradh s++; 2023464ebd5Sriastradh } 2033464ebd5Sriastradh else { 2043464ebd5Sriastradh srcMask = srcMask << 1; 2053464ebd5Sriastradh } 2063464ebd5Sriastradh if (dstMask == 1) { 2073464ebd5Sriastradh dstMask = 128; 2083464ebd5Sriastradh d++; 2093464ebd5Sriastradh *d = 0; 2103464ebd5Sriastradh } 2113464ebd5Sriastradh else { 2123464ebd5Sriastradh dstMask = dstMask >> 1; 2133464ebd5Sriastradh } 2143464ebd5Sriastradh } 2153464ebd5Sriastradh } 2163464ebd5Sriastradh else { 2173464ebd5Sriastradh GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7); 2183464ebd5Sriastradh GLubyte dstMask = 128; 2193464ebd5Sriastradh const GLubyte *s = src; 2203464ebd5Sriastradh GLubyte *d = dst; 2213464ebd5Sriastradh *d = 0; 2223464ebd5Sriastradh for (i = 0; i < width; i++) { 2233464ebd5Sriastradh if (*s & srcMask) { 2243464ebd5Sriastradh *d |= dstMask; 2253464ebd5Sriastradh } 2263464ebd5Sriastradh if (srcMask == 1) { 2273464ebd5Sriastradh srcMask = 128; 2283464ebd5Sriastradh s++; 2293464ebd5Sriastradh } 2303464ebd5Sriastradh else { 2313464ebd5Sriastradh srcMask = srcMask >> 1; 2323464ebd5Sriastradh } 2333464ebd5Sriastradh if (dstMask == 1) { 2343464ebd5Sriastradh dstMask = 128; 2353464ebd5Sriastradh d++; 2363464ebd5Sriastradh *d = 0; 2373464ebd5Sriastradh } 2383464ebd5Sriastradh else { 2393464ebd5Sriastradh dstMask = dstMask >> 1; 2403464ebd5Sriastradh } 2413464ebd5Sriastradh } 2423464ebd5Sriastradh } 2433464ebd5Sriastradh } 2443464ebd5Sriastradh dst += width_in_bytes; 2453464ebd5Sriastradh } 2463464ebd5Sriastradh 2473464ebd5Sriastradh return buffer; 2483464ebd5Sriastradh} 2493464ebd5Sriastradh 2503464ebd5Sriastradh 2513464ebd5Sriastradh/* 2523464ebd5Sriastradh * Pack bitmap data. 2533464ebd5Sriastradh */ 2543464ebd5Sriastradhvoid 2553464ebd5Sriastradh_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source, 2563464ebd5Sriastradh GLubyte *dest, const struct gl_pixelstore_attrib *packing ) 2573464ebd5Sriastradh{ 2583464ebd5Sriastradh GLint row, width_in_bytes; 2593464ebd5Sriastradh const GLubyte *src; 2603464ebd5Sriastradh 2613464ebd5Sriastradh if (!source) 2623464ebd5Sriastradh return; 2633464ebd5Sriastradh 2643464ebd5Sriastradh width_in_bytes = CEILING( width, 8 ); 2653464ebd5Sriastradh src = source; 2663464ebd5Sriastradh for (row = 0; row < height; row++) { 2673464ebd5Sriastradh GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest, 2683464ebd5Sriastradh width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); 2693464ebd5Sriastradh if (!dst) 2703464ebd5Sriastradh return; 2713464ebd5Sriastradh 2723464ebd5Sriastradh if ((packing->SkipPixels & 7) == 0) { 2733464ebd5Sriastradh memcpy( dst, src, width_in_bytes ); 2743464ebd5Sriastradh if (packing->LsbFirst) { 2753464ebd5Sriastradh flip_bytes( dst, width_in_bytes ); 2763464ebd5Sriastradh } 2773464ebd5Sriastradh } 2783464ebd5Sriastradh else { 2793464ebd5Sriastradh /* handling SkipPixels is a bit tricky (no pun intended!) */ 2803464ebd5Sriastradh GLint i; 2813464ebd5Sriastradh if (packing->LsbFirst) { 2823464ebd5Sriastradh GLubyte srcMask = 128; 2833464ebd5Sriastradh GLubyte dstMask = 1 << (packing->SkipPixels & 0x7); 2843464ebd5Sriastradh const GLubyte *s = src; 2853464ebd5Sriastradh GLubyte *d = dst; 2863464ebd5Sriastradh *d = 0; 2873464ebd5Sriastradh for (i = 0; i < width; i++) { 2883464ebd5Sriastradh if (*s & srcMask) { 2893464ebd5Sriastradh *d |= dstMask; 2903464ebd5Sriastradh } 2913464ebd5Sriastradh if (srcMask == 1) { 2923464ebd5Sriastradh srcMask = 128; 2933464ebd5Sriastradh s++; 2943464ebd5Sriastradh } 2953464ebd5Sriastradh else { 2963464ebd5Sriastradh srcMask = srcMask >> 1; 2973464ebd5Sriastradh } 2983464ebd5Sriastradh if (dstMask == 128) { 2993464ebd5Sriastradh dstMask = 1; 3003464ebd5Sriastradh d++; 3013464ebd5Sriastradh *d = 0; 3023464ebd5Sriastradh } 3033464ebd5Sriastradh else { 3043464ebd5Sriastradh dstMask = dstMask << 1; 3053464ebd5Sriastradh } 3063464ebd5Sriastradh } 3073464ebd5Sriastradh } 3083464ebd5Sriastradh else { 3093464ebd5Sriastradh GLubyte srcMask = 128; 3103464ebd5Sriastradh GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7); 3113464ebd5Sriastradh const GLubyte *s = src; 3123464ebd5Sriastradh GLubyte *d = dst; 3133464ebd5Sriastradh *d = 0; 3143464ebd5Sriastradh for (i = 0; i < width; i++) { 3153464ebd5Sriastradh if (*s & srcMask) { 3163464ebd5Sriastradh *d |= dstMask; 3173464ebd5Sriastradh } 3183464ebd5Sriastradh if (srcMask == 1) { 3193464ebd5Sriastradh srcMask = 128; 3203464ebd5Sriastradh s++; 3213464ebd5Sriastradh } 3223464ebd5Sriastradh else { 3233464ebd5Sriastradh srcMask = srcMask >> 1; 3243464ebd5Sriastradh } 3253464ebd5Sriastradh if (dstMask == 1) { 3263464ebd5Sriastradh dstMask = 128; 3273464ebd5Sriastradh d++; 3283464ebd5Sriastradh *d = 0; 3293464ebd5Sriastradh } 3303464ebd5Sriastradh else { 3313464ebd5Sriastradh dstMask = dstMask >> 1; 3323464ebd5Sriastradh } 3333464ebd5Sriastradh } 3343464ebd5Sriastradh } 3353464ebd5Sriastradh } 3363464ebd5Sriastradh src += width_in_bytes; 3373464ebd5Sriastradh } 3383464ebd5Sriastradh} 3393464ebd5Sriastradh 3403464ebd5Sriastradh 3413464ebd5Sriastradh/** 3423464ebd5Sriastradh * Get indexes of color components for a basic color format, such as 3433464ebd5Sriastradh * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes 3443464ebd5Sriastradh * that do not apply. 3453464ebd5Sriastradh */ 3463464ebd5Sriastradhstatic void 3473464ebd5Sriastradhget_component_indexes(GLenum format, 3483464ebd5Sriastradh GLint *redIndex, 3493464ebd5Sriastradh GLint *greenIndex, 3503464ebd5Sriastradh GLint *blueIndex, 3513464ebd5Sriastradh GLint *alphaIndex, 3523464ebd5Sriastradh GLint *luminanceIndex, 3533464ebd5Sriastradh GLint *intensityIndex) 3543464ebd5Sriastradh{ 3553464ebd5Sriastradh *redIndex = -1; 3563464ebd5Sriastradh *greenIndex = -1; 3573464ebd5Sriastradh *blueIndex = -1; 3583464ebd5Sriastradh *alphaIndex = -1; 3593464ebd5Sriastradh *luminanceIndex = -1; 3603464ebd5Sriastradh *intensityIndex = -1; 3613464ebd5Sriastradh 3623464ebd5Sriastradh switch (format) { 3633464ebd5Sriastradh case GL_LUMINANCE: 3643464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 3653464ebd5Sriastradh *luminanceIndex = 0; 3663464ebd5Sriastradh break; 3673464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 3683464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3693464ebd5Sriastradh *luminanceIndex = 0; 3703464ebd5Sriastradh *alphaIndex = 1; 3713464ebd5Sriastradh break; 3723464ebd5Sriastradh case GL_INTENSITY: 3733464ebd5Sriastradh *intensityIndex = 0; 3743464ebd5Sriastradh break; 3753464ebd5Sriastradh case GL_RED: 3763464ebd5Sriastradh case GL_RED_INTEGER_EXT: 3773464ebd5Sriastradh *redIndex = 0; 3783464ebd5Sriastradh break; 3793464ebd5Sriastradh case GL_GREEN: 3803464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 3813464ebd5Sriastradh *greenIndex = 0; 3823464ebd5Sriastradh break; 3833464ebd5Sriastradh case GL_BLUE: 3843464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 3853464ebd5Sriastradh *blueIndex = 0; 3863464ebd5Sriastradh break; 3873464ebd5Sriastradh case GL_ALPHA: 3883464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 3893464ebd5Sriastradh *alphaIndex = 0; 3903464ebd5Sriastradh break; 3913464ebd5Sriastradh case GL_RG: 3923464ebd5Sriastradh case GL_RG_INTEGER: 3933464ebd5Sriastradh *redIndex = 0; 3943464ebd5Sriastradh *greenIndex = 1; 3953464ebd5Sriastradh break; 3963464ebd5Sriastradh case GL_RGB: 3973464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 3983464ebd5Sriastradh *redIndex = 0; 3993464ebd5Sriastradh *greenIndex = 1; 4003464ebd5Sriastradh *blueIndex = 2; 4013464ebd5Sriastradh break; 4023464ebd5Sriastradh case GL_BGR: 4033464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 4043464ebd5Sriastradh *blueIndex = 0; 4053464ebd5Sriastradh *greenIndex = 1; 4063464ebd5Sriastradh *redIndex = 2; 4073464ebd5Sriastradh break; 4083464ebd5Sriastradh case GL_RGBA: 4093464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 4103464ebd5Sriastradh *redIndex = 0; 4113464ebd5Sriastradh *greenIndex = 1; 4123464ebd5Sriastradh *blueIndex = 2; 4133464ebd5Sriastradh *alphaIndex = 3; 4143464ebd5Sriastradh break; 4153464ebd5Sriastradh case GL_BGRA: 4163464ebd5Sriastradh case GL_BGRA_INTEGER: 4173464ebd5Sriastradh *redIndex = 2; 4183464ebd5Sriastradh *greenIndex = 1; 4193464ebd5Sriastradh *blueIndex = 0; 4203464ebd5Sriastradh *alphaIndex = 3; 4213464ebd5Sriastradh break; 4223464ebd5Sriastradh case GL_ABGR_EXT: 4233464ebd5Sriastradh *redIndex = 3; 4243464ebd5Sriastradh *greenIndex = 2; 4253464ebd5Sriastradh *blueIndex = 1; 4263464ebd5Sriastradh *alphaIndex = 0; 4273464ebd5Sriastradh break; 4283464ebd5Sriastradh case GL_DU8DV8_ATI: 4293464ebd5Sriastradh case GL_DUDV_ATI: 4303464ebd5Sriastradh *redIndex = 0; 4313464ebd5Sriastradh *greenIndex = 1; 4323464ebd5Sriastradh break; 4333464ebd5Sriastradh default: 4343464ebd5Sriastradh assert(0 && "bad format in get_component_indexes()"); 4353464ebd5Sriastradh } 4363464ebd5Sriastradh} 4373464ebd5Sriastradh 4383464ebd5Sriastradh 4393464ebd5Sriastradh 4403464ebd5Sriastradh/** 4413464ebd5Sriastradh * For small integer types, return the min and max possible values. 4423464ebd5Sriastradh * Used for clamping floats to unscaled integer types. 4433464ebd5Sriastradh * \return GL_TRUE if type is handled, GL_FALSE otherwise. 4443464ebd5Sriastradh */ 4453464ebd5Sriastradhstatic GLboolean 4463464ebd5Sriastradhget_type_min_max(GLenum type, GLfloat *min, GLfloat *max) 4473464ebd5Sriastradh{ 4483464ebd5Sriastradh switch (type) { 4493464ebd5Sriastradh case GL_BYTE: 4503464ebd5Sriastradh *min = -128.0; 4513464ebd5Sriastradh *max = 127.0; 4523464ebd5Sriastradh return GL_TRUE; 4533464ebd5Sriastradh case GL_UNSIGNED_BYTE: 4543464ebd5Sriastradh *min = 0.0; 4553464ebd5Sriastradh *max = 255.0; 4563464ebd5Sriastradh return GL_TRUE; 4573464ebd5Sriastradh case GL_SHORT: 4583464ebd5Sriastradh *min = -32768.0; 4593464ebd5Sriastradh *max = 32767.0; 4603464ebd5Sriastradh return GL_TRUE; 4613464ebd5Sriastradh case GL_UNSIGNED_SHORT: 4623464ebd5Sriastradh *min = 0.0; 4633464ebd5Sriastradh *max = 65535.0; 4643464ebd5Sriastradh return GL_TRUE; 4653464ebd5Sriastradh default: 4663464ebd5Sriastradh return GL_FALSE; 4673464ebd5Sriastradh } 4683464ebd5Sriastradh} 4693464ebd5Sriastradh 4703464ebd5Sriastradh 4713464ebd5Sriastradh 4723464ebd5Sriastradh/** 4733464ebd5Sriastradh * Used to pack an array [][4] of RGBA float colors as specified 4743464ebd5Sriastradh * by the dstFormat, dstType and dstPacking. Used by glReadPixels. 4753464ebd5Sriastradh * Historically, the RGBA values were in [0,1] and rescaled to fit 4763464ebd5Sriastradh * into GLubytes, etc. But with new integer formats, the RGBA values 4773464ebd5Sriastradh * may have any value and we don't always rescale when converting to 4783464ebd5Sriastradh * integers. 4793464ebd5Sriastradh * 4803464ebd5Sriastradh * Note: the rgba values will be modified by this function when any pixel 4813464ebd5Sriastradh * transfer ops are enabled. 4823464ebd5Sriastradh */ 4833464ebd5Sriastradhvoid 4843464ebd5Sriastradh_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4], 4853464ebd5Sriastradh GLenum dstFormat, GLenum dstType, 4863464ebd5Sriastradh GLvoid *dstAddr, 4873464ebd5Sriastradh const struct gl_pixelstore_attrib *dstPacking, 4883464ebd5Sriastradh GLbitfield transferOps) 4893464ebd5Sriastradh{ 4903464ebd5Sriastradh GLfloat *luminance; 4913464ebd5Sriastradh const GLint comps = _mesa_components_in_format(dstFormat); 4923464ebd5Sriastradh const GLboolean intDstFormat = _mesa_is_integer_format(dstFormat); 4933464ebd5Sriastradh GLuint i; 4943464ebd5Sriastradh 4953464ebd5Sriastradh if (dstFormat == GL_LUMINANCE || 4963464ebd5Sriastradh dstFormat == GL_LUMINANCE_ALPHA || 4973464ebd5Sriastradh dstFormat == GL_LUMINANCE_INTEGER_EXT || 4983464ebd5Sriastradh dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) { 4993464ebd5Sriastradh luminance = (GLfloat *) malloc(n * sizeof(GLfloat)); 5003464ebd5Sriastradh if (!luminance) { 5013464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 5023464ebd5Sriastradh return; 5033464ebd5Sriastradh } 5043464ebd5Sriastradh } 5053464ebd5Sriastradh else { 5063464ebd5Sriastradh luminance = NULL; 5073464ebd5Sriastradh } 5083464ebd5Sriastradh 5093464ebd5Sriastradh if (transferOps) { 5103464ebd5Sriastradh _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 5113464ebd5Sriastradh } 5123464ebd5Sriastradh 5133464ebd5Sriastradh /* 5143464ebd5Sriastradh * Component clamping (besides clamping to [0,1] in 5153464ebd5Sriastradh * _mesa_apply_rgba_transfer_ops()). 5163464ebd5Sriastradh */ 5173464ebd5Sriastradh if (intDstFormat) { 5183464ebd5Sriastradh /* clamping to dest type's min/max values */ 5193464ebd5Sriastradh GLfloat min, max; 5203464ebd5Sriastradh if (get_type_min_max(dstType, &min, &max)) { 5213464ebd5Sriastradh for (i = 0; i < n; i++) { 5223464ebd5Sriastradh rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max); 5233464ebd5Sriastradh rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max); 5243464ebd5Sriastradh rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max); 5253464ebd5Sriastradh rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max); 5263464ebd5Sriastradh } 5273464ebd5Sriastradh } 5283464ebd5Sriastradh } 5293464ebd5Sriastradh else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { 5303464ebd5Sriastradh /* compute luminance values */ 5313464ebd5Sriastradh if (transferOps & IMAGE_CLAMP_BIT) { 5323464ebd5Sriastradh for (i = 0; i < n; i++) { 5333464ebd5Sriastradh GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 5343464ebd5Sriastradh luminance[i] = CLAMP(sum, 0.0F, 1.0F); 5353464ebd5Sriastradh } 5363464ebd5Sriastradh } 5373464ebd5Sriastradh else { 5383464ebd5Sriastradh for (i = 0; i < n; i++) { 5393464ebd5Sriastradh luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; 5403464ebd5Sriastradh } 5413464ebd5Sriastradh } 5423464ebd5Sriastradh } 5433464ebd5Sriastradh 5443464ebd5Sriastradh /* 5453464ebd5Sriastradh * Pack/store the pixels. Ugh! Lots of cases!!! 5463464ebd5Sriastradh */ 5473464ebd5Sriastradh switch (dstType) { 5483464ebd5Sriastradh case GL_UNSIGNED_BYTE: 5493464ebd5Sriastradh { 5503464ebd5Sriastradh GLubyte *dst = (GLubyte *) dstAddr; 5513464ebd5Sriastradh switch (dstFormat) { 5523464ebd5Sriastradh case GL_RED: 5533464ebd5Sriastradh for (i=0;i<n;i++) 5543464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 5553464ebd5Sriastradh break; 5563464ebd5Sriastradh case GL_GREEN: 5573464ebd5Sriastradh for (i=0;i<n;i++) 5583464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 5593464ebd5Sriastradh break; 5603464ebd5Sriastradh case GL_BLUE: 5613464ebd5Sriastradh for (i=0;i<n;i++) 5623464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 5633464ebd5Sriastradh break; 5643464ebd5Sriastradh case GL_ALPHA: 5653464ebd5Sriastradh for (i=0;i<n;i++) 5663464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 5673464ebd5Sriastradh break; 5683464ebd5Sriastradh case GL_LUMINANCE: 5693464ebd5Sriastradh for (i=0;i<n;i++) 5703464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE(luminance[i]); 5713464ebd5Sriastradh break; 5723464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 5733464ebd5Sriastradh for (i=0;i<n;i++) { 5743464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); 5753464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 5763464ebd5Sriastradh } 5773464ebd5Sriastradh break; 5783464ebd5Sriastradh case GL_RG: 5793464ebd5Sriastradh for (i=0;i<n;i++) { 5803464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 5813464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 5823464ebd5Sriastradh } 5833464ebd5Sriastradh break; 5843464ebd5Sriastradh case GL_RGB: 5853464ebd5Sriastradh for (i=0;i<n;i++) { 5863464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 5873464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 5883464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 5893464ebd5Sriastradh } 5903464ebd5Sriastradh break; 5913464ebd5Sriastradh case GL_RGBA: 5923464ebd5Sriastradh for (i=0;i<n;i++) { 5933464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 5943464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 5953464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 5963464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 5973464ebd5Sriastradh } 5983464ebd5Sriastradh break; 5993464ebd5Sriastradh case GL_BGR: 6003464ebd5Sriastradh for (i=0;i<n;i++) { 6013464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 6023464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 6033464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 6043464ebd5Sriastradh } 6053464ebd5Sriastradh break; 6063464ebd5Sriastradh case GL_BGRA: 6073464ebd5Sriastradh for (i=0;i<n;i++) { 6083464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 6093464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 6103464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 6113464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 6123464ebd5Sriastradh } 6133464ebd5Sriastradh break; 6143464ebd5Sriastradh case GL_ABGR_EXT: 6153464ebd5Sriastradh for (i=0;i<n;i++) { 6163464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); 6173464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); 6183464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 6193464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 6203464ebd5Sriastradh } 6213464ebd5Sriastradh break; 6223464ebd5Sriastradh case GL_RED_INTEGER_EXT: 6233464ebd5Sriastradh for (i=0;i<n;i++) { 6243464ebd5Sriastradh dst[i] = (GLubyte) rgba[i][RCOMP]; 6253464ebd5Sriastradh } 6263464ebd5Sriastradh break; 6273464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 6283464ebd5Sriastradh for (i=0;i<n;i++) { 6293464ebd5Sriastradh dst[i] = (GLubyte) rgba[i][GCOMP]; 6303464ebd5Sriastradh } 6313464ebd5Sriastradh break; 6323464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 6333464ebd5Sriastradh for (i=0;i<n;i++) { 6343464ebd5Sriastradh dst[i] = (GLubyte) rgba[i][BCOMP]; 6353464ebd5Sriastradh } 6363464ebd5Sriastradh break; 6373464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 6383464ebd5Sriastradh for (i=0;i<n;i++) { 6393464ebd5Sriastradh dst[i] = (GLubyte) rgba[i][ACOMP]; 6403464ebd5Sriastradh } 6413464ebd5Sriastradh break; 6423464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 6433464ebd5Sriastradh for (i=0;i<n;i++) { 6443464ebd5Sriastradh dst[i*3+0] = (GLubyte) rgba[i][RCOMP]; 6453464ebd5Sriastradh dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 6463464ebd5Sriastradh dst[i*3+2] = (GLubyte) rgba[i][BCOMP]; 6473464ebd5Sriastradh } 6483464ebd5Sriastradh break; 6493464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 6503464ebd5Sriastradh for (i=0;i<n;i++) { 6513464ebd5Sriastradh dst[i*4+0] = (GLubyte) rgba[i][RCOMP]; 6523464ebd5Sriastradh dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 6533464ebd5Sriastradh dst[i*4+2] = (GLubyte) rgba[i][BCOMP]; 6543464ebd5Sriastradh dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 6553464ebd5Sriastradh } 6563464ebd5Sriastradh break; 6573464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 6583464ebd5Sriastradh for (i=0;i<n;i++) { 6593464ebd5Sriastradh dst[i*3+0] = (GLubyte) rgba[i][BCOMP]; 6603464ebd5Sriastradh dst[i*3+1] = (GLubyte) rgba[i][GCOMP]; 6613464ebd5Sriastradh dst[i*3+2] = (GLubyte) rgba[i][RCOMP]; 6623464ebd5Sriastradh } 6633464ebd5Sriastradh break; 6643464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 6653464ebd5Sriastradh for (i=0;i<n;i++) { 6663464ebd5Sriastradh dst[i*4+0] = (GLubyte) rgba[i][BCOMP]; 6673464ebd5Sriastradh dst[i*4+1] = (GLubyte) rgba[i][GCOMP]; 6683464ebd5Sriastradh dst[i*4+2] = (GLubyte) rgba[i][RCOMP]; 6693464ebd5Sriastradh dst[i*4+3] = (GLubyte) rgba[i][ACOMP]; 6703464ebd5Sriastradh } 6713464ebd5Sriastradh break; 6723464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 6733464ebd5Sriastradh for (i=0;i<n;i++) { 6743464ebd5Sriastradh dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] + 6753464ebd5Sriastradh rgba[i][GCOMP] + 6763464ebd5Sriastradh rgba[i][BCOMP]); 6773464ebd5Sriastradh dst[i*2+1] = (GLubyte) rgba[i][ACOMP]; 6783464ebd5Sriastradh } 6793464ebd5Sriastradh break; 6803464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 6813464ebd5Sriastradh for (i=0;i<n;i++) { 6823464ebd5Sriastradh dst[i] = (GLubyte) (rgba[i][RCOMP] + 6833464ebd5Sriastradh rgba[i][GCOMP] + 6843464ebd5Sriastradh rgba[i][BCOMP]); 6853464ebd5Sriastradh } 6863464ebd5Sriastradh break; 6873464ebd5Sriastradh case GL_DUDV_ATI: 6883464ebd5Sriastradh case GL_DU8DV8_ATI: 6893464ebd5Sriastradh for (i=0;i<n;i++) { 6903464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); 6913464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); 6923464ebd5Sriastradh } 6933464ebd5Sriastradh break; 6943464ebd5Sriastradh default: 6953464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 6963464ebd5Sriastradh } 6973464ebd5Sriastradh } 6983464ebd5Sriastradh break; 6993464ebd5Sriastradh case GL_BYTE: 7003464ebd5Sriastradh { 7013464ebd5Sriastradh GLbyte *dst = (GLbyte *) dstAddr; 7023464ebd5Sriastradh switch (dstFormat) { 7033464ebd5Sriastradh case GL_RED: 7043464ebd5Sriastradh for (i=0;i<n;i++) 7053464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7063464ebd5Sriastradh break; 7073464ebd5Sriastradh case GL_GREEN: 7083464ebd5Sriastradh for (i=0;i<n;i++) 7093464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7103464ebd5Sriastradh break; 7113464ebd5Sriastradh case GL_BLUE: 7123464ebd5Sriastradh for (i=0;i<n;i++) 7133464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7143464ebd5Sriastradh break; 7153464ebd5Sriastradh case GL_ALPHA: 7163464ebd5Sriastradh for (i=0;i<n;i++) 7173464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 7183464ebd5Sriastradh break; 7193464ebd5Sriastradh case GL_LUMINANCE: 7203464ebd5Sriastradh for (i=0;i<n;i++) 7213464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE(luminance[i]); 7223464ebd5Sriastradh break; 7233464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 7243464ebd5Sriastradh for (i=0;i<n;i++) { 7253464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); 7263464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 7273464ebd5Sriastradh } 7283464ebd5Sriastradh break; 7293464ebd5Sriastradh case GL_RG: 7303464ebd5Sriastradh for (i=0;i<n;i++) { 7313464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7323464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7333464ebd5Sriastradh } 7343464ebd5Sriastradh break; 7353464ebd5Sriastradh case GL_RGB: 7363464ebd5Sriastradh for (i=0;i<n;i++) { 7373464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7383464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7393464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7403464ebd5Sriastradh } 7413464ebd5Sriastradh break; 7423464ebd5Sriastradh case GL_RGBA: 7433464ebd5Sriastradh for (i=0;i<n;i++) { 7443464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7453464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7463464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7473464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 7483464ebd5Sriastradh } 7493464ebd5Sriastradh break; 7503464ebd5Sriastradh case GL_BGR: 7513464ebd5Sriastradh for (i=0;i<n;i++) { 7523464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7533464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7543464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7553464ebd5Sriastradh } 7563464ebd5Sriastradh break; 7573464ebd5Sriastradh case GL_BGRA: 7583464ebd5Sriastradh for (i=0;i<n;i++) { 7593464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7603464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7613464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7623464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 7633464ebd5Sriastradh } 7643464ebd5Sriastradh break; 7653464ebd5Sriastradh case GL_ABGR_EXT: 7663464ebd5Sriastradh for (i=0;i<n;i++) { 7673464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); 7683464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); 7693464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 7703464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 7713464ebd5Sriastradh } 7723464ebd5Sriastradh break; 7733464ebd5Sriastradh case GL_RED_INTEGER_EXT: 7743464ebd5Sriastradh for (i=0;i<n;i++) { 7753464ebd5Sriastradh dst[i] = (GLbyte) rgba[i][RCOMP]; 7763464ebd5Sriastradh } 7773464ebd5Sriastradh break; 7783464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 7793464ebd5Sriastradh for (i=0;i<n;i++) { 7803464ebd5Sriastradh dst[i] = (GLbyte) rgba[i][GCOMP]; 7813464ebd5Sriastradh } 7823464ebd5Sriastradh break; 7833464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 7843464ebd5Sriastradh for (i=0;i<n;i++) { 7853464ebd5Sriastradh dst[i] = (GLbyte) rgba[i][BCOMP]; 7863464ebd5Sriastradh } 7873464ebd5Sriastradh break; 7883464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 7893464ebd5Sriastradh for (i=0;i<n;i++) { 7903464ebd5Sriastradh dst[i] = (GLbyte) rgba[i][ACOMP]; 7913464ebd5Sriastradh } 7923464ebd5Sriastradh break; 7933464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 7943464ebd5Sriastradh for (i=0;i<n;i++) { 7953464ebd5Sriastradh dst[i*3+0] = (GLbyte) rgba[i][RCOMP]; 7963464ebd5Sriastradh dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 7973464ebd5Sriastradh dst[i*3+2] = (GLbyte) rgba[i][BCOMP]; 7983464ebd5Sriastradh } 7993464ebd5Sriastradh break; 8003464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 8013464ebd5Sriastradh for (i=0;i<n;i++) { 8023464ebd5Sriastradh dst[i*4+0] = (GLbyte) rgba[i][RCOMP]; 8033464ebd5Sriastradh dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 8043464ebd5Sriastradh dst[i*4+2] = (GLbyte) rgba[i][BCOMP]; 8053464ebd5Sriastradh dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 8063464ebd5Sriastradh } 8073464ebd5Sriastradh break; 8083464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 8093464ebd5Sriastradh for (i=0;i<n;i++) { 8103464ebd5Sriastradh dst[i*3+0] = (GLbyte) rgba[i][BCOMP]; 8113464ebd5Sriastradh dst[i*3+1] = (GLbyte) rgba[i][GCOMP]; 8123464ebd5Sriastradh dst[i*3+2] = (GLbyte) rgba[i][RCOMP]; 8133464ebd5Sriastradh } 8143464ebd5Sriastradh break; 8153464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 8163464ebd5Sriastradh for (i=0;i<n;i++) { 8173464ebd5Sriastradh dst[i*4+0] = (GLbyte) rgba[i][BCOMP]; 8183464ebd5Sriastradh dst[i*4+1] = (GLbyte) rgba[i][GCOMP]; 8193464ebd5Sriastradh dst[i*4+2] = (GLbyte) rgba[i][RCOMP]; 8203464ebd5Sriastradh dst[i*4+3] = (GLbyte) rgba[i][ACOMP]; 8213464ebd5Sriastradh } 8223464ebd5Sriastradh break; 8233464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 8243464ebd5Sriastradh for (i=0;i<n;i++) { 8253464ebd5Sriastradh dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] + 8263464ebd5Sriastradh rgba[i][GCOMP] + 8273464ebd5Sriastradh rgba[i][BCOMP]); 8283464ebd5Sriastradh dst[i*2+1] = (GLbyte) rgba[i][ACOMP]; 8293464ebd5Sriastradh } 8303464ebd5Sriastradh break; 8313464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 8323464ebd5Sriastradh for (i=0;i<n;i++) { 8333464ebd5Sriastradh dst[i] = (GLbyte) (rgba[i][RCOMP] + 8343464ebd5Sriastradh rgba[i][GCOMP] + 8353464ebd5Sriastradh rgba[i][BCOMP]); 8363464ebd5Sriastradh } 8373464ebd5Sriastradh break; 8383464ebd5Sriastradh case GL_DUDV_ATI: 8393464ebd5Sriastradh case GL_DU8DV8_ATI: 8403464ebd5Sriastradh for (i=0;i<n;i++) { 8413464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 8423464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 8433464ebd5Sriastradh } 8443464ebd5Sriastradh break; 8453464ebd5Sriastradh default: 8463464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 8473464ebd5Sriastradh } 8483464ebd5Sriastradh } 8493464ebd5Sriastradh break; 8503464ebd5Sriastradh case GL_UNSIGNED_SHORT: 8513464ebd5Sriastradh { 8523464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 8533464ebd5Sriastradh switch (dstFormat) { 8543464ebd5Sriastradh case GL_RED: 8553464ebd5Sriastradh for (i=0;i<n;i++) 8563464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); 8573464ebd5Sriastradh break; 8583464ebd5Sriastradh case GL_GREEN: 8593464ebd5Sriastradh for (i=0;i<n;i++) 8603464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); 8613464ebd5Sriastradh break; 8623464ebd5Sriastradh case GL_BLUE: 8633464ebd5Sriastradh for (i=0;i<n;i++) 8643464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); 8653464ebd5Sriastradh break; 8663464ebd5Sriastradh case GL_ALPHA: 8673464ebd5Sriastradh for (i=0;i<n;i++) 8683464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); 8693464ebd5Sriastradh break; 8703464ebd5Sriastradh case GL_LUMINANCE: 8713464ebd5Sriastradh for (i=0;i<n;i++) 8723464ebd5Sriastradh UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); 8733464ebd5Sriastradh break; 8743464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 8753464ebd5Sriastradh for (i=0;i<n;i++) { 8763464ebd5Sriastradh UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); 8773464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); 8783464ebd5Sriastradh } 8793464ebd5Sriastradh break; 8803464ebd5Sriastradh case GL_RG: 8813464ebd5Sriastradh for (i=0;i<n;i++) { 8823464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]); 8833464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]); 8843464ebd5Sriastradh } 8853464ebd5Sriastradh break; 8863464ebd5Sriastradh case GL_RGB: 8873464ebd5Sriastradh for (i=0;i<n;i++) { 8883464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); 8893464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 8903464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); 8913464ebd5Sriastradh } 8923464ebd5Sriastradh break; 8933464ebd5Sriastradh case GL_RGBA: 8943464ebd5Sriastradh for (i=0;i<n;i++) { 8953464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); 8963464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 8973464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); 8983464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 8993464ebd5Sriastradh } 9003464ebd5Sriastradh break; 9013464ebd5Sriastradh case GL_BGR: 9023464ebd5Sriastradh for (i=0;i<n;i++) { 9033464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); 9043464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); 9053464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); 9063464ebd5Sriastradh } 9073464ebd5Sriastradh break; 9083464ebd5Sriastradh case GL_BGRA: 9093464ebd5Sriastradh for (i=0;i<n;i++) { 9103464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); 9113464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); 9123464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); 9133464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); 9143464ebd5Sriastradh } 9153464ebd5Sriastradh break; 9163464ebd5Sriastradh case GL_ABGR_EXT: 9173464ebd5Sriastradh for (i=0;i<n;i++) { 9183464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); 9193464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); 9203464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); 9213464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); 9223464ebd5Sriastradh } 9233464ebd5Sriastradh break; 9243464ebd5Sriastradh case GL_RED_INTEGER_EXT: 9253464ebd5Sriastradh for (i=0;i<n;i++) { 9263464ebd5Sriastradh dst[i] = (GLushort) rgba[i][RCOMP]; 9273464ebd5Sriastradh } 9283464ebd5Sriastradh break; 9293464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 9303464ebd5Sriastradh for (i=0;i<n;i++) { 9313464ebd5Sriastradh dst[i] = (GLushort) rgba[i][GCOMP]; 9323464ebd5Sriastradh } 9333464ebd5Sriastradh break; 9343464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 9353464ebd5Sriastradh for (i=0;i<n;i++) { 9363464ebd5Sriastradh dst[i] = (GLushort) rgba[i][BCOMP]; 9373464ebd5Sriastradh } 9383464ebd5Sriastradh break; 9393464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 9403464ebd5Sriastradh for (i=0;i<n;i++) { 9413464ebd5Sriastradh dst[i] = (GLushort) rgba[i][ACOMP]; 9423464ebd5Sriastradh } 9433464ebd5Sriastradh break; 9443464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 9453464ebd5Sriastradh for (i=0;i<n;i++) { 9463464ebd5Sriastradh dst[i*3+0] = (GLushort) rgba[i][RCOMP]; 9473464ebd5Sriastradh dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 9483464ebd5Sriastradh dst[i*3+2] = (GLushort) rgba[i][BCOMP]; 9493464ebd5Sriastradh } 9503464ebd5Sriastradh break; 9513464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 9523464ebd5Sriastradh for (i=0;i<n;i++) { 9533464ebd5Sriastradh dst[i*4+0] = (GLushort) rgba[i][RCOMP]; 9543464ebd5Sriastradh dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 9553464ebd5Sriastradh dst[i*4+2] = (GLushort) rgba[i][BCOMP]; 9563464ebd5Sriastradh dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 9573464ebd5Sriastradh } 9583464ebd5Sriastradh break; 9593464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 9603464ebd5Sriastradh for (i=0;i<n;i++) { 9613464ebd5Sriastradh dst[i*3+0] = (GLushort) rgba[i][BCOMP]; 9623464ebd5Sriastradh dst[i*3+1] = (GLushort) rgba[i][GCOMP]; 9633464ebd5Sriastradh dst[i*3+2] = (GLushort) rgba[i][RCOMP]; 9643464ebd5Sriastradh } 9653464ebd5Sriastradh break; 9663464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 9673464ebd5Sriastradh for (i=0;i<n;i++) { 9683464ebd5Sriastradh dst[i*4+0] = (GLushort) rgba[i][BCOMP]; 9693464ebd5Sriastradh dst[i*4+1] = (GLushort) rgba[i][GCOMP]; 9703464ebd5Sriastradh dst[i*4+2] = (GLushort) rgba[i][RCOMP]; 9713464ebd5Sriastradh dst[i*4+3] = (GLushort) rgba[i][ACOMP]; 9723464ebd5Sriastradh } 9733464ebd5Sriastradh break; 9743464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 9753464ebd5Sriastradh for (i=0;i<n;i++) { 9763464ebd5Sriastradh dst[i*2+0] = (GLushort) (rgba[i][RCOMP] + 9773464ebd5Sriastradh rgba[i][GCOMP] + 9783464ebd5Sriastradh rgba[i][BCOMP]); 9793464ebd5Sriastradh dst[i*2+1] = (GLushort) rgba[i][ACOMP]; 9803464ebd5Sriastradh } 9813464ebd5Sriastradh break; 9823464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 9833464ebd5Sriastradh for (i=0;i<n;i++) { 9843464ebd5Sriastradh dst[i] = (GLushort) (rgba[i][RCOMP] + 9853464ebd5Sriastradh rgba[i][GCOMP] + 9863464ebd5Sriastradh rgba[i][BCOMP]); 9873464ebd5Sriastradh } 9883464ebd5Sriastradh break; 9893464ebd5Sriastradh case GL_DUDV_ATI: 9903464ebd5Sriastradh case GL_DU8DV8_ATI: 9913464ebd5Sriastradh for (i=0;i<n;i++) { 9923464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]); 9933464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]); 9943464ebd5Sriastradh } 9953464ebd5Sriastradh break; 9963464ebd5Sriastradh default: 9973464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 9983464ebd5Sriastradh } 9993464ebd5Sriastradh } 10003464ebd5Sriastradh break; 10013464ebd5Sriastradh case GL_SHORT: 10023464ebd5Sriastradh { 10033464ebd5Sriastradh GLshort *dst = (GLshort *) dstAddr; 10043464ebd5Sriastradh switch (dstFormat) { 10053464ebd5Sriastradh case GL_RED: 10063464ebd5Sriastradh for (i=0;i<n;i++) 10073464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10083464ebd5Sriastradh break; 10093464ebd5Sriastradh case GL_GREEN: 10103464ebd5Sriastradh for (i=0;i<n;i++) 10113464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10123464ebd5Sriastradh break; 10133464ebd5Sriastradh case GL_BLUE: 10143464ebd5Sriastradh for (i=0;i<n;i++) 10153464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10163464ebd5Sriastradh break; 10173464ebd5Sriastradh case GL_ALPHA: 10183464ebd5Sriastradh for (i=0;i<n;i++) 10193464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 10203464ebd5Sriastradh break; 10213464ebd5Sriastradh case GL_LUMINANCE: 10223464ebd5Sriastradh for (i=0;i<n;i++) 10233464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT(luminance[i]); 10243464ebd5Sriastradh break; 10253464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 10263464ebd5Sriastradh for (i=0;i<n;i++) { 10273464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); 10283464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 10293464ebd5Sriastradh } 10303464ebd5Sriastradh break; 10313464ebd5Sriastradh case GL_RG: 10323464ebd5Sriastradh for (i=0;i<n;i++) { 10333464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10343464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10353464ebd5Sriastradh } 10363464ebd5Sriastradh break; 10373464ebd5Sriastradh case GL_RGB: 10383464ebd5Sriastradh for (i=0;i<n;i++) { 10393464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10403464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10413464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10423464ebd5Sriastradh } 10433464ebd5Sriastradh break; 10443464ebd5Sriastradh case GL_RGBA: 10453464ebd5Sriastradh for (i=0;i<n;i++) { 10463464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10473464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10483464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10493464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 10503464ebd5Sriastradh } 10513464ebd5Sriastradh break; 10523464ebd5Sriastradh case GL_BGR: 10533464ebd5Sriastradh for (i=0;i<n;i++) { 10543464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10553464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10563464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10573464ebd5Sriastradh } 10583464ebd5Sriastradh break; 10593464ebd5Sriastradh case GL_BGRA: 10603464ebd5Sriastradh for (i=0;i<n;i++) { 10613464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10623464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10633464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10643464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 10653464ebd5Sriastradh } 10663464ebd5Sriastradh break; 10673464ebd5Sriastradh case GL_ABGR_EXT: 10683464ebd5Sriastradh for (i=0;i<n;i++) { 10693464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); 10703464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); 10713464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 10723464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 10733464ebd5Sriastradh } 10743464ebd5Sriastradh break; 10753464ebd5Sriastradh case GL_RED_INTEGER_EXT: 10763464ebd5Sriastradh for (i=0;i<n;i++) { 10773464ebd5Sriastradh dst[i] = (GLshort) rgba[i][RCOMP]; 10783464ebd5Sriastradh } 10793464ebd5Sriastradh break; 10803464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 10813464ebd5Sriastradh for (i=0;i<n;i++) { 10823464ebd5Sriastradh dst[i] = (GLshort) rgba[i][GCOMP]; 10833464ebd5Sriastradh } 10843464ebd5Sriastradh break; 10853464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 10863464ebd5Sriastradh for (i=0;i<n;i++) { 10873464ebd5Sriastradh dst[i] = (GLshort) rgba[i][BCOMP]; 10883464ebd5Sriastradh } 10893464ebd5Sriastradh break; 10903464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 10913464ebd5Sriastradh for (i=0;i<n;i++) { 10923464ebd5Sriastradh dst[i] = (GLshort) rgba[i][ACOMP]; 10933464ebd5Sriastradh } 10943464ebd5Sriastradh break; 10953464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 10963464ebd5Sriastradh for (i=0;i<n;i++) { 10973464ebd5Sriastradh dst[i*3+0] = (GLshort) rgba[i][RCOMP]; 10983464ebd5Sriastradh dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 10993464ebd5Sriastradh dst[i*3+2] = (GLshort) rgba[i][BCOMP]; 11003464ebd5Sriastradh } 11013464ebd5Sriastradh break; 11023464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 11033464ebd5Sriastradh for (i=0;i<n;i++) { 11043464ebd5Sriastradh dst[i*4+0] = (GLshort) rgba[i][RCOMP]; 11053464ebd5Sriastradh dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 11063464ebd5Sriastradh dst[i*4+2] = (GLshort) rgba[i][BCOMP]; 11073464ebd5Sriastradh dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 11083464ebd5Sriastradh } 11093464ebd5Sriastradh break; 11103464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 11113464ebd5Sriastradh for (i=0;i<n;i++) { 11123464ebd5Sriastradh dst[i*3+0] = (GLshort) rgba[i][BCOMP]; 11133464ebd5Sriastradh dst[i*3+1] = (GLshort) rgba[i][GCOMP]; 11143464ebd5Sriastradh dst[i*3+2] = (GLshort) rgba[i][RCOMP]; 11153464ebd5Sriastradh } 11163464ebd5Sriastradh break; 11173464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 11183464ebd5Sriastradh for (i=0;i<n;i++) { 11193464ebd5Sriastradh dst[i*4+0] = (GLshort) rgba[i][BCOMP]; 11203464ebd5Sriastradh dst[i*4+1] = (GLshort) rgba[i][GCOMP]; 11213464ebd5Sriastradh dst[i*4+2] = (GLshort) rgba[i][RCOMP]; 11223464ebd5Sriastradh dst[i*4+3] = (GLshort) rgba[i][ACOMP]; 11233464ebd5Sriastradh } 11243464ebd5Sriastradh break; 11253464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 11263464ebd5Sriastradh for (i=0;i<n;i++) { 11273464ebd5Sriastradh dst[i*2+0] = (GLshort) (rgba[i][RCOMP] + 11283464ebd5Sriastradh rgba[i][GCOMP] + 11293464ebd5Sriastradh rgba[i][BCOMP]); 11303464ebd5Sriastradh dst[i*2+1] = (GLshort) rgba[i][ACOMP]; 11313464ebd5Sriastradh } 11323464ebd5Sriastradh break; 11333464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 11343464ebd5Sriastradh for (i=0;i<n;i++) { 11353464ebd5Sriastradh dst[i] = (GLshort) (rgba[i][RCOMP] + 11363464ebd5Sriastradh rgba[i][GCOMP] + 11373464ebd5Sriastradh rgba[i][BCOMP]); 11383464ebd5Sriastradh } 11393464ebd5Sriastradh break; 11403464ebd5Sriastradh case GL_DUDV_ATI: 11413464ebd5Sriastradh case GL_DU8DV8_ATI: 11423464ebd5Sriastradh for (i=0;i<n;i++) { 11433464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); 11443464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); 11453464ebd5Sriastradh } 11463464ebd5Sriastradh break; 11473464ebd5Sriastradh default: 11483464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 11493464ebd5Sriastradh } 11503464ebd5Sriastradh } 11513464ebd5Sriastradh break; 11523464ebd5Sriastradh case GL_UNSIGNED_INT: 11533464ebd5Sriastradh { 11543464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 11553464ebd5Sriastradh switch (dstFormat) { 11563464ebd5Sriastradh case GL_RED: 11573464ebd5Sriastradh for (i=0;i<n;i++) 11583464ebd5Sriastradh dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); 11593464ebd5Sriastradh break; 11603464ebd5Sriastradh case GL_GREEN: 11613464ebd5Sriastradh for (i=0;i<n;i++) 11623464ebd5Sriastradh dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); 11633464ebd5Sriastradh break; 11643464ebd5Sriastradh case GL_BLUE: 11653464ebd5Sriastradh for (i=0;i<n;i++) 11663464ebd5Sriastradh dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); 11673464ebd5Sriastradh break; 11683464ebd5Sriastradh case GL_ALPHA: 11693464ebd5Sriastradh for (i=0;i<n;i++) 11703464ebd5Sriastradh dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); 11713464ebd5Sriastradh break; 11723464ebd5Sriastradh case GL_LUMINANCE: 11733464ebd5Sriastradh for (i=0;i<n;i++) 11743464ebd5Sriastradh dst[i] = FLOAT_TO_UINT(luminance[i]); 11753464ebd5Sriastradh break; 11763464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 11773464ebd5Sriastradh for (i=0;i<n;i++) { 11783464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); 11793464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); 11803464ebd5Sriastradh } 11813464ebd5Sriastradh break; 11823464ebd5Sriastradh case GL_RG: 11833464ebd5Sriastradh for (i=0;i<n;i++) { 11843464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 11853464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 11863464ebd5Sriastradh } 11873464ebd5Sriastradh break; 11883464ebd5Sriastradh case GL_RGB: 11893464ebd5Sriastradh for (i=0;i<n;i++) { 11903464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 11913464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 11923464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 11933464ebd5Sriastradh } 11943464ebd5Sriastradh break; 11953464ebd5Sriastradh case GL_RGBA: 11963464ebd5Sriastradh for (i=0;i<n;i++) { 11973464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 11983464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 11993464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); 12003464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 12013464ebd5Sriastradh } 12023464ebd5Sriastradh break; 12033464ebd5Sriastradh case GL_BGR: 12043464ebd5Sriastradh for (i=0;i<n;i++) { 12053464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 12063464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 12073464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 12083464ebd5Sriastradh } 12093464ebd5Sriastradh break; 12103464ebd5Sriastradh case GL_BGRA: 12113464ebd5Sriastradh for (i=0;i<n;i++) { 12123464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); 12133464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 12143464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); 12153464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); 12163464ebd5Sriastradh } 12173464ebd5Sriastradh break; 12183464ebd5Sriastradh case GL_ABGR_EXT: 12193464ebd5Sriastradh for (i=0;i<n;i++) { 12203464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]); 12213464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]); 12223464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]); 12233464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]); 12243464ebd5Sriastradh } 12253464ebd5Sriastradh break; 12263464ebd5Sriastradh case GL_RED_INTEGER_EXT: 12273464ebd5Sriastradh for (i=0;i<n;i++) { 12283464ebd5Sriastradh dst[i] = (GLuint) rgba[i][RCOMP]; 12293464ebd5Sriastradh } 12303464ebd5Sriastradh break; 12313464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 12323464ebd5Sriastradh for (i=0;i<n;i++) { 12333464ebd5Sriastradh dst[i] = (GLuint) rgba[i][GCOMP]; 12343464ebd5Sriastradh } 12353464ebd5Sriastradh break; 12363464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 12373464ebd5Sriastradh for (i=0;i<n;i++) { 12383464ebd5Sriastradh dst[i] = (GLuint) rgba[i][BCOMP]; 12393464ebd5Sriastradh } 12403464ebd5Sriastradh break; 12413464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 12423464ebd5Sriastradh for (i=0;i<n;i++) { 12433464ebd5Sriastradh dst[i] = (GLuint) rgba[i][ACOMP]; 12443464ebd5Sriastradh } 12453464ebd5Sriastradh break; 12463464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 12473464ebd5Sriastradh for (i=0;i<n;i++) { 12483464ebd5Sriastradh dst[i*3+0] = (GLuint) rgba[i][RCOMP]; 12493464ebd5Sriastradh dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 12503464ebd5Sriastradh dst[i*3+2] = (GLuint) rgba[i][BCOMP]; 12513464ebd5Sriastradh } 12523464ebd5Sriastradh break; 12533464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 12543464ebd5Sriastradh for (i=0;i<n;i++) { 12553464ebd5Sriastradh dst[i*4+0] = (GLuint) rgba[i][RCOMP]; 12563464ebd5Sriastradh dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 12573464ebd5Sriastradh dst[i*4+2] = (GLuint) rgba[i][BCOMP]; 12583464ebd5Sriastradh dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 12593464ebd5Sriastradh } 12603464ebd5Sriastradh break; 12613464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 12623464ebd5Sriastradh for (i=0;i<n;i++) { 12633464ebd5Sriastradh dst[i*3+0] = (GLuint) rgba[i][BCOMP]; 12643464ebd5Sriastradh dst[i*3+1] = (GLuint) rgba[i][GCOMP]; 12653464ebd5Sriastradh dst[i*3+2] = (GLuint) rgba[i][RCOMP]; 12663464ebd5Sriastradh } 12673464ebd5Sriastradh break; 12683464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 12693464ebd5Sriastradh for (i=0;i<n;i++) { 12703464ebd5Sriastradh dst[i*4+0] = (GLuint) rgba[i][BCOMP]; 12713464ebd5Sriastradh dst[i*4+1] = (GLuint) rgba[i][GCOMP]; 12723464ebd5Sriastradh dst[i*4+2] = (GLuint) rgba[i][RCOMP]; 12733464ebd5Sriastradh dst[i*4+3] = (GLuint) rgba[i][ACOMP]; 12743464ebd5Sriastradh } 12753464ebd5Sriastradh break; 12763464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 12773464ebd5Sriastradh for (i=0;i<n;i++) { 12783464ebd5Sriastradh dst[i*2+0] = (GLuint) (rgba[i][RCOMP] + 12793464ebd5Sriastradh rgba[i][GCOMP] + 12803464ebd5Sriastradh rgba[i][BCOMP]); 12813464ebd5Sriastradh dst[i*2+1] = (GLuint) rgba[i][ACOMP]; 12823464ebd5Sriastradh } 12833464ebd5Sriastradh break; 12843464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 12853464ebd5Sriastradh for (i=0;i<n;i++) { 12863464ebd5Sriastradh dst[i] = (GLuint) (rgba[i][RCOMP] + 12873464ebd5Sriastradh rgba[i][GCOMP] + 12883464ebd5Sriastradh rgba[i][BCOMP]); 12893464ebd5Sriastradh } 12903464ebd5Sriastradh break; 12913464ebd5Sriastradh case GL_DUDV_ATI: 12923464ebd5Sriastradh case GL_DU8DV8_ATI: 12933464ebd5Sriastradh for (i=0;i<n;i++) { 12943464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); 12953464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); 12963464ebd5Sriastradh } 12973464ebd5Sriastradh break; 12983464ebd5Sriastradh default: 12993464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 13003464ebd5Sriastradh } 13013464ebd5Sriastradh } 13023464ebd5Sriastradh break; 13033464ebd5Sriastradh case GL_INT: 13043464ebd5Sriastradh { 13053464ebd5Sriastradh GLint *dst = (GLint *) dstAddr; 13063464ebd5Sriastradh switch (dstFormat) { 13073464ebd5Sriastradh case GL_RED: 13083464ebd5Sriastradh for (i=0;i<n;i++) 13093464ebd5Sriastradh dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]); 13103464ebd5Sriastradh break; 13113464ebd5Sriastradh case GL_GREEN: 13123464ebd5Sriastradh for (i=0;i<n;i++) 13133464ebd5Sriastradh dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]); 13143464ebd5Sriastradh break; 13153464ebd5Sriastradh case GL_BLUE: 13163464ebd5Sriastradh for (i=0;i<n;i++) 13173464ebd5Sriastradh dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]); 13183464ebd5Sriastradh break; 13193464ebd5Sriastradh case GL_ALPHA: 13203464ebd5Sriastradh for (i=0;i<n;i++) 13213464ebd5Sriastradh dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]); 13223464ebd5Sriastradh break; 13233464ebd5Sriastradh case GL_LUMINANCE: 13243464ebd5Sriastradh for (i=0;i<n;i++) 13253464ebd5Sriastradh dst[i] = FLOAT_TO_INT(luminance[i]); 13263464ebd5Sriastradh break; 13273464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 13283464ebd5Sriastradh for (i=0;i<n;i++) { 13293464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_INT(luminance[i]); 13303464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]); 13313464ebd5Sriastradh } 13323464ebd5Sriastradh break; 13333464ebd5Sriastradh case GL_RG: 13343464ebd5Sriastradh for (i=0;i<n;i++) { 13353464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 13363464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13373464ebd5Sriastradh } 13383464ebd5Sriastradh break; 13393464ebd5Sriastradh case GL_RGB: 13403464ebd5Sriastradh for (i=0;i<n;i++) { 13413464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 13423464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13433464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 13443464ebd5Sriastradh } 13453464ebd5Sriastradh break; 13463464ebd5Sriastradh case GL_RGBA: 13473464ebd5Sriastradh for (i=0;i<n;i++) { 13483464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 13493464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13503464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]); 13513464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 13523464ebd5Sriastradh } 13533464ebd5Sriastradh break; 13543464ebd5Sriastradh case GL_BGR: 13553464ebd5Sriastradh for (i=0;i<n;i++) { 13563464ebd5Sriastradh dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 13573464ebd5Sriastradh dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13583464ebd5Sriastradh dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 13593464ebd5Sriastradh } 13603464ebd5Sriastradh break; 13613464ebd5Sriastradh case GL_BGRA: 13623464ebd5Sriastradh for (i=0;i<n;i++) { 13633464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]); 13643464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13653464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]); 13663464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]); 13673464ebd5Sriastradh } 13683464ebd5Sriastradh break; 13693464ebd5Sriastradh case GL_ABGR_EXT: 13703464ebd5Sriastradh for (i=0;i<n;i++) { 13713464ebd5Sriastradh dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]); 13723464ebd5Sriastradh dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]); 13733464ebd5Sriastradh dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]); 13743464ebd5Sriastradh dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]); 13753464ebd5Sriastradh } 13763464ebd5Sriastradh break; 13773464ebd5Sriastradh case GL_DUDV_ATI: 13783464ebd5Sriastradh case GL_DU8DV8_ATI: 13793464ebd5Sriastradh for (i=0;i<n;i++) { 13803464ebd5Sriastradh dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]); 13813464ebd5Sriastradh dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]); 13823464ebd5Sriastradh } 13833464ebd5Sriastradh break; 13843464ebd5Sriastradh case GL_RED_INTEGER_EXT: 13853464ebd5Sriastradh for (i=0;i<n;i++) { 13863464ebd5Sriastradh dst[i] = (GLint) rgba[i][RCOMP]; 13873464ebd5Sriastradh } 13883464ebd5Sriastradh break; 13893464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 13903464ebd5Sriastradh for (i=0;i<n;i++) { 13913464ebd5Sriastradh dst[i] = (GLint) rgba[i][GCOMP]; 13923464ebd5Sriastradh } 13933464ebd5Sriastradh break; 13943464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 13953464ebd5Sriastradh for (i=0;i<n;i++) { 13963464ebd5Sriastradh dst[i] = (GLint) rgba[i][BCOMP]; 13973464ebd5Sriastradh } 13983464ebd5Sriastradh break; 13993464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 14003464ebd5Sriastradh for (i=0;i<n;i++) { 14013464ebd5Sriastradh dst[i] = (GLint) rgba[i][ACOMP]; 14023464ebd5Sriastradh } 14033464ebd5Sriastradh break; 14043464ebd5Sriastradh case GL_RGB_INTEGER_EXT: 14053464ebd5Sriastradh for (i=0;i<n;i++) { 14063464ebd5Sriastradh dst[i*3+0] = (GLint) rgba[i][RCOMP]; 14073464ebd5Sriastradh dst[i*3+1] = (GLint) rgba[i][GCOMP]; 14083464ebd5Sriastradh dst[i*3+2] = (GLint) rgba[i][BCOMP]; 14093464ebd5Sriastradh } 14103464ebd5Sriastradh break; 14113464ebd5Sriastradh case GL_RGBA_INTEGER_EXT: 14123464ebd5Sriastradh for (i=0;i<n;i++) { 14133464ebd5Sriastradh dst[i*4+0] = (GLint) rgba[i][RCOMP]; 14143464ebd5Sriastradh dst[i*4+1] = (GLint) rgba[i][GCOMP]; 14153464ebd5Sriastradh dst[i*4+2] = (GLint) rgba[i][BCOMP]; 14163464ebd5Sriastradh dst[i*4+3] = (GLint) rgba[i][ACOMP]; 14173464ebd5Sriastradh } 14183464ebd5Sriastradh break; 14193464ebd5Sriastradh case GL_BGR_INTEGER_EXT: 14203464ebd5Sriastradh for (i=0;i<n;i++) { 14213464ebd5Sriastradh dst[i*3+0] = (GLint) rgba[i][BCOMP]; 14223464ebd5Sriastradh dst[i*3+1] = (GLint) rgba[i][GCOMP]; 14233464ebd5Sriastradh dst[i*3+2] = (GLint) rgba[i][RCOMP]; 14243464ebd5Sriastradh } 14253464ebd5Sriastradh break; 14263464ebd5Sriastradh case GL_BGRA_INTEGER_EXT: 14273464ebd5Sriastradh for (i=0;i<n;i++) { 14283464ebd5Sriastradh dst[i*4+0] = (GLint) rgba[i][BCOMP]; 14293464ebd5Sriastradh dst[i*4+1] = (GLint) rgba[i][GCOMP]; 14303464ebd5Sriastradh dst[i*4+2] = (GLint) rgba[i][RCOMP]; 14313464ebd5Sriastradh dst[i*4+3] = (GLint) rgba[i][ACOMP]; 14323464ebd5Sriastradh } 14333464ebd5Sriastradh break; 14343464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 14353464ebd5Sriastradh for (i=0;i<n;i++) { 14363464ebd5Sriastradh dst[i*2+0] = (GLint) (rgba[i][RCOMP] + 14373464ebd5Sriastradh rgba[i][GCOMP] + 14383464ebd5Sriastradh rgba[i][BCOMP]); 14393464ebd5Sriastradh dst[i*2+1] = (GLint) rgba[i][ACOMP]; 14403464ebd5Sriastradh } 14413464ebd5Sriastradh break; 14423464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 14433464ebd5Sriastradh for (i=0;i<n;i++) { 14443464ebd5Sriastradh dst[i] = (GLint) (rgba[i][RCOMP] + 14453464ebd5Sriastradh rgba[i][GCOMP] + 14463464ebd5Sriastradh rgba[i][BCOMP]); 14473464ebd5Sriastradh } 14483464ebd5Sriastradh break; 14493464ebd5Sriastradh default: 14503464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 14513464ebd5Sriastradh } 14523464ebd5Sriastradh } 14533464ebd5Sriastradh break; 14543464ebd5Sriastradh case GL_FLOAT: 14553464ebd5Sriastradh { 14563464ebd5Sriastradh GLfloat *dst = (GLfloat *) dstAddr; 14573464ebd5Sriastradh switch (dstFormat) { 14583464ebd5Sriastradh case GL_RED: 14593464ebd5Sriastradh for (i=0;i<n;i++) 14603464ebd5Sriastradh dst[i] = rgba[i][RCOMP]; 14613464ebd5Sriastradh break; 14623464ebd5Sriastradh case GL_GREEN: 14633464ebd5Sriastradh for (i=0;i<n;i++) 14643464ebd5Sriastradh dst[i] = rgba[i][GCOMP]; 14653464ebd5Sriastradh break; 14663464ebd5Sriastradh case GL_BLUE: 14673464ebd5Sriastradh for (i=0;i<n;i++) 14683464ebd5Sriastradh dst[i] = rgba[i][BCOMP]; 14693464ebd5Sriastradh break; 14703464ebd5Sriastradh case GL_ALPHA: 14713464ebd5Sriastradh for (i=0;i<n;i++) 14723464ebd5Sriastradh dst[i] = rgba[i][ACOMP]; 14733464ebd5Sriastradh break; 14743464ebd5Sriastradh case GL_LUMINANCE: 14753464ebd5Sriastradh for (i=0;i<n;i++) 14763464ebd5Sriastradh dst[i] = luminance[i]; 14773464ebd5Sriastradh break; 14783464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 14793464ebd5Sriastradh for (i=0;i<n;i++) { 14803464ebd5Sriastradh dst[i*2+0] = luminance[i]; 14813464ebd5Sriastradh dst[i*2+1] = rgba[i][ACOMP]; 14823464ebd5Sriastradh } 14833464ebd5Sriastradh break; 14843464ebd5Sriastradh case GL_RG: 14853464ebd5Sriastradh for (i=0;i<n;i++) { 14863464ebd5Sriastradh dst[i*2+0] = rgba[i][RCOMP]; 14873464ebd5Sriastradh dst[i*2+1] = rgba[i][GCOMP]; 14883464ebd5Sriastradh } 14893464ebd5Sriastradh break; 14903464ebd5Sriastradh case GL_RGB: 14913464ebd5Sriastradh for (i=0;i<n;i++) { 14923464ebd5Sriastradh dst[i*3+0] = rgba[i][RCOMP]; 14933464ebd5Sriastradh dst[i*3+1] = rgba[i][GCOMP]; 14943464ebd5Sriastradh dst[i*3+2] = rgba[i][BCOMP]; 14953464ebd5Sriastradh } 14963464ebd5Sriastradh break; 14973464ebd5Sriastradh case GL_RGBA: 14983464ebd5Sriastradh for (i=0;i<n;i++) { 14993464ebd5Sriastradh dst[i*4+0] = rgba[i][RCOMP]; 15003464ebd5Sriastradh dst[i*4+1] = rgba[i][GCOMP]; 15013464ebd5Sriastradh dst[i*4+2] = rgba[i][BCOMP]; 15023464ebd5Sriastradh dst[i*4+3] = rgba[i][ACOMP]; 15033464ebd5Sriastradh } 15043464ebd5Sriastradh break; 15053464ebd5Sriastradh case GL_BGR: 15063464ebd5Sriastradh for (i=0;i<n;i++) { 15073464ebd5Sriastradh dst[i*3+0] = rgba[i][BCOMP]; 15083464ebd5Sriastradh dst[i*3+1] = rgba[i][GCOMP]; 15093464ebd5Sriastradh dst[i*3+2] = rgba[i][RCOMP]; 15103464ebd5Sriastradh } 15113464ebd5Sriastradh break; 15123464ebd5Sriastradh case GL_BGRA: 15133464ebd5Sriastradh for (i=0;i<n;i++) { 15143464ebd5Sriastradh dst[i*4+0] = rgba[i][BCOMP]; 15153464ebd5Sriastradh dst[i*4+1] = rgba[i][GCOMP]; 15163464ebd5Sriastradh dst[i*4+2] = rgba[i][RCOMP]; 15173464ebd5Sriastradh dst[i*4+3] = rgba[i][ACOMP]; 15183464ebd5Sriastradh } 15193464ebd5Sriastradh break; 15203464ebd5Sriastradh case GL_ABGR_EXT: 15213464ebd5Sriastradh for (i=0;i<n;i++) { 15223464ebd5Sriastradh dst[i*4+0] = rgba[i][ACOMP]; 15233464ebd5Sriastradh dst[i*4+1] = rgba[i][BCOMP]; 15243464ebd5Sriastradh dst[i*4+2] = rgba[i][GCOMP]; 15253464ebd5Sriastradh dst[i*4+3] = rgba[i][RCOMP]; 15263464ebd5Sriastradh } 15273464ebd5Sriastradh break; 15283464ebd5Sriastradh case GL_DUDV_ATI: 15293464ebd5Sriastradh case GL_DU8DV8_ATI: 15303464ebd5Sriastradh for (i=0;i<n;i++) { 15313464ebd5Sriastradh dst[i*2+0] = rgba[i][RCOMP]; 15323464ebd5Sriastradh dst[i*2+1] = rgba[i][GCOMP]; 15333464ebd5Sriastradh } 15343464ebd5Sriastradh break; 15353464ebd5Sriastradh default: 15363464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 15373464ebd5Sriastradh } 15383464ebd5Sriastradh } 15393464ebd5Sriastradh break; 15403464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 15413464ebd5Sriastradh { 15423464ebd5Sriastradh GLhalfARB *dst = (GLhalfARB *) dstAddr; 15433464ebd5Sriastradh switch (dstFormat) { 15443464ebd5Sriastradh case GL_RED: 15453464ebd5Sriastradh for (i=0;i<n;i++) 15463464ebd5Sriastradh dst[i] = _mesa_float_to_half(rgba[i][RCOMP]); 15473464ebd5Sriastradh break; 15483464ebd5Sriastradh case GL_GREEN: 15493464ebd5Sriastradh for (i=0;i<n;i++) 15503464ebd5Sriastradh dst[i] = _mesa_float_to_half(rgba[i][GCOMP]); 15513464ebd5Sriastradh break; 15523464ebd5Sriastradh case GL_BLUE: 15533464ebd5Sriastradh for (i=0;i<n;i++) 15543464ebd5Sriastradh dst[i] = _mesa_float_to_half(rgba[i][BCOMP]); 15553464ebd5Sriastradh break; 15563464ebd5Sriastradh case GL_ALPHA: 15573464ebd5Sriastradh for (i=0;i<n;i++) 15583464ebd5Sriastradh dst[i] = _mesa_float_to_half(rgba[i][ACOMP]); 15593464ebd5Sriastradh break; 15603464ebd5Sriastradh case GL_LUMINANCE: 15613464ebd5Sriastradh for (i=0;i<n;i++) 15623464ebd5Sriastradh dst[i] = _mesa_float_to_half(luminance[i]); 15633464ebd5Sriastradh break; 15643464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 15653464ebd5Sriastradh for (i=0;i<n;i++) { 15663464ebd5Sriastradh dst[i*2+0] = _mesa_float_to_half(luminance[i]); 15673464ebd5Sriastradh dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]); 15683464ebd5Sriastradh } 15693464ebd5Sriastradh break; 15703464ebd5Sriastradh case GL_RG: 15713464ebd5Sriastradh for (i=0;i<n;i++) { 15723464ebd5Sriastradh dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15733464ebd5Sriastradh dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15743464ebd5Sriastradh } 15753464ebd5Sriastradh break; 15763464ebd5Sriastradh case GL_RGB: 15773464ebd5Sriastradh for (i=0;i<n;i++) { 15783464ebd5Sriastradh dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15793464ebd5Sriastradh dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15803464ebd5Sriastradh dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15813464ebd5Sriastradh } 15823464ebd5Sriastradh break; 15833464ebd5Sriastradh case GL_RGBA: 15843464ebd5Sriastradh for (i=0;i<n;i++) { 15853464ebd5Sriastradh dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]); 15863464ebd5Sriastradh dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15873464ebd5Sriastradh dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]); 15883464ebd5Sriastradh dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 15893464ebd5Sriastradh } 15903464ebd5Sriastradh break; 15913464ebd5Sriastradh case GL_BGR: 15923464ebd5Sriastradh for (i=0;i<n;i++) { 15933464ebd5Sriastradh dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]); 15943464ebd5Sriastradh dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]); 15953464ebd5Sriastradh dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]); 15963464ebd5Sriastradh } 15973464ebd5Sriastradh break; 15983464ebd5Sriastradh case GL_BGRA: 15993464ebd5Sriastradh for (i=0;i<n;i++) { 16003464ebd5Sriastradh dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]); 16013464ebd5Sriastradh dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]); 16023464ebd5Sriastradh dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]); 16033464ebd5Sriastradh dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]); 16043464ebd5Sriastradh } 16053464ebd5Sriastradh break; 16063464ebd5Sriastradh case GL_ABGR_EXT: 16073464ebd5Sriastradh for (i=0;i<n;i++) { 16083464ebd5Sriastradh dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]); 16093464ebd5Sriastradh dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]); 16103464ebd5Sriastradh dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]); 16113464ebd5Sriastradh dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]); 16123464ebd5Sriastradh } 16133464ebd5Sriastradh break; 16143464ebd5Sriastradh case GL_DUDV_ATI: 16153464ebd5Sriastradh case GL_DU8DV8_ATI: 16163464ebd5Sriastradh for (i=0;i<n;i++) { 16173464ebd5Sriastradh dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]); 16183464ebd5Sriastradh dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]); 16193464ebd5Sriastradh } 16203464ebd5Sriastradh break; 16213464ebd5Sriastradh default: 16223464ebd5Sriastradh _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); 16233464ebd5Sriastradh } 16243464ebd5Sriastradh } 16253464ebd5Sriastradh break; 16263464ebd5Sriastradh case GL_UNSIGNED_BYTE_3_3_2: 16273464ebd5Sriastradh if (dstFormat == GL_RGB) { 16283464ebd5Sriastradh GLubyte *dst = (GLubyte *) dstAddr; 16293464ebd5Sriastradh for (i=0;i<n;i++) { 16303464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5) 16313464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 7.0F) << 2) 16323464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 3.0F) ); 16333464ebd5Sriastradh } 16343464ebd5Sriastradh } 16353464ebd5Sriastradh break; 16363464ebd5Sriastradh case GL_UNSIGNED_BYTE_2_3_3_REV: 16373464ebd5Sriastradh if (dstFormat == GL_RGB) { 16383464ebd5Sriastradh GLubyte *dst = (GLubyte *) dstAddr; 16393464ebd5Sriastradh for (i=0;i<n;i++) { 16403464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) ) 16413464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 7.0F) << 3) 16423464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 3.0F) << 6); 16433464ebd5Sriastradh } 16443464ebd5Sriastradh } 16453464ebd5Sriastradh break; 16463464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5: 16473464ebd5Sriastradh if (dstFormat == GL_RGB) { 16483464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16493464ebd5Sriastradh for (i=0;i<n;i++) { 16503464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11) 16513464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 63.0F) << 5) 16523464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) ); 16533464ebd5Sriastradh } 16543464ebd5Sriastradh } 16553464ebd5Sriastradh break; 16563464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5_REV: 16573464ebd5Sriastradh if (dstFormat == GL_RGB) { 16583464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16593464ebd5Sriastradh for (i=0;i<n;i++) { 16603464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) ) 16613464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 63.0F) << 5) 16623464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) << 11); 16633464ebd5Sriastradh } 16643464ebd5Sriastradh } 16653464ebd5Sriastradh break; 16663464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4: 16673464ebd5Sriastradh if (dstFormat == GL_RGBA) { 16683464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16693464ebd5Sriastradh for (i=0;i<n;i++) { 16703464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12) 16713464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 8) 16723464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 15.0F) << 4) 16733464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 15.0F) ); 16743464ebd5Sriastradh } 16753464ebd5Sriastradh } 16763464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 16773464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16783464ebd5Sriastradh for (i=0;i<n;i++) { 16793464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12) 16803464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 8) 16813464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 15.0F) << 4) 16823464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 15.0F) ); 16833464ebd5Sriastradh } 16843464ebd5Sriastradh } 16853464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 16863464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16873464ebd5Sriastradh for (i=0;i<n;i++) { 16883464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12) 16893464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 15.0F) << 8) 16903464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 4) 16913464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 15.0F) ); 16923464ebd5Sriastradh } 16933464ebd5Sriastradh } 16943464ebd5Sriastradh break; 16953464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4_REV: 16963464ebd5Sriastradh if (dstFormat == GL_RGBA) { 16973464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 16983464ebd5Sriastradh for (i=0;i<n;i++) { 16993464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) ) 17003464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 4) 17013464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 15.0F) << 8) 17023464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 15.0F) << 12); 17033464ebd5Sriastradh } 17043464ebd5Sriastradh } 17053464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 17063464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17073464ebd5Sriastradh for (i=0;i<n;i++) { 17083464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) ) 17093464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 4) 17103464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 15.0F) << 8) 17113464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 15.0F) << 12); 17123464ebd5Sriastradh } 17133464ebd5Sriastradh } 17143464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 17153464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17163464ebd5Sriastradh for (i=0;i<n;i++) { 17173464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) ) 17183464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 15.0F) << 4) 17193464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 15.0F) << 8) 17203464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 15.0F) << 12); 17213464ebd5Sriastradh } 17223464ebd5Sriastradh } 17233464ebd5Sriastradh break; 17243464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_5_5_1: 17253464ebd5Sriastradh if (dstFormat == GL_RGBA) { 17263464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17273464ebd5Sriastradh for (i=0;i<n;i++) { 17283464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11) 17293464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 6) 17303464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) << 1) 17313464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 1.0F) ); 17323464ebd5Sriastradh } 17333464ebd5Sriastradh } 17343464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 17353464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17363464ebd5Sriastradh for (i=0;i<n;i++) { 17373464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11) 17383464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 6) 17393464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 31.0F) << 1) 17403464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 1.0F) ); 17413464ebd5Sriastradh } 17423464ebd5Sriastradh } 17433464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 17443464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17453464ebd5Sriastradh for (i=0;i<n;i++) { 17463464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11) 17473464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) << 6) 17483464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 1) 17493464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 1.0F) ); 17503464ebd5Sriastradh } 17513464ebd5Sriastradh } 17523464ebd5Sriastradh break; 17533464ebd5Sriastradh case GL_UNSIGNED_SHORT_1_5_5_5_REV: 17543464ebd5Sriastradh if (dstFormat == GL_RGBA) { 17553464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17563464ebd5Sriastradh for (i=0;i<n;i++) { 17573464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) ) 17583464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 5) 17593464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) << 10) 17603464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 1.0F) << 15); 17613464ebd5Sriastradh } 17623464ebd5Sriastradh } 17633464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 17643464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17653464ebd5Sriastradh for (i=0;i<n;i++) { 17663464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) ) 17673464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 5) 17683464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 31.0F) << 10) 17693464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 1.0F) << 15); 17703464ebd5Sriastradh } 17713464ebd5Sriastradh } 17723464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 17733464ebd5Sriastradh GLushort *dst = (GLushort *) dstAddr; 17743464ebd5Sriastradh for (i=0;i<n;i++) { 17753464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) ) 17763464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 31.0F) << 5) 17773464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 31.0F) << 10) 17783464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 1.0F) << 15); 17793464ebd5Sriastradh } 17803464ebd5Sriastradh } 17813464ebd5Sriastradh break; 17823464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8: 17833464ebd5Sriastradh if (dstFormat == GL_RGBA) { 17843464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 17853464ebd5Sriastradh for (i=0;i<n;i++) { 17863464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24) 17873464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.F) << 16) 17883464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 255.F) << 8) 17893464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 255.F) ); 17903464ebd5Sriastradh } 17913464ebd5Sriastradh } 17923464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 17933464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 17943464ebd5Sriastradh for (i=0;i<n;i++) { 17953464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24) 17963464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.F) << 16) 17973464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 255.F) << 8) 17983464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 255.F) ); 17993464ebd5Sriastradh } 18003464ebd5Sriastradh } 18013464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 18023464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18033464ebd5Sriastradh for (i=0;i<n;i++) { 18043464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24) 18053464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 255.F) << 16) 18063464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.F) << 8) 18073464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 255.F) ); 18083464ebd5Sriastradh } 18093464ebd5Sriastradh } 18103464ebd5Sriastradh break; 18113464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8_REV: 18123464ebd5Sriastradh if (dstFormat == GL_RGBA) { 18133464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18143464ebd5Sriastradh for (i=0;i<n;i++) { 18153464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F) ) 18163464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.0F) << 8) 18173464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 255.0F) << 16) 18183464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 255.0F) << 24); 18193464ebd5Sriastradh } 18203464ebd5Sriastradh } 18213464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 18223464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18233464ebd5Sriastradh for (i=0;i<n;i++) { 18243464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F) ) 18253464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.0F) << 8) 18263464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 255.0F) << 16) 18273464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 255.0F) << 24); 18283464ebd5Sriastradh } 18293464ebd5Sriastradh } 18303464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 18313464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18323464ebd5Sriastradh for (i=0;i<n;i++) { 18333464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F) ) 18343464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 255.0F) << 8) 18353464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 255.0F) << 16) 18363464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 255.0F) << 24); 18373464ebd5Sriastradh } 18383464ebd5Sriastradh } 18393464ebd5Sriastradh break; 18403464ebd5Sriastradh case GL_UNSIGNED_INT_10_10_10_2: 18413464ebd5Sriastradh if (dstFormat == GL_RGBA) { 18423464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18433464ebd5Sriastradh for (i=0;i<n;i++) { 18443464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22) 18453464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12) 18463464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 1023.0F) << 2) 18473464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 3.0F) ); 18483464ebd5Sriastradh } 18493464ebd5Sriastradh } 18503464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 18513464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18523464ebd5Sriastradh for (i=0;i<n;i++) { 18533464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22) 18543464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12) 18553464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 1023.0F) << 2) 18563464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 3.0F) ); 18573464ebd5Sriastradh } 18583464ebd5Sriastradh } 18593464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 18603464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18613464ebd5Sriastradh for (i=0;i<n;i++) { 18623464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22) 18633464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12) 18643464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 2) 18653464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 3.0F) ); 18663464ebd5Sriastradh } 18673464ebd5Sriastradh } 18683464ebd5Sriastradh break; 18693464ebd5Sriastradh case GL_UNSIGNED_INT_2_10_10_10_REV: 18703464ebd5Sriastradh if (dstFormat == GL_RGBA) { 18713464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18723464ebd5Sriastradh for (i=0;i<n;i++) { 18733464ebd5Sriastradh dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) ) 18743464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10) 18753464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20) 18763464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 3.0F) << 30); 18773464ebd5Sriastradh } 18783464ebd5Sriastradh } 18793464ebd5Sriastradh else if (dstFormat == GL_BGRA) { 18803464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18813464ebd5Sriastradh for (i=0;i<n;i++) { 18823464ebd5Sriastradh dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) ) 18833464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10) 18843464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20) 18853464ebd5Sriastradh | (IROUND(rgba[i][ACOMP] * 3.0F) << 30); 18863464ebd5Sriastradh } 18873464ebd5Sriastradh } 18883464ebd5Sriastradh else if (dstFormat == GL_ABGR_EXT) { 18893464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 18903464ebd5Sriastradh for (i=0;i<n;i++) { 18913464ebd5Sriastradh dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) ) 18923464ebd5Sriastradh | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10) 18933464ebd5Sriastradh | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20) 18943464ebd5Sriastradh | (IROUND(rgba[i][RCOMP] * 3.0F) << 30); 18953464ebd5Sriastradh } 18963464ebd5Sriastradh } 18973464ebd5Sriastradh break; 18983464ebd5Sriastradh case GL_UNSIGNED_INT_5_9_9_9_REV: 18993464ebd5Sriastradh { 19003464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 19013464ebd5Sriastradh for (i = 0; i < n; i++) { 19023464ebd5Sriastradh dst[i] = float3_to_rgb9e5(rgba[i]); 19033464ebd5Sriastradh } 19043464ebd5Sriastradh } 19053464ebd5Sriastradh break; 19063464ebd5Sriastradh case GL_UNSIGNED_INT_10F_11F_11F_REV: 19073464ebd5Sriastradh { 19083464ebd5Sriastradh GLuint *dst = (GLuint *) dstAddr; 19093464ebd5Sriastradh for (i = 0; i < n; i++) { 19103464ebd5Sriastradh dst[i] = float3_to_r11g11b10f(rgba[i]); 19113464ebd5Sriastradh } 19123464ebd5Sriastradh } 19133464ebd5Sriastradh break; 19143464ebd5Sriastradh default: 19153464ebd5Sriastradh _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float"); 19163464ebd5Sriastradh return; 19173464ebd5Sriastradh } 19183464ebd5Sriastradh 19193464ebd5Sriastradh if (dstPacking->SwapBytes) { 19203464ebd5Sriastradh GLint swapSize = _mesa_sizeof_packed_type(dstType); 19213464ebd5Sriastradh if (swapSize == 2) { 19223464ebd5Sriastradh if (dstPacking->SwapBytes) { 19233464ebd5Sriastradh _mesa_swap2((GLushort *) dstAddr, n * comps); 19243464ebd5Sriastradh } 19253464ebd5Sriastradh } 19263464ebd5Sriastradh else if (swapSize == 4) { 19273464ebd5Sriastradh if (dstPacking->SwapBytes) { 19283464ebd5Sriastradh _mesa_swap4((GLuint *) dstAddr, n * comps); 19293464ebd5Sriastradh } 19303464ebd5Sriastradh } 19313464ebd5Sriastradh } 19323464ebd5Sriastradh 19333464ebd5Sriastradh free(luminance); 19343464ebd5Sriastradh} 19353464ebd5Sriastradh 19363464ebd5Sriastradh 19373464ebd5Sriastradh 19383464ebd5Sriastradh#define SWAP2BYTE(VALUE) \ 19393464ebd5Sriastradh { \ 19403464ebd5Sriastradh GLubyte *bytes = (GLubyte *) &(VALUE); \ 19413464ebd5Sriastradh GLubyte tmp = bytes[0]; \ 19423464ebd5Sriastradh bytes[0] = bytes[1]; \ 19433464ebd5Sriastradh bytes[1] = tmp; \ 19443464ebd5Sriastradh } 19453464ebd5Sriastradh 19463464ebd5Sriastradh#define SWAP4BYTE(VALUE) \ 19473464ebd5Sriastradh { \ 19483464ebd5Sriastradh GLubyte *bytes = (GLubyte *) &(VALUE); \ 19493464ebd5Sriastradh GLubyte tmp = bytes[0]; \ 19503464ebd5Sriastradh bytes[0] = bytes[3]; \ 19513464ebd5Sriastradh bytes[3] = tmp; \ 19523464ebd5Sriastradh tmp = bytes[1]; \ 19533464ebd5Sriastradh bytes[1] = bytes[2]; \ 19543464ebd5Sriastradh bytes[2] = tmp; \ 19553464ebd5Sriastradh } 19563464ebd5Sriastradh 19573464ebd5Sriastradh 19583464ebd5Sriastradhstatic void 19593464ebd5Sriastradhextract_uint_indexes(GLuint n, GLuint indexes[], 19603464ebd5Sriastradh GLenum srcFormat, GLenum srcType, const GLvoid *src, 19613464ebd5Sriastradh const struct gl_pixelstore_attrib *unpack ) 19623464ebd5Sriastradh{ 19633464ebd5Sriastradh ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX); 19643464ebd5Sriastradh 19653464ebd5Sriastradh ASSERT(srcType == GL_BITMAP || 19663464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE || 19673464ebd5Sriastradh srcType == GL_BYTE || 19683464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 19693464ebd5Sriastradh srcType == GL_SHORT || 19703464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 19713464ebd5Sriastradh srcType == GL_INT || 19723464ebd5Sriastradh srcType == GL_UNSIGNED_INT_24_8_EXT || 19733464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 19743464ebd5Sriastradh srcType == GL_FLOAT); 19753464ebd5Sriastradh 19763464ebd5Sriastradh switch (srcType) { 19773464ebd5Sriastradh case GL_BITMAP: 19783464ebd5Sriastradh { 19793464ebd5Sriastradh GLubyte *ubsrc = (GLubyte *) src; 19803464ebd5Sriastradh if (unpack->LsbFirst) { 19813464ebd5Sriastradh GLubyte mask = 1 << (unpack->SkipPixels & 0x7); 19823464ebd5Sriastradh GLuint i; 19833464ebd5Sriastradh for (i = 0; i < n; i++) { 19843464ebd5Sriastradh indexes[i] = (*ubsrc & mask) ? 1 : 0; 19853464ebd5Sriastradh if (mask == 128) { 19863464ebd5Sriastradh mask = 1; 19873464ebd5Sriastradh ubsrc++; 19883464ebd5Sriastradh } 19893464ebd5Sriastradh else { 19903464ebd5Sriastradh mask = mask << 1; 19913464ebd5Sriastradh } 19923464ebd5Sriastradh } 19933464ebd5Sriastradh } 19943464ebd5Sriastradh else { 19953464ebd5Sriastradh GLubyte mask = 128 >> (unpack->SkipPixels & 0x7); 19963464ebd5Sriastradh GLuint i; 19973464ebd5Sriastradh for (i = 0; i < n; i++) { 19983464ebd5Sriastradh indexes[i] = (*ubsrc & mask) ? 1 : 0; 19993464ebd5Sriastradh if (mask == 1) { 20003464ebd5Sriastradh mask = 128; 20013464ebd5Sriastradh ubsrc++; 20023464ebd5Sriastradh } 20033464ebd5Sriastradh else { 20043464ebd5Sriastradh mask = mask >> 1; 20053464ebd5Sriastradh } 20063464ebd5Sriastradh } 20073464ebd5Sriastradh } 20083464ebd5Sriastradh } 20093464ebd5Sriastradh break; 20103464ebd5Sriastradh case GL_UNSIGNED_BYTE: 20113464ebd5Sriastradh { 20123464ebd5Sriastradh GLuint i; 20133464ebd5Sriastradh const GLubyte *s = (const GLubyte *) src; 20143464ebd5Sriastradh for (i = 0; i < n; i++) 20153464ebd5Sriastradh indexes[i] = s[i]; 20163464ebd5Sriastradh } 20173464ebd5Sriastradh break; 20183464ebd5Sriastradh case GL_BYTE: 20193464ebd5Sriastradh { 20203464ebd5Sriastradh GLuint i; 20213464ebd5Sriastradh const GLbyte *s = (const GLbyte *) src; 20223464ebd5Sriastradh for (i = 0; i < n; i++) 20233464ebd5Sriastradh indexes[i] = s[i]; 20243464ebd5Sriastradh } 20253464ebd5Sriastradh break; 20263464ebd5Sriastradh case GL_UNSIGNED_SHORT: 20273464ebd5Sriastradh { 20283464ebd5Sriastradh GLuint i; 20293464ebd5Sriastradh const GLushort *s = (const GLushort *) src; 20303464ebd5Sriastradh if (unpack->SwapBytes) { 20313464ebd5Sriastradh for (i = 0; i < n; i++) { 20323464ebd5Sriastradh GLushort value = s[i]; 20333464ebd5Sriastradh SWAP2BYTE(value); 20343464ebd5Sriastradh indexes[i] = value; 20353464ebd5Sriastradh } 20363464ebd5Sriastradh } 20373464ebd5Sriastradh else { 20383464ebd5Sriastradh for (i = 0; i < n; i++) 20393464ebd5Sriastradh indexes[i] = s[i]; 20403464ebd5Sriastradh } 20413464ebd5Sriastradh } 20423464ebd5Sriastradh break; 20433464ebd5Sriastradh case GL_SHORT: 20443464ebd5Sriastradh { 20453464ebd5Sriastradh GLuint i; 20463464ebd5Sriastradh const GLshort *s = (const GLshort *) src; 20473464ebd5Sriastradh if (unpack->SwapBytes) { 20483464ebd5Sriastradh for (i = 0; i < n; i++) { 20493464ebd5Sriastradh GLshort value = s[i]; 20503464ebd5Sriastradh SWAP2BYTE(value); 20513464ebd5Sriastradh indexes[i] = value; 20523464ebd5Sriastradh } 20533464ebd5Sriastradh } 20543464ebd5Sriastradh else { 20553464ebd5Sriastradh for (i = 0; i < n; i++) 20563464ebd5Sriastradh indexes[i] = s[i]; 20573464ebd5Sriastradh } 20583464ebd5Sriastradh } 20593464ebd5Sriastradh break; 20603464ebd5Sriastradh case GL_UNSIGNED_INT: 20613464ebd5Sriastradh { 20623464ebd5Sriastradh GLuint i; 20633464ebd5Sriastradh const GLuint *s = (const GLuint *) src; 20643464ebd5Sriastradh if (unpack->SwapBytes) { 20653464ebd5Sriastradh for (i = 0; i < n; i++) { 20663464ebd5Sriastradh GLuint value = s[i]; 20673464ebd5Sriastradh SWAP4BYTE(value); 20683464ebd5Sriastradh indexes[i] = value; 20693464ebd5Sriastradh } 20703464ebd5Sriastradh } 20713464ebd5Sriastradh else { 20723464ebd5Sriastradh for (i = 0; i < n; i++) 20733464ebd5Sriastradh indexes[i] = s[i]; 20743464ebd5Sriastradh } 20753464ebd5Sriastradh } 20763464ebd5Sriastradh break; 20773464ebd5Sriastradh case GL_INT: 20783464ebd5Sriastradh { 20793464ebd5Sriastradh GLuint i; 20803464ebd5Sriastradh const GLint *s = (const GLint *) src; 20813464ebd5Sriastradh if (unpack->SwapBytes) { 20823464ebd5Sriastradh for (i = 0; i < n; i++) { 20833464ebd5Sriastradh GLint value = s[i]; 20843464ebd5Sriastradh SWAP4BYTE(value); 20853464ebd5Sriastradh indexes[i] = value; 20863464ebd5Sriastradh } 20873464ebd5Sriastradh } 20883464ebd5Sriastradh else { 20893464ebd5Sriastradh for (i = 0; i < n; i++) 20903464ebd5Sriastradh indexes[i] = s[i]; 20913464ebd5Sriastradh } 20923464ebd5Sriastradh } 20933464ebd5Sriastradh break; 20943464ebd5Sriastradh case GL_FLOAT: 20953464ebd5Sriastradh { 20963464ebd5Sriastradh GLuint i; 20973464ebd5Sriastradh const GLfloat *s = (const GLfloat *) src; 20983464ebd5Sriastradh if (unpack->SwapBytes) { 20993464ebd5Sriastradh for (i = 0; i < n; i++) { 21003464ebd5Sriastradh GLfloat value = s[i]; 21013464ebd5Sriastradh SWAP4BYTE(value); 21023464ebd5Sriastradh indexes[i] = (GLuint) value; 21033464ebd5Sriastradh } 21043464ebd5Sriastradh } 21053464ebd5Sriastradh else { 21063464ebd5Sriastradh for (i = 0; i < n; i++) 21073464ebd5Sriastradh indexes[i] = (GLuint) s[i]; 21083464ebd5Sriastradh } 21093464ebd5Sriastradh } 21103464ebd5Sriastradh break; 21113464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 21123464ebd5Sriastradh { 21133464ebd5Sriastradh GLuint i; 21143464ebd5Sriastradh const GLhalfARB *s = (const GLhalfARB *) src; 21153464ebd5Sriastradh if (unpack->SwapBytes) { 21163464ebd5Sriastradh for (i = 0; i < n; i++) { 21173464ebd5Sriastradh GLhalfARB value = s[i]; 21183464ebd5Sriastradh SWAP2BYTE(value); 21193464ebd5Sriastradh indexes[i] = (GLuint) _mesa_half_to_float(value); 21203464ebd5Sriastradh } 21213464ebd5Sriastradh } 21223464ebd5Sriastradh else { 21233464ebd5Sriastradh for (i = 0; i < n; i++) 21243464ebd5Sriastradh indexes[i] = (GLuint) _mesa_half_to_float(s[i]); 21253464ebd5Sriastradh } 21263464ebd5Sriastradh } 21273464ebd5Sriastradh break; 21283464ebd5Sriastradh case GL_UNSIGNED_INT_24_8_EXT: 21293464ebd5Sriastradh { 21303464ebd5Sriastradh GLuint i; 21313464ebd5Sriastradh const GLuint *s = (const GLuint *) src; 21323464ebd5Sriastradh if (unpack->SwapBytes) { 21333464ebd5Sriastradh for (i = 0; i < n; i++) { 21343464ebd5Sriastradh GLuint value = s[i]; 21353464ebd5Sriastradh SWAP4BYTE(value); 21363464ebd5Sriastradh indexes[i] = value & 0xff; /* lower 8 bits */ 21373464ebd5Sriastradh } 21383464ebd5Sriastradh } 21393464ebd5Sriastradh else { 21403464ebd5Sriastradh for (i = 0; i < n; i++) 21413464ebd5Sriastradh indexes[i] = s[i] & 0xff; /* lower 8 bits */ 21423464ebd5Sriastradh } 21433464ebd5Sriastradh } 21443464ebd5Sriastradh break; 21453464ebd5Sriastradh 21463464ebd5Sriastradh default: 21473464ebd5Sriastradh _mesa_problem(NULL, "bad srcType in extract_uint_indexes"); 21483464ebd5Sriastradh return; 21493464ebd5Sriastradh } 21503464ebd5Sriastradh} 21513464ebd5Sriastradh 21523464ebd5Sriastradh 21533464ebd5Sriastradh/** 21543464ebd5Sriastradh * Return source/dest RGBA indexes for unpacking pixels. 21553464ebd5Sriastradh */ 21563464ebd5Sriastradhstatic void 21573464ebd5Sriastradhget_component_mapping(GLenum format, 21583464ebd5Sriastradh GLint *rSrc, 21593464ebd5Sriastradh GLint *gSrc, 21603464ebd5Sriastradh GLint *bSrc, 21613464ebd5Sriastradh GLint *aSrc, 21623464ebd5Sriastradh GLint *rDst, 21633464ebd5Sriastradh GLint *gDst, 21643464ebd5Sriastradh GLint *bDst, 21653464ebd5Sriastradh GLint *aDst) 21663464ebd5Sriastradh{ 21673464ebd5Sriastradh switch (format) { 21683464ebd5Sriastradh case GL_RED: 21693464ebd5Sriastradh case GL_RED_INTEGER_EXT: 21703464ebd5Sriastradh *rSrc = 0; 21713464ebd5Sriastradh *gSrc = *bSrc = *aSrc = -1; 21723464ebd5Sriastradh break; 21733464ebd5Sriastradh case GL_GREEN: 21743464ebd5Sriastradh case GL_GREEN_INTEGER_EXT: 21753464ebd5Sriastradh *gSrc = 0; 21763464ebd5Sriastradh *rSrc = *bSrc = *aSrc = -1; 21773464ebd5Sriastradh break; 21783464ebd5Sriastradh case GL_BLUE: 21793464ebd5Sriastradh case GL_BLUE_INTEGER_EXT: 21803464ebd5Sriastradh *bSrc = 0; 21813464ebd5Sriastradh *rSrc = *gSrc = *aSrc = -1; 21823464ebd5Sriastradh break; 21833464ebd5Sriastradh case GL_ALPHA: 21843464ebd5Sriastradh case GL_ALPHA_INTEGER_EXT: 21853464ebd5Sriastradh *rSrc = *gSrc = *bSrc = -1; 21863464ebd5Sriastradh *aSrc = 0; 21873464ebd5Sriastradh break; 21883464ebd5Sriastradh case GL_LUMINANCE: 21893464ebd5Sriastradh case GL_LUMINANCE_INTEGER_EXT: 21903464ebd5Sriastradh *rSrc = *gSrc = *bSrc = 0; 21913464ebd5Sriastradh *aSrc = -1; 21923464ebd5Sriastradh break; 21933464ebd5Sriastradh case GL_LUMINANCE_ALPHA: 21943464ebd5Sriastradh case GL_LUMINANCE_ALPHA_INTEGER_EXT: 21953464ebd5Sriastradh *rSrc = *gSrc = *bSrc = 0; 21963464ebd5Sriastradh *aSrc = 1; 21973464ebd5Sriastradh break; 21983464ebd5Sriastradh case GL_INTENSITY: 21993464ebd5Sriastradh *rSrc = *gSrc = *bSrc = *aSrc = 0; 22003464ebd5Sriastradh break; 22013464ebd5Sriastradh case GL_RG: 22023464ebd5Sriastradh case GL_RG_INTEGER: 22033464ebd5Sriastradh *rSrc = 0; 22043464ebd5Sriastradh *gSrc = 1; 22053464ebd5Sriastradh *bSrc = -1; 22063464ebd5Sriastradh *aSrc = -1; 22073464ebd5Sriastradh *rDst = 0; 22083464ebd5Sriastradh *gDst = 1; 22093464ebd5Sriastradh *bDst = 2; 22103464ebd5Sriastradh *aDst = 3; 22113464ebd5Sriastradh break; 22123464ebd5Sriastradh case GL_RGB: 22133464ebd5Sriastradh case GL_RGB_INTEGER: 22143464ebd5Sriastradh *rSrc = 0; 22153464ebd5Sriastradh *gSrc = 1; 22163464ebd5Sriastradh *bSrc = 2; 22173464ebd5Sriastradh *aSrc = -1; 22183464ebd5Sriastradh *rDst = 0; 22193464ebd5Sriastradh *gDst = 1; 22203464ebd5Sriastradh *bDst = 2; 22213464ebd5Sriastradh *aDst = 3; 22223464ebd5Sriastradh break; 22233464ebd5Sriastradh case GL_BGR: 22243464ebd5Sriastradh *rSrc = 2; 22253464ebd5Sriastradh *gSrc = 1; 22263464ebd5Sriastradh *bSrc = 0; 22273464ebd5Sriastradh *aSrc = -1; 22283464ebd5Sriastradh *rDst = 2; 22293464ebd5Sriastradh *gDst = 1; 22303464ebd5Sriastradh *bDst = 0; 22313464ebd5Sriastradh *aDst = 3; 22323464ebd5Sriastradh break; 22333464ebd5Sriastradh case GL_RGBA: 22343464ebd5Sriastradh case GL_RGBA_INTEGER: 22353464ebd5Sriastradh *rSrc = 0; 22363464ebd5Sriastradh *gSrc = 1; 22373464ebd5Sriastradh *bSrc = 2; 22383464ebd5Sriastradh *aSrc = 3; 22393464ebd5Sriastradh *rDst = 0; 22403464ebd5Sriastradh *gDst = 1; 22413464ebd5Sriastradh *bDst = 2; 22423464ebd5Sriastradh *aDst = 3; 22433464ebd5Sriastradh break; 22443464ebd5Sriastradh case GL_BGRA: 22453464ebd5Sriastradh *rSrc = 2; 22463464ebd5Sriastradh *gSrc = 1; 22473464ebd5Sriastradh *bSrc = 0; 22483464ebd5Sriastradh *aSrc = 3; 22493464ebd5Sriastradh *rDst = 2; 22503464ebd5Sriastradh *gDst = 1; 22513464ebd5Sriastradh *bDst = 0; 22523464ebd5Sriastradh *aDst = 3; 22533464ebd5Sriastradh break; 22543464ebd5Sriastradh case GL_ABGR_EXT: 22553464ebd5Sriastradh *rSrc = 3; 22563464ebd5Sriastradh *gSrc = 2; 22573464ebd5Sriastradh *bSrc = 1; 22583464ebd5Sriastradh *aSrc = 0; 22593464ebd5Sriastradh *rDst = 3; 22603464ebd5Sriastradh *gDst = 2; 22613464ebd5Sriastradh *bDst = 1; 22623464ebd5Sriastradh *aDst = 0; 22633464ebd5Sriastradh break; 22643464ebd5Sriastradh case GL_DU8DV8_ATI: 22653464ebd5Sriastradh case GL_DUDV_ATI: 22663464ebd5Sriastradh *rSrc = 0; 22673464ebd5Sriastradh *gSrc = 1; 22683464ebd5Sriastradh *bSrc = -1; 22693464ebd5Sriastradh *aSrc = -1; 22703464ebd5Sriastradh break; 22713464ebd5Sriastradh default: 22723464ebd5Sriastradh _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping", 22733464ebd5Sriastradh _mesa_lookup_enum_by_nr(format)); 22743464ebd5Sriastradh return; 22753464ebd5Sriastradh } 22763464ebd5Sriastradh} 22773464ebd5Sriastradh 22783464ebd5Sriastradh 22793464ebd5Sriastradh 22803464ebd5Sriastradh/* 22813464ebd5Sriastradh * This function extracts floating point RGBA values from arbitrary 22823464ebd5Sriastradh * image data. srcFormat and srcType are the format and type parameters 22833464ebd5Sriastradh * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc. 22843464ebd5Sriastradh * 22853464ebd5Sriastradh * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function 22863464ebd5Sriastradh * implements the "Conversion to floating point", "Conversion to RGB", 22873464ebd5Sriastradh * and "Final Expansion to RGBA" operations. 22883464ebd5Sriastradh * 22893464ebd5Sriastradh * Args: n - number of pixels 22903464ebd5Sriastradh * rgba - output colors 22913464ebd5Sriastradh * srcFormat - format of incoming data 22923464ebd5Sriastradh * srcType - data type of incoming data 22933464ebd5Sriastradh * src - source data pointer 22943464ebd5Sriastradh * swapBytes - perform byteswapping of incoming data? 22953464ebd5Sriastradh */ 22963464ebd5Sriastradhstatic void 22973464ebd5Sriastradhextract_float_rgba(GLuint n, GLfloat rgba[][4], 22983464ebd5Sriastradh GLenum srcFormat, GLenum srcType, const GLvoid *src, 22993464ebd5Sriastradh GLboolean swapBytes) 23003464ebd5Sriastradh{ 23013464ebd5Sriastradh GLint rSrc, gSrc, bSrc, aSrc; 23023464ebd5Sriastradh GLint stride; 23033464ebd5Sriastradh GLint rDst, bDst, gDst, aDst; 23043464ebd5Sriastradh GLboolean intFormat; 23053464ebd5Sriastradh GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */ 23063464ebd5Sriastradh 23073464ebd5Sriastradh ASSERT(srcFormat == GL_RED || 23083464ebd5Sriastradh srcFormat == GL_GREEN || 23093464ebd5Sriastradh srcFormat == GL_BLUE || 23103464ebd5Sriastradh srcFormat == GL_ALPHA || 23113464ebd5Sriastradh srcFormat == GL_LUMINANCE || 23123464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA || 23133464ebd5Sriastradh srcFormat == GL_INTENSITY || 23143464ebd5Sriastradh srcFormat == GL_RG || 23153464ebd5Sriastradh srcFormat == GL_RGB || 23163464ebd5Sriastradh srcFormat == GL_BGR || 23173464ebd5Sriastradh srcFormat == GL_RGBA || 23183464ebd5Sriastradh srcFormat == GL_BGRA || 23193464ebd5Sriastradh srcFormat == GL_ABGR_EXT || 23203464ebd5Sriastradh srcFormat == GL_DU8DV8_ATI || 23213464ebd5Sriastradh srcFormat == GL_DUDV_ATI || 23223464ebd5Sriastradh srcFormat == GL_RED_INTEGER_EXT || 23233464ebd5Sriastradh srcFormat == GL_GREEN_INTEGER_EXT || 23243464ebd5Sriastradh srcFormat == GL_BLUE_INTEGER_EXT || 23253464ebd5Sriastradh srcFormat == GL_ALPHA_INTEGER_EXT || 23263464ebd5Sriastradh srcFormat == GL_RGB_INTEGER_EXT || 23273464ebd5Sriastradh srcFormat == GL_RGBA_INTEGER_EXT || 23283464ebd5Sriastradh srcFormat == GL_BGR_INTEGER_EXT || 23293464ebd5Sriastradh srcFormat == GL_BGRA_INTEGER_EXT || 23303464ebd5Sriastradh srcFormat == GL_LUMINANCE_INTEGER_EXT || 23313464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 23323464ebd5Sriastradh 23333464ebd5Sriastradh ASSERT(srcType == GL_UNSIGNED_BYTE || 23343464ebd5Sriastradh srcType == GL_BYTE || 23353464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 23363464ebd5Sriastradh srcType == GL_SHORT || 23373464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 23383464ebd5Sriastradh srcType == GL_INT || 23393464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 23403464ebd5Sriastradh srcType == GL_FLOAT || 23413464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_3_3_2 || 23423464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 23433464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5 || 23443464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 23453464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 23463464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 23473464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 23483464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 23493464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8 || 23503464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 23513464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10_10_10_2 || 23523464ebd5Sriastradh srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 23533464ebd5Sriastradh srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 23543464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 23553464ebd5Sriastradh 23563464ebd5Sriastradh get_component_mapping(srcFormat, 23573464ebd5Sriastradh &rSrc, &gSrc, &bSrc, &aSrc, 23583464ebd5Sriastradh &rDst, &gDst, &bDst, &aDst); 23593464ebd5Sriastradh 23603464ebd5Sriastradh stride = _mesa_components_in_format(srcFormat); 23613464ebd5Sriastradh 23623464ebd5Sriastradh intFormat = _mesa_is_integer_format(srcFormat); 23633464ebd5Sriastradh 23643464ebd5Sriastradh#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ 23653464ebd5Sriastradh if ((SRC_INDEX) < 0) { \ 23663464ebd5Sriastradh GLuint i; \ 23673464ebd5Sriastradh if (intFormat) { \ 23683464ebd5Sriastradh for (i = 0; i < n; i++) { \ 23693464ebd5Sriastradh rgba[i][DST_INDEX] = DEFAULT_INT; \ 23703464ebd5Sriastradh } \ 23713464ebd5Sriastradh } \ 23723464ebd5Sriastradh else { \ 23733464ebd5Sriastradh for (i = 0; i < n; i++) { \ 23743464ebd5Sriastradh rgba[i][DST_INDEX] = DEFAULT_FLT; \ 23753464ebd5Sriastradh } \ 23763464ebd5Sriastradh } \ 23773464ebd5Sriastradh } \ 23783464ebd5Sriastradh else if (swapBytes) { \ 23793464ebd5Sriastradh const TYPE *s = (const TYPE *) src; \ 23803464ebd5Sriastradh GLuint i; \ 23813464ebd5Sriastradh for (i = 0; i < n; i++) { \ 23823464ebd5Sriastradh TYPE value = s[SRC_INDEX]; \ 23833464ebd5Sriastradh if (sizeof(TYPE) == 2) { \ 23843464ebd5Sriastradh SWAP2BYTE(value); \ 23853464ebd5Sriastradh } \ 23863464ebd5Sriastradh else if (sizeof(TYPE) == 4) { \ 23873464ebd5Sriastradh SWAP4BYTE(value); \ 23883464ebd5Sriastradh } \ 23893464ebd5Sriastradh if (intFormat) \ 23903464ebd5Sriastradh rgba[i][DST_INDEX] = (GLfloat) value; \ 23913464ebd5Sriastradh else \ 23923464ebd5Sriastradh rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \ 23933464ebd5Sriastradh s += stride; \ 23943464ebd5Sriastradh } \ 23953464ebd5Sriastradh } \ 23963464ebd5Sriastradh else { \ 23973464ebd5Sriastradh const TYPE *s = (const TYPE *) src; \ 23983464ebd5Sriastradh GLuint i; \ 23993464ebd5Sriastradh if (intFormat) { \ 24003464ebd5Sriastradh for (i = 0; i < n; i++) { \ 24013464ebd5Sriastradh rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \ 24023464ebd5Sriastradh s += stride; \ 24033464ebd5Sriastradh } \ 24043464ebd5Sriastradh } \ 24053464ebd5Sriastradh else { \ 24063464ebd5Sriastradh for (i = 0; i < n; i++) { \ 24073464ebd5Sriastradh rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \ 24083464ebd5Sriastradh s += stride; \ 24093464ebd5Sriastradh } \ 24103464ebd5Sriastradh } \ 24113464ebd5Sriastradh } 24123464ebd5Sriastradh 24133464ebd5Sriastradh switch (srcType) { 24143464ebd5Sriastradh case GL_UNSIGNED_BYTE: 24153464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 24163464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 24173464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT); 24183464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); 24193464ebd5Sriastradh break; 24203464ebd5Sriastradh case GL_BYTE: 24213464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); 24223464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); 24233464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); 24243464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT); 24253464ebd5Sriastradh break; 24263464ebd5Sriastradh case GL_UNSIGNED_SHORT: 24273464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 24283464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 24293464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); 24303464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); 24313464ebd5Sriastradh break; 24323464ebd5Sriastradh case GL_SHORT: 24333464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); 24343464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); 24353464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); 24363464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT); 24373464ebd5Sriastradh break; 24383464ebd5Sriastradh case GL_UNSIGNED_INT: 24393464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 24403464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 24413464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); 24423464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT); 24433464ebd5Sriastradh break; 24443464ebd5Sriastradh case GL_INT: 24453464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 24463464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 24473464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT); 24483464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT); 24493464ebd5Sriastradh break; 24503464ebd5Sriastradh case GL_FLOAT: 24513464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 24523464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 24533464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat)); 24543464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat)); 24553464ebd5Sriastradh break; 24563464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 24573464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 24583464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 24593464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float); 24603464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float); 24613464ebd5Sriastradh break; 24623464ebd5Sriastradh case GL_UNSIGNED_BYTE_3_3_2: 24633464ebd5Sriastradh { 24643464ebd5Sriastradh const GLubyte *ubsrc = (const GLubyte *) src; 24653464ebd5Sriastradh GLuint i; 24663464ebd5Sriastradh if (!intFormat) { 24673464ebd5Sriastradh rs = 1.0F / 7.0F; 24683464ebd5Sriastradh gs = 1.0F / 7.0F; 24693464ebd5Sriastradh bs = 1.0F / 3.0F; 24703464ebd5Sriastradh } 24713464ebd5Sriastradh for (i = 0; i < n; i ++) { 24723464ebd5Sriastradh GLubyte p = ubsrc[i]; 24733464ebd5Sriastradh rgba[i][rDst] = ((p >> 5) ) * rs; 24743464ebd5Sriastradh rgba[i][gDst] = ((p >> 2) & 0x7) * gs; 24753464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x3) * bs; 24763464ebd5Sriastradh rgba[i][aDst] = 1.0F; 24773464ebd5Sriastradh } 24783464ebd5Sriastradh } 24793464ebd5Sriastradh break; 24803464ebd5Sriastradh case GL_UNSIGNED_BYTE_2_3_3_REV: 24813464ebd5Sriastradh { 24823464ebd5Sriastradh const GLubyte *ubsrc = (const GLubyte *) src; 24833464ebd5Sriastradh GLuint i; 24843464ebd5Sriastradh if (!intFormat) { 24853464ebd5Sriastradh rs = 1.0F / 7.0F; 24863464ebd5Sriastradh gs = 1.0F / 7.0F; 24873464ebd5Sriastradh bs = 1.0F / 3.0F; 24883464ebd5Sriastradh } 24893464ebd5Sriastradh for (i = 0; i < n; i ++) { 24903464ebd5Sriastradh GLubyte p = ubsrc[i]; 24913464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x7) * rs; 24923464ebd5Sriastradh rgba[i][gDst] = ((p >> 3) & 0x7) * gs; 24933464ebd5Sriastradh rgba[i][bDst] = ((p >> 6) ) * bs; 24943464ebd5Sriastradh rgba[i][aDst] = 1.0F; 24953464ebd5Sriastradh } 24963464ebd5Sriastradh } 24973464ebd5Sriastradh break; 24983464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5: 24993464ebd5Sriastradh if (!intFormat) { 25003464ebd5Sriastradh rs = 1.0F / 31.0F; 25013464ebd5Sriastradh gs = 1.0F / 63.0F; 25023464ebd5Sriastradh bs = 1.0F / 31.0F; 25033464ebd5Sriastradh } 25043464ebd5Sriastradh if (swapBytes) { 25053464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25063464ebd5Sriastradh GLuint i; 25073464ebd5Sriastradh for (i = 0; i < n; i ++) { 25083464ebd5Sriastradh GLushort p = ussrc[i]; 25093464ebd5Sriastradh SWAP2BYTE(p); 25103464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ) * rs; 25113464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 25123464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x1f) * bs; 25133464ebd5Sriastradh rgba[i][aDst] = 1.0F; 25143464ebd5Sriastradh } 25153464ebd5Sriastradh } 25163464ebd5Sriastradh else { 25173464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25183464ebd5Sriastradh GLuint i; 25193464ebd5Sriastradh for (i = 0; i < n; i ++) { 25203464ebd5Sriastradh GLushort p = ussrc[i]; 25213464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ) * rs; 25223464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 25233464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x1f) * bs; 25243464ebd5Sriastradh rgba[i][aDst] = 1.0F; 25253464ebd5Sriastradh } 25263464ebd5Sriastradh } 25273464ebd5Sriastradh break; 25283464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5_REV: 25293464ebd5Sriastradh if (!intFormat) { 25303464ebd5Sriastradh rs = 1.0F / 31.0F; 25313464ebd5Sriastradh gs = 1.0F / 63.0F; 25323464ebd5Sriastradh bs = 1.0F / 31.0F; 25333464ebd5Sriastradh } 25343464ebd5Sriastradh if (swapBytes) { 25353464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25363464ebd5Sriastradh GLuint i; 25373464ebd5Sriastradh for (i = 0; i < n; i ++) { 25383464ebd5Sriastradh GLushort p = ussrc[i]; 25393464ebd5Sriastradh SWAP2BYTE(p); 25403464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f) * rs; 25413464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 25423464ebd5Sriastradh rgba[i][bDst] = ((p >> 11) ) * bs; 25433464ebd5Sriastradh rgba[i][aDst] = 1.0F; 25443464ebd5Sriastradh } 25453464ebd5Sriastradh } 25463464ebd5Sriastradh else { 25473464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25483464ebd5Sriastradh GLuint i; 25493464ebd5Sriastradh for (i = 0; i < n; i ++) { 25503464ebd5Sriastradh GLushort p = ussrc[i]; 25513464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f) * rs; 25523464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f) * gs; 25533464ebd5Sriastradh rgba[i][bDst] = ((p >> 11) ) * bs; 25543464ebd5Sriastradh rgba[i][aDst] = 1.0F; 25553464ebd5Sriastradh } 25563464ebd5Sriastradh } 25573464ebd5Sriastradh break; 25583464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4: 25593464ebd5Sriastradh if (!intFormat) { 25603464ebd5Sriastradh rs = gs = bs = as = 1.0F / 15.0F; 25613464ebd5Sriastradh } 25623464ebd5Sriastradh if (swapBytes) { 25633464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25643464ebd5Sriastradh GLuint i; 25653464ebd5Sriastradh for (i = 0; i < n; i ++) { 25663464ebd5Sriastradh GLushort p = ussrc[i]; 25673464ebd5Sriastradh SWAP2BYTE(p); 25683464ebd5Sriastradh rgba[i][rDst] = ((p >> 12) ) * rs; 25693464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 25703464ebd5Sriastradh rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 25713464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xf) * as; 25723464ebd5Sriastradh } 25733464ebd5Sriastradh } 25743464ebd5Sriastradh else { 25753464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25763464ebd5Sriastradh GLuint i; 25773464ebd5Sriastradh for (i = 0; i < n; i ++) { 25783464ebd5Sriastradh GLushort p = ussrc[i]; 25793464ebd5Sriastradh rgba[i][rDst] = ((p >> 12) ) * rs; 25803464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xf) * gs; 25813464ebd5Sriastradh rgba[i][bDst] = ((p >> 4) & 0xf) * bs; 25823464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xf) * as; 25833464ebd5Sriastradh } 25843464ebd5Sriastradh } 25853464ebd5Sriastradh break; 25863464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4_REV: 25873464ebd5Sriastradh if (!intFormat) { 25883464ebd5Sriastradh rs = gs = bs = as = 1.0F / 15.0F; 25893464ebd5Sriastradh } 25903464ebd5Sriastradh if (swapBytes) { 25913464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 25923464ebd5Sriastradh GLuint i; 25933464ebd5Sriastradh for (i = 0; i < n; i ++) { 25943464ebd5Sriastradh GLushort p = ussrc[i]; 25953464ebd5Sriastradh SWAP2BYTE(p); 25963464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xf) * rs; 25973464ebd5Sriastradh rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 25983464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 25993464ebd5Sriastradh rgba[i][aDst] = ((p >> 12) ) * as; 26003464ebd5Sriastradh } 26013464ebd5Sriastradh } 26023464ebd5Sriastradh else { 26033464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 26043464ebd5Sriastradh GLuint i; 26053464ebd5Sriastradh for (i = 0; i < n; i ++) { 26063464ebd5Sriastradh GLushort p = ussrc[i]; 26073464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xf) * rs; 26083464ebd5Sriastradh rgba[i][gDst] = ((p >> 4) & 0xf) * gs; 26093464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xf) * bs; 26103464ebd5Sriastradh rgba[i][aDst] = ((p >> 12) ) * as; 26113464ebd5Sriastradh } 26123464ebd5Sriastradh } 26133464ebd5Sriastradh break; 26143464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_5_5_1: 26153464ebd5Sriastradh if (!intFormat) { 26163464ebd5Sriastradh rs = gs = bs = 1.0F / 31.0F; 26173464ebd5Sriastradh } 26183464ebd5Sriastradh if (swapBytes) { 26193464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 26203464ebd5Sriastradh GLuint i; 26213464ebd5Sriastradh for (i = 0; i < n; i ++) { 26223464ebd5Sriastradh GLushort p = ussrc[i]; 26233464ebd5Sriastradh SWAP2BYTE(p); 26243464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ) * rs; 26253464ebd5Sriastradh rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 26263464ebd5Sriastradh rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 26273464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x1) * as; 26283464ebd5Sriastradh } 26293464ebd5Sriastradh } 26303464ebd5Sriastradh else { 26313464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 26323464ebd5Sriastradh GLuint i; 26333464ebd5Sriastradh for (i = 0; i < n; i ++) { 26343464ebd5Sriastradh GLushort p = ussrc[i]; 26353464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ) * rs; 26363464ebd5Sriastradh rgba[i][gDst] = ((p >> 6) & 0x1f) * gs; 26373464ebd5Sriastradh rgba[i][bDst] = ((p >> 1) & 0x1f) * bs; 26383464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x1) * as; 26393464ebd5Sriastradh } 26403464ebd5Sriastradh } 26413464ebd5Sriastradh break; 26423464ebd5Sriastradh case GL_UNSIGNED_SHORT_1_5_5_5_REV: 26433464ebd5Sriastradh if (!intFormat) { 26443464ebd5Sriastradh rs = gs = bs = 1.0F / 31.0F; 26453464ebd5Sriastradh } 26463464ebd5Sriastradh if (swapBytes) { 26473464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 26483464ebd5Sriastradh GLuint i; 26493464ebd5Sriastradh for (i = 0; i < n; i ++) { 26503464ebd5Sriastradh GLushort p = ussrc[i]; 26513464ebd5Sriastradh SWAP2BYTE(p); 26523464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f) * rs; 26533464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 26543464ebd5Sriastradh rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 26553464ebd5Sriastradh rgba[i][aDst] = ((p >> 15) ) * as; 26563464ebd5Sriastradh } 26573464ebd5Sriastradh } 26583464ebd5Sriastradh else { 26593464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 26603464ebd5Sriastradh GLuint i; 26613464ebd5Sriastradh for (i = 0; i < n; i ++) { 26623464ebd5Sriastradh GLushort p = ussrc[i]; 26633464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f) * rs; 26643464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x1f) * gs; 26653464ebd5Sriastradh rgba[i][bDst] = ((p >> 10) & 0x1f) * bs; 26663464ebd5Sriastradh rgba[i][aDst] = ((p >> 15) ) * as; 26673464ebd5Sriastradh } 26683464ebd5Sriastradh } 26693464ebd5Sriastradh break; 26703464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8: 26713464ebd5Sriastradh if (swapBytes) { 26723464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 26733464ebd5Sriastradh GLuint i; 26743464ebd5Sriastradh if (intFormat) { 26753464ebd5Sriastradh for (i = 0; i < n; i ++) { 26763464ebd5Sriastradh GLuint p = uisrc[i]; 26773464ebd5Sriastradh rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 26783464ebd5Sriastradh rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 26793464ebd5Sriastradh rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 26803464ebd5Sriastradh rgba[i][aDst] = (GLfloat) ((p >> 24) ); 26813464ebd5Sriastradh } 26823464ebd5Sriastradh } 26833464ebd5Sriastradh else { 26843464ebd5Sriastradh for (i = 0; i < n; i ++) { 26853464ebd5Sriastradh GLuint p = uisrc[i]; 26863464ebd5Sriastradh rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 26873464ebd5Sriastradh rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 26883464ebd5Sriastradh rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 26893464ebd5Sriastradh rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 26903464ebd5Sriastradh } 26913464ebd5Sriastradh } 26923464ebd5Sriastradh } 26933464ebd5Sriastradh else { 26943464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 26953464ebd5Sriastradh GLuint i; 26963464ebd5Sriastradh if (intFormat) { 26973464ebd5Sriastradh for (i = 0; i < n; i ++) { 26983464ebd5Sriastradh GLuint p = uisrc[i]; 26993464ebd5Sriastradh rgba[i][rDst] = (GLfloat) ((p >> 24) ); 27003464ebd5Sriastradh rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 27013464ebd5Sriastradh rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 27023464ebd5Sriastradh rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 27033464ebd5Sriastradh } 27043464ebd5Sriastradh } 27053464ebd5Sriastradh else { 27063464ebd5Sriastradh for (i = 0; i < n; i ++) { 27073464ebd5Sriastradh GLuint p = uisrc[i]; 27083464ebd5Sriastradh rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 27093464ebd5Sriastradh rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 27103464ebd5Sriastradh rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 27113464ebd5Sriastradh rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 27123464ebd5Sriastradh } 27133464ebd5Sriastradh } 27143464ebd5Sriastradh } 27153464ebd5Sriastradh break; 27163464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8_REV: 27173464ebd5Sriastradh if (swapBytes) { 27183464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 27193464ebd5Sriastradh GLuint i; 27203464ebd5Sriastradh if (intFormat) { 27213464ebd5Sriastradh for (i = 0; i < n; i ++) { 27223464ebd5Sriastradh GLuint p = uisrc[i]; 27233464ebd5Sriastradh rgba[i][rDst] = (GLfloat) ((p >> 24) ); 27243464ebd5Sriastradh rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff); 27253464ebd5Sriastradh rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff); 27263464ebd5Sriastradh rgba[i][aDst] = (GLfloat) ((p ) & 0xff); 27273464ebd5Sriastradh } 27283464ebd5Sriastradh } 27293464ebd5Sriastradh else { 27303464ebd5Sriastradh for (i = 0; i < n; i ++) { 27313464ebd5Sriastradh GLuint p = uisrc[i]; 27323464ebd5Sriastradh rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) ); 27333464ebd5Sriastradh rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 27343464ebd5Sriastradh rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 27353464ebd5Sriastradh rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff); 27363464ebd5Sriastradh } 27373464ebd5Sriastradh } 27383464ebd5Sriastradh } 27393464ebd5Sriastradh else { 27403464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 27413464ebd5Sriastradh GLuint i; 27423464ebd5Sriastradh if (intFormat) { 27433464ebd5Sriastradh for (i = 0; i < n; i ++) { 27443464ebd5Sriastradh GLuint p = uisrc[i]; 27453464ebd5Sriastradh rgba[i][rDst] = (GLfloat) ((p ) & 0xff); 27463464ebd5Sriastradh rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff); 27473464ebd5Sriastradh rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff); 27483464ebd5Sriastradh rgba[i][aDst] = (GLfloat) ((p >> 24) ); 27493464ebd5Sriastradh } 27503464ebd5Sriastradh } 27513464ebd5Sriastradh else { 27523464ebd5Sriastradh for (i = 0; i < n; i ++) { 27533464ebd5Sriastradh GLuint p = uisrc[i]; 27543464ebd5Sriastradh rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff); 27553464ebd5Sriastradh rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff); 27563464ebd5Sriastradh rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff); 27573464ebd5Sriastradh rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) ); 27583464ebd5Sriastradh } 27593464ebd5Sriastradh } 27603464ebd5Sriastradh } 27613464ebd5Sriastradh break; 27623464ebd5Sriastradh case GL_UNSIGNED_INT_10_10_10_2: 27633464ebd5Sriastradh if (!intFormat) { 27643464ebd5Sriastradh rs = 1.0F / 1023.0F; 27653464ebd5Sriastradh gs = 1.0F / 1023.0F; 27663464ebd5Sriastradh bs = 1.0F / 1023.0F; 27673464ebd5Sriastradh as = 1.0F / 3.0F; 27683464ebd5Sriastradh } 27693464ebd5Sriastradh if (swapBytes) { 27703464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 27713464ebd5Sriastradh GLuint i; 27723464ebd5Sriastradh for (i = 0; i < n; i ++) { 27733464ebd5Sriastradh GLuint p = uisrc[i]; 27743464ebd5Sriastradh SWAP4BYTE(p); 27753464ebd5Sriastradh rgba[i][rDst] = ((p >> 22) ) * rs; 27763464ebd5Sriastradh rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 27773464ebd5Sriastradh rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 27783464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x3 ) * as; 27793464ebd5Sriastradh } 27803464ebd5Sriastradh } 27813464ebd5Sriastradh else { 27823464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 27833464ebd5Sriastradh GLuint i; 27843464ebd5Sriastradh for (i = 0; i < n; i ++) { 27853464ebd5Sriastradh GLuint p = uisrc[i]; 27863464ebd5Sriastradh rgba[i][rDst] = ((p >> 22) ) * rs; 27873464ebd5Sriastradh rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs; 27883464ebd5Sriastradh rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs; 27893464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x3 ) * as; 27903464ebd5Sriastradh } 27913464ebd5Sriastradh } 27923464ebd5Sriastradh break; 27933464ebd5Sriastradh case GL_UNSIGNED_INT_2_10_10_10_REV: 27943464ebd5Sriastradh if (!intFormat) { 27953464ebd5Sriastradh rs = 1.0F / 1023.0F; 27963464ebd5Sriastradh gs = 1.0F / 1023.0F; 27973464ebd5Sriastradh bs = 1.0F / 1023.0F; 27983464ebd5Sriastradh as = 1.0F / 3.0F; 27993464ebd5Sriastradh } 28003464ebd5Sriastradh if (swapBytes) { 28013464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28023464ebd5Sriastradh GLuint i; 28033464ebd5Sriastradh for (i = 0; i < n; i ++) { 28043464ebd5Sriastradh GLuint p = uisrc[i]; 28053464ebd5Sriastradh SWAP4BYTE(p); 28063464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x3ff) * rs; 28073464ebd5Sriastradh rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 28083464ebd5Sriastradh rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 28093464ebd5Sriastradh rgba[i][aDst] = ((p >> 30) ) * as; 28103464ebd5Sriastradh } 28113464ebd5Sriastradh } 28123464ebd5Sriastradh else { 28133464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28143464ebd5Sriastradh GLuint i; 28153464ebd5Sriastradh for (i = 0; i < n; i ++) { 28163464ebd5Sriastradh GLuint p = uisrc[i]; 28173464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x3ff) * rs; 28183464ebd5Sriastradh rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs; 28193464ebd5Sriastradh rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs; 28203464ebd5Sriastradh rgba[i][aDst] = ((p >> 30) ) * as; 28213464ebd5Sriastradh } 28223464ebd5Sriastradh } 28233464ebd5Sriastradh break; 28243464ebd5Sriastradh case GL_UNSIGNED_INT_5_9_9_9_REV: 28253464ebd5Sriastradh if (swapBytes) { 28263464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28273464ebd5Sriastradh GLuint i; 28283464ebd5Sriastradh GLfloat f[3]; 28293464ebd5Sriastradh for (i = 0; i < n; i ++) { 28303464ebd5Sriastradh GLuint p = uisrc[i]; 28313464ebd5Sriastradh SWAP4BYTE(p); 28323464ebd5Sriastradh rgb9e5_to_float3(p, f); 28333464ebd5Sriastradh rgba[i][rDst] = f[0]; 28343464ebd5Sriastradh rgba[i][gDst] = f[1]; 28353464ebd5Sriastradh rgba[i][bDst] = f[2]; 28363464ebd5Sriastradh rgba[i][aDst] = 1.0F; 28373464ebd5Sriastradh } 28383464ebd5Sriastradh } 28393464ebd5Sriastradh else { 28403464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28413464ebd5Sriastradh GLuint i; 28423464ebd5Sriastradh GLfloat f[3]; 28433464ebd5Sriastradh for (i = 0; i < n; i ++) { 28443464ebd5Sriastradh rgb9e5_to_float3(uisrc[i], f); 28453464ebd5Sriastradh rgba[i][rDst] = f[0]; 28463464ebd5Sriastradh rgba[i][gDst] = f[1]; 28473464ebd5Sriastradh rgba[i][bDst] = f[2]; 28483464ebd5Sriastradh rgba[i][aDst] = 1.0F; 28493464ebd5Sriastradh } 28503464ebd5Sriastradh } 28513464ebd5Sriastradh break; 28523464ebd5Sriastradh case GL_UNSIGNED_INT_10F_11F_11F_REV: 28533464ebd5Sriastradh if (swapBytes) { 28543464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28553464ebd5Sriastradh GLuint i; 28563464ebd5Sriastradh GLfloat f[3]; 28573464ebd5Sriastradh for (i = 0; i < n; i ++) { 28583464ebd5Sriastradh GLuint p = uisrc[i]; 28593464ebd5Sriastradh SWAP4BYTE(p); 28603464ebd5Sriastradh r11g11b10f_to_float3(p, f); 28613464ebd5Sriastradh rgba[i][rDst] = f[0]; 28623464ebd5Sriastradh rgba[i][gDst] = f[1]; 28633464ebd5Sriastradh rgba[i][bDst] = f[2]; 28643464ebd5Sriastradh rgba[i][aDst] = 1.0F; 28653464ebd5Sriastradh } 28663464ebd5Sriastradh } 28673464ebd5Sriastradh else { 28683464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 28693464ebd5Sriastradh GLuint i; 28703464ebd5Sriastradh GLfloat f[3]; 28713464ebd5Sriastradh for (i = 0; i < n; i ++) { 28723464ebd5Sriastradh r11g11b10f_to_float3(uisrc[i], f); 28733464ebd5Sriastradh rgba[i][rDst] = f[0]; 28743464ebd5Sriastradh rgba[i][gDst] = f[1]; 28753464ebd5Sriastradh rgba[i][bDst] = f[2]; 28763464ebd5Sriastradh rgba[i][aDst] = 1.0F; 28773464ebd5Sriastradh } 28783464ebd5Sriastradh } 28793464ebd5Sriastradh break; 28803464ebd5Sriastradh default: 28813464ebd5Sriastradh _mesa_problem(NULL, "bad srcType in extract float data"); 28823464ebd5Sriastradh break; 28833464ebd5Sriastradh } 28843464ebd5Sriastradh#undef PROCESS 28853464ebd5Sriastradh} 28863464ebd5Sriastradh 28873464ebd5Sriastradh 28883464ebd5Sriastradhstatic INLINE GLuint 28893464ebd5Sriastradhclamp_byte_to_uint(GLbyte b) 28903464ebd5Sriastradh{ 28913464ebd5Sriastradh return b < 0 ? 0 : b; 28923464ebd5Sriastradh} 28933464ebd5Sriastradh 28943464ebd5Sriastradh 28953464ebd5Sriastradhstatic INLINE GLuint 28963464ebd5Sriastradhclamp_short_to_uint(GLshort s) 28973464ebd5Sriastradh{ 28983464ebd5Sriastradh return s < 0 ? 0 : s; 28993464ebd5Sriastradh} 29003464ebd5Sriastradh 29013464ebd5Sriastradh 29023464ebd5Sriastradhstatic INLINE GLuint 29033464ebd5Sriastradhclamp_int_to_uint(GLint i) 29043464ebd5Sriastradh{ 29053464ebd5Sriastradh return i < 0 ? 0 : i; 29063464ebd5Sriastradh} 29073464ebd5Sriastradh 29083464ebd5Sriastradh 29093464ebd5Sriastradhstatic INLINE GLuint 29103464ebd5Sriastradhclamp_float_to_uint(GLfloat f) 29113464ebd5Sriastradh{ 29123464ebd5Sriastradh return f < 0.0F ? 0 : IROUND(f); 29133464ebd5Sriastradh} 29143464ebd5Sriastradh 29153464ebd5Sriastradh 29163464ebd5Sriastradhstatic INLINE GLuint 29173464ebd5Sriastradhclamp_half_to_uint(GLhalfARB h) 29183464ebd5Sriastradh{ 29193464ebd5Sriastradh GLfloat f = _mesa_half_to_float(h); 29203464ebd5Sriastradh return f < 0.0F ? 0 : IROUND(f); 29213464ebd5Sriastradh} 29223464ebd5Sriastradh 29233464ebd5Sriastradh 29243464ebd5Sriastradh/** 29253464ebd5Sriastradh * \sa extract_float_rgba() 29263464ebd5Sriastradh */ 29273464ebd5Sriastradhstatic void 29283464ebd5Sriastradhextract_uint_rgba(GLuint n, GLuint rgba[][4], 29293464ebd5Sriastradh GLenum srcFormat, GLenum srcType, const GLvoid *src, 29303464ebd5Sriastradh GLboolean swapBytes) 29313464ebd5Sriastradh{ 29323464ebd5Sriastradh GLint rSrc, gSrc, bSrc, aSrc; 29333464ebd5Sriastradh GLint stride; 29343464ebd5Sriastradh GLint rDst, bDst, gDst, aDst; 29353464ebd5Sriastradh 29363464ebd5Sriastradh ASSERT(srcFormat == GL_RED || 29373464ebd5Sriastradh srcFormat == GL_GREEN || 29383464ebd5Sriastradh srcFormat == GL_BLUE || 29393464ebd5Sriastradh srcFormat == GL_ALPHA || 29403464ebd5Sriastradh srcFormat == GL_LUMINANCE || 29413464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA || 29423464ebd5Sriastradh srcFormat == GL_INTENSITY || 29433464ebd5Sriastradh srcFormat == GL_RG || 29443464ebd5Sriastradh srcFormat == GL_RGB || 29453464ebd5Sriastradh srcFormat == GL_BGR || 29463464ebd5Sriastradh srcFormat == GL_RGBA || 29473464ebd5Sriastradh srcFormat == GL_BGRA || 29483464ebd5Sriastradh srcFormat == GL_ABGR_EXT || 29493464ebd5Sriastradh srcFormat == GL_DU8DV8_ATI || 29503464ebd5Sriastradh srcFormat == GL_DUDV_ATI || 29513464ebd5Sriastradh srcFormat == GL_RED_INTEGER_EXT || 29523464ebd5Sriastradh srcFormat == GL_GREEN_INTEGER_EXT || 29533464ebd5Sriastradh srcFormat == GL_BLUE_INTEGER_EXT || 29543464ebd5Sriastradh srcFormat == GL_ALPHA_INTEGER_EXT || 29553464ebd5Sriastradh srcFormat == GL_RGB_INTEGER_EXT || 29563464ebd5Sriastradh srcFormat == GL_RGBA_INTEGER_EXT || 29573464ebd5Sriastradh srcFormat == GL_BGR_INTEGER_EXT || 29583464ebd5Sriastradh srcFormat == GL_BGRA_INTEGER_EXT || 29593464ebd5Sriastradh srcFormat == GL_LUMINANCE_INTEGER_EXT || 29603464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 29613464ebd5Sriastradh 29623464ebd5Sriastradh ASSERT(srcType == GL_UNSIGNED_BYTE || 29633464ebd5Sriastradh srcType == GL_BYTE || 29643464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 29653464ebd5Sriastradh srcType == GL_SHORT || 29663464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 29673464ebd5Sriastradh srcType == GL_INT || 29683464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 29693464ebd5Sriastradh srcType == GL_FLOAT || 29703464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_3_3_2 || 29713464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 29723464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5 || 29733464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 29743464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 29753464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 29763464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 29773464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 29783464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8 || 29793464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 29803464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10_10_10_2 || 29813464ebd5Sriastradh srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 29823464ebd5Sriastradh srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 29833464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 29843464ebd5Sriastradh 29853464ebd5Sriastradh get_component_mapping(srcFormat, 29863464ebd5Sriastradh &rSrc, &gSrc, &bSrc, &aSrc, 29873464ebd5Sriastradh &rDst, &gDst, &bDst, &aDst); 29883464ebd5Sriastradh 29893464ebd5Sriastradh stride = _mesa_components_in_format(srcFormat); 29903464ebd5Sriastradh 29913464ebd5Sriastradh#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \ 29923464ebd5Sriastradh if ((SRC_INDEX) < 0) { \ 29933464ebd5Sriastradh GLuint i; \ 29943464ebd5Sriastradh for (i = 0; i < n; i++) { \ 29953464ebd5Sriastradh rgba[i][DST_INDEX] = DEFAULT; \ 29963464ebd5Sriastradh } \ 29973464ebd5Sriastradh } \ 29983464ebd5Sriastradh else if (swapBytes) { \ 29993464ebd5Sriastradh const TYPE *s = (const TYPE *) src; \ 30003464ebd5Sriastradh GLuint i; \ 30013464ebd5Sriastradh for (i = 0; i < n; i++) { \ 30023464ebd5Sriastradh TYPE value = s[SRC_INDEX]; \ 30033464ebd5Sriastradh if (sizeof(TYPE) == 2) { \ 30043464ebd5Sriastradh SWAP2BYTE(value); \ 30053464ebd5Sriastradh } \ 30063464ebd5Sriastradh else if (sizeof(TYPE) == 4) { \ 30073464ebd5Sriastradh SWAP4BYTE(value); \ 30083464ebd5Sriastradh } \ 30093464ebd5Sriastradh rgba[i][DST_INDEX] = CONVERSION(value); \ 30103464ebd5Sriastradh s += stride; \ 30113464ebd5Sriastradh } \ 30123464ebd5Sriastradh } \ 30133464ebd5Sriastradh else { \ 30143464ebd5Sriastradh const TYPE *s = (const TYPE *) src; \ 30153464ebd5Sriastradh GLuint i; \ 30163464ebd5Sriastradh for (i = 0; i < n; i++) { \ 30173464ebd5Sriastradh rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \ 30183464ebd5Sriastradh s += stride; \ 30193464ebd5Sriastradh } \ 30203464ebd5Sriastradh } 30213464ebd5Sriastradh 30223464ebd5Sriastradh switch (srcType) { 30233464ebd5Sriastradh case GL_UNSIGNED_BYTE: 30243464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint)); 30253464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint)); 30263464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint)); 30273464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); 30283464ebd5Sriastradh break; 30293464ebd5Sriastradh case GL_BYTE: 30303464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint); 30313464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint); 30323464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint); 30333464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint); 30343464ebd5Sriastradh break; 30353464ebd5Sriastradh case GL_UNSIGNED_SHORT: 30363464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); 30373464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint)); 30383464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint)); 30393464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); 30403464ebd5Sriastradh break; 30413464ebd5Sriastradh case GL_SHORT: 30423464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint); 30433464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint); 30443464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint); 30453464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint); 30463464ebd5Sriastradh break; 30473464ebd5Sriastradh case GL_UNSIGNED_INT: 30483464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); 30493464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint)); 30503464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint)); 30513464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); 30523464ebd5Sriastradh break; 30533464ebd5Sriastradh case GL_INT: 30543464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint); 30553464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint); 30563464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint); 30573464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint); 30583464ebd5Sriastradh break; 30593464ebd5Sriastradh case GL_FLOAT: 30603464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); 30613464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint); 30623464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint); 30633464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint); 30643464ebd5Sriastradh break; 30653464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 30663464ebd5Sriastradh PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint); 30673464ebd5Sriastradh PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint); 30683464ebd5Sriastradh PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint); 30693464ebd5Sriastradh PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint); 30703464ebd5Sriastradh break; 30713464ebd5Sriastradh case GL_UNSIGNED_BYTE_3_3_2: 30723464ebd5Sriastradh { 30733464ebd5Sriastradh const GLubyte *ubsrc = (const GLubyte *) src; 30743464ebd5Sriastradh GLuint i; 30753464ebd5Sriastradh for (i = 0; i < n; i ++) { 30763464ebd5Sriastradh GLubyte p = ubsrc[i]; 30773464ebd5Sriastradh rgba[i][rDst] = ((p >> 5) ); 30783464ebd5Sriastradh rgba[i][gDst] = ((p >> 2) & 0x7); 30793464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x3); 30803464ebd5Sriastradh rgba[i][aDst] = 1; 30813464ebd5Sriastradh } 30823464ebd5Sriastradh } 30833464ebd5Sriastradh break; 30843464ebd5Sriastradh case GL_UNSIGNED_BYTE_2_3_3_REV: 30853464ebd5Sriastradh { 30863464ebd5Sriastradh const GLubyte *ubsrc = (const GLubyte *) src; 30873464ebd5Sriastradh GLuint i; 30883464ebd5Sriastradh for (i = 0; i < n; i ++) { 30893464ebd5Sriastradh GLubyte p = ubsrc[i]; 30903464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x7); 30913464ebd5Sriastradh rgba[i][gDst] = ((p >> 3) & 0x7); 30923464ebd5Sriastradh rgba[i][bDst] = ((p >> 6) ); 30933464ebd5Sriastradh rgba[i][aDst] = 1; 30943464ebd5Sriastradh } 30953464ebd5Sriastradh } 30963464ebd5Sriastradh break; 30973464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5: 30983464ebd5Sriastradh if (swapBytes) { 30993464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31003464ebd5Sriastradh GLuint i; 31013464ebd5Sriastradh for (i = 0; i < n; i ++) { 31023464ebd5Sriastradh GLushort p = ussrc[i]; 31033464ebd5Sriastradh SWAP2BYTE(p); 31043464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ); 31053464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f); 31063464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x1f); 31073464ebd5Sriastradh rgba[i][aDst] = 1; 31083464ebd5Sriastradh } 31093464ebd5Sriastradh } 31103464ebd5Sriastradh else { 31113464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31123464ebd5Sriastradh GLuint i; 31133464ebd5Sriastradh for (i = 0; i < n; i ++) { 31143464ebd5Sriastradh GLushort p = ussrc[i]; 31153464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ); 31163464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f); 31173464ebd5Sriastradh rgba[i][bDst] = ((p ) & 0x1f); 31183464ebd5Sriastradh rgba[i][aDst] = 1; 31193464ebd5Sriastradh } 31203464ebd5Sriastradh } 31213464ebd5Sriastradh break; 31223464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_6_5_REV: 31233464ebd5Sriastradh if (swapBytes) { 31243464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31253464ebd5Sriastradh GLuint i; 31263464ebd5Sriastradh for (i = 0; i < n; i ++) { 31273464ebd5Sriastradh GLushort p = ussrc[i]; 31283464ebd5Sriastradh SWAP2BYTE(p); 31293464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f); 31303464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f); 31313464ebd5Sriastradh rgba[i][bDst] = ((p >> 11) ); 31323464ebd5Sriastradh rgba[i][aDst] = 1; 31333464ebd5Sriastradh } 31343464ebd5Sriastradh } 31353464ebd5Sriastradh else { 31363464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31373464ebd5Sriastradh GLuint i; 31383464ebd5Sriastradh for (i = 0; i < n; i ++) { 31393464ebd5Sriastradh GLushort p = ussrc[i]; 31403464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f); 31413464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x3f); 31423464ebd5Sriastradh rgba[i][bDst] = ((p >> 11) ); 31433464ebd5Sriastradh rgba[i][aDst] = 1; 31443464ebd5Sriastradh } 31453464ebd5Sriastradh } 31463464ebd5Sriastradh break; 31473464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4: 31483464ebd5Sriastradh if (swapBytes) { 31493464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31503464ebd5Sriastradh GLuint i; 31513464ebd5Sriastradh for (i = 0; i < n; i ++) { 31523464ebd5Sriastradh GLushort p = ussrc[i]; 31533464ebd5Sriastradh SWAP2BYTE(p); 31543464ebd5Sriastradh rgba[i][rDst] = ((p >> 12) ); 31553464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xf); 31563464ebd5Sriastradh rgba[i][bDst] = ((p >> 4) & 0xf); 31573464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xf); 31583464ebd5Sriastradh } 31593464ebd5Sriastradh } 31603464ebd5Sriastradh else { 31613464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31623464ebd5Sriastradh GLuint i; 31633464ebd5Sriastradh for (i = 0; i < n; i ++) { 31643464ebd5Sriastradh GLushort p = ussrc[i]; 31653464ebd5Sriastradh rgba[i][rDst] = ((p >> 12) ); 31663464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xf); 31673464ebd5Sriastradh rgba[i][bDst] = ((p >> 4) & 0xf); 31683464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xf); 31693464ebd5Sriastradh } 31703464ebd5Sriastradh } 31713464ebd5Sriastradh break; 31723464ebd5Sriastradh case GL_UNSIGNED_SHORT_4_4_4_4_REV: 31733464ebd5Sriastradh if (swapBytes) { 31743464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31753464ebd5Sriastradh GLuint i; 31763464ebd5Sriastradh for (i = 0; i < n; i ++) { 31773464ebd5Sriastradh GLushort p = ussrc[i]; 31783464ebd5Sriastradh SWAP2BYTE(p); 31793464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xf); 31803464ebd5Sriastradh rgba[i][gDst] = ((p >> 4) & 0xf); 31813464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xf); 31823464ebd5Sriastradh rgba[i][aDst] = ((p >> 12) ); 31833464ebd5Sriastradh } 31843464ebd5Sriastradh } 31853464ebd5Sriastradh else { 31863464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 31873464ebd5Sriastradh GLuint i; 31883464ebd5Sriastradh for (i = 0; i < n; i ++) { 31893464ebd5Sriastradh GLushort p = ussrc[i]; 31903464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xf); 31913464ebd5Sriastradh rgba[i][gDst] = ((p >> 4) & 0xf); 31923464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xf); 31933464ebd5Sriastradh rgba[i][aDst] = ((p >> 12) ); 31943464ebd5Sriastradh } 31953464ebd5Sriastradh } 31963464ebd5Sriastradh break; 31973464ebd5Sriastradh case GL_UNSIGNED_SHORT_5_5_5_1: 31983464ebd5Sriastradh if (swapBytes) { 31993464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 32003464ebd5Sriastradh GLuint i; 32013464ebd5Sriastradh for (i = 0; i < n; i ++) { 32023464ebd5Sriastradh GLushort p = ussrc[i]; 32033464ebd5Sriastradh SWAP2BYTE(p); 32043464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ); 32053464ebd5Sriastradh rgba[i][gDst] = ((p >> 6) & 0x1f); 32063464ebd5Sriastradh rgba[i][bDst] = ((p >> 1) & 0x1f); 32073464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x1 ); 32083464ebd5Sriastradh } 32093464ebd5Sriastradh } 32103464ebd5Sriastradh else { 32113464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 32123464ebd5Sriastradh GLuint i; 32133464ebd5Sriastradh for (i = 0; i < n; i ++) { 32143464ebd5Sriastradh GLushort p = ussrc[i]; 32153464ebd5Sriastradh rgba[i][rDst] = ((p >> 11) ); 32163464ebd5Sriastradh rgba[i][gDst] = ((p >> 6) & 0x1f); 32173464ebd5Sriastradh rgba[i][bDst] = ((p >> 1) & 0x1f); 32183464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x1 ); 32193464ebd5Sriastradh } 32203464ebd5Sriastradh } 32213464ebd5Sriastradh break; 32223464ebd5Sriastradh case GL_UNSIGNED_SHORT_1_5_5_5_REV: 32233464ebd5Sriastradh if (swapBytes) { 32243464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 32253464ebd5Sriastradh GLuint i; 32263464ebd5Sriastradh for (i = 0; i < n; i ++) { 32273464ebd5Sriastradh GLushort p = ussrc[i]; 32283464ebd5Sriastradh SWAP2BYTE(p); 32293464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f); 32303464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x1f); 32313464ebd5Sriastradh rgba[i][bDst] = ((p >> 10) & 0x1f); 32323464ebd5Sriastradh rgba[i][aDst] = ((p >> 15) ); 32333464ebd5Sriastradh } 32343464ebd5Sriastradh } 32353464ebd5Sriastradh else { 32363464ebd5Sriastradh const GLushort *ussrc = (const GLushort *) src; 32373464ebd5Sriastradh GLuint i; 32383464ebd5Sriastradh for (i = 0; i < n; i ++) { 32393464ebd5Sriastradh GLushort p = ussrc[i]; 32403464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x1f); 32413464ebd5Sriastradh rgba[i][gDst] = ((p >> 5) & 0x1f); 32423464ebd5Sriastradh rgba[i][bDst] = ((p >> 10) & 0x1f); 32433464ebd5Sriastradh rgba[i][aDst] = ((p >> 15) ); 32443464ebd5Sriastradh } 32453464ebd5Sriastradh } 32463464ebd5Sriastradh break; 32473464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8: 32483464ebd5Sriastradh if (swapBytes) { 32493464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 32503464ebd5Sriastradh GLuint i; 32513464ebd5Sriastradh for (i = 0; i < n; i ++) { 32523464ebd5Sriastradh GLuint p = uisrc[i]; 32533464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xff); 32543464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xff); 32553464ebd5Sriastradh rgba[i][bDst] = ((p >> 16) & 0xff); 32563464ebd5Sriastradh rgba[i][aDst] = ((p >> 24) ); 32573464ebd5Sriastradh } 32583464ebd5Sriastradh } 32593464ebd5Sriastradh else { 32603464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 32613464ebd5Sriastradh GLuint i; 32623464ebd5Sriastradh for (i = 0; i < n; i ++) { 32633464ebd5Sriastradh GLuint p = uisrc[i]; 32643464ebd5Sriastradh rgba[i][rDst] = ((p >> 24) ); 32653464ebd5Sriastradh rgba[i][gDst] = ((p >> 16) & 0xff); 32663464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xff); 32673464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xff); 32683464ebd5Sriastradh } 32693464ebd5Sriastradh } 32703464ebd5Sriastradh break; 32713464ebd5Sriastradh case GL_UNSIGNED_INT_8_8_8_8_REV: 32723464ebd5Sriastradh if (swapBytes) { 32733464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 32743464ebd5Sriastradh GLuint i; 32753464ebd5Sriastradh for (i = 0; i < n; i ++) { 32763464ebd5Sriastradh GLuint p = uisrc[i]; 32773464ebd5Sriastradh rgba[i][rDst] = ((p >> 24) ); 32783464ebd5Sriastradh rgba[i][gDst] = ((p >> 16) & 0xff); 32793464ebd5Sriastradh rgba[i][bDst] = ((p >> 8) & 0xff); 32803464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0xff); 32813464ebd5Sriastradh } 32823464ebd5Sriastradh } 32833464ebd5Sriastradh else { 32843464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 32853464ebd5Sriastradh GLuint i; 32863464ebd5Sriastradh for (i = 0; i < n; i ++) { 32873464ebd5Sriastradh GLuint p = uisrc[i]; 32883464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0xff); 32893464ebd5Sriastradh rgba[i][gDst] = ((p >> 8) & 0xff); 32903464ebd5Sriastradh rgba[i][bDst] = ((p >> 16) & 0xff); 32913464ebd5Sriastradh rgba[i][aDst] = ((p >> 24) ); 32923464ebd5Sriastradh } 32933464ebd5Sriastradh } 32943464ebd5Sriastradh break; 32953464ebd5Sriastradh case GL_UNSIGNED_INT_10_10_10_2: 32963464ebd5Sriastradh if (swapBytes) { 32973464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 32983464ebd5Sriastradh GLuint i; 32993464ebd5Sriastradh for (i = 0; i < n; i ++) { 33003464ebd5Sriastradh GLuint p = uisrc[i]; 33013464ebd5Sriastradh SWAP4BYTE(p); 33023464ebd5Sriastradh rgba[i][rDst] = ((p >> 22) ); 33033464ebd5Sriastradh rgba[i][gDst] = ((p >> 12) & 0x3ff); 33043464ebd5Sriastradh rgba[i][bDst] = ((p >> 2) & 0x3ff); 33053464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x3 ); 33063464ebd5Sriastradh } 33073464ebd5Sriastradh } 33083464ebd5Sriastradh else { 33093464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33103464ebd5Sriastradh GLuint i; 33113464ebd5Sriastradh for (i = 0; i < n; i ++) { 33123464ebd5Sriastradh GLuint p = uisrc[i]; 33133464ebd5Sriastradh rgba[i][rDst] = ((p >> 22) ); 33143464ebd5Sriastradh rgba[i][gDst] = ((p >> 12) & 0x3ff); 33153464ebd5Sriastradh rgba[i][bDst] = ((p >> 2) & 0x3ff); 33163464ebd5Sriastradh rgba[i][aDst] = ((p ) & 0x3 ); 33173464ebd5Sriastradh } 33183464ebd5Sriastradh } 33193464ebd5Sriastradh break; 33203464ebd5Sriastradh case GL_UNSIGNED_INT_2_10_10_10_REV: 33213464ebd5Sriastradh if (swapBytes) { 33223464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33233464ebd5Sriastradh GLuint i; 33243464ebd5Sriastradh for (i = 0; i < n; i ++) { 33253464ebd5Sriastradh GLuint p = uisrc[i]; 33263464ebd5Sriastradh SWAP4BYTE(p); 33273464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x3ff); 33283464ebd5Sriastradh rgba[i][gDst] = ((p >> 10) & 0x3ff); 33293464ebd5Sriastradh rgba[i][bDst] = ((p >> 20) & 0x3ff); 33303464ebd5Sriastradh rgba[i][aDst] = ((p >> 30) ); 33313464ebd5Sriastradh } 33323464ebd5Sriastradh } 33333464ebd5Sriastradh else { 33343464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33353464ebd5Sriastradh GLuint i; 33363464ebd5Sriastradh for (i = 0; i < n; i ++) { 33373464ebd5Sriastradh GLuint p = uisrc[i]; 33383464ebd5Sriastradh rgba[i][rDst] = ((p ) & 0x3ff); 33393464ebd5Sriastradh rgba[i][gDst] = ((p >> 10) & 0x3ff); 33403464ebd5Sriastradh rgba[i][bDst] = ((p >> 20) & 0x3ff); 33413464ebd5Sriastradh rgba[i][aDst] = ((p >> 30) ); 33423464ebd5Sriastradh } 33433464ebd5Sriastradh } 33443464ebd5Sriastradh break; 33453464ebd5Sriastradh case GL_UNSIGNED_INT_5_9_9_9_REV: 33463464ebd5Sriastradh if (swapBytes) { 33473464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33483464ebd5Sriastradh GLuint i; 33493464ebd5Sriastradh float f[3]; 33503464ebd5Sriastradh for (i = 0; i < n; i ++) { 33513464ebd5Sriastradh GLuint p = uisrc[i]; 33523464ebd5Sriastradh SWAP4BYTE(p); 33533464ebd5Sriastradh rgb9e5_to_float3(p, f); 33543464ebd5Sriastradh rgba[i][rDst] = clamp_float_to_uint(f[0]); 33553464ebd5Sriastradh rgba[i][gDst] = clamp_float_to_uint(f[1]); 33563464ebd5Sriastradh rgba[i][bDst] = clamp_float_to_uint(f[2]); 33573464ebd5Sriastradh rgba[i][aDst] = 1; 33583464ebd5Sriastradh } 33593464ebd5Sriastradh } 33603464ebd5Sriastradh else { 33613464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33623464ebd5Sriastradh GLuint i; 33633464ebd5Sriastradh float f[3]; 33643464ebd5Sriastradh for (i = 0; i < n; i ++) { 33653464ebd5Sriastradh GLuint p = uisrc[i]; 33663464ebd5Sriastradh rgb9e5_to_float3(p, f); 33673464ebd5Sriastradh rgba[i][rDst] = clamp_float_to_uint(f[0]); 33683464ebd5Sriastradh rgba[i][gDst] = clamp_float_to_uint(f[1]); 33693464ebd5Sriastradh rgba[i][bDst] = clamp_float_to_uint(f[2]); 33703464ebd5Sriastradh rgba[i][aDst] = 1; 33713464ebd5Sriastradh } 33723464ebd5Sriastradh } 33733464ebd5Sriastradh break; 33743464ebd5Sriastradh case GL_UNSIGNED_INT_10F_11F_11F_REV: 33753464ebd5Sriastradh if (swapBytes) { 33763464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33773464ebd5Sriastradh GLuint i; 33783464ebd5Sriastradh float f[3]; 33793464ebd5Sriastradh for (i = 0; i < n; i ++) { 33803464ebd5Sriastradh GLuint p = uisrc[i]; 33813464ebd5Sriastradh SWAP4BYTE(p); 33823464ebd5Sriastradh r11g11b10f_to_float3(p, f); 33833464ebd5Sriastradh rgba[i][rDst] = clamp_float_to_uint(f[0]); 33843464ebd5Sriastradh rgba[i][gDst] = clamp_float_to_uint(f[1]); 33853464ebd5Sriastradh rgba[i][bDst] = clamp_float_to_uint(f[2]); 33863464ebd5Sriastradh rgba[i][aDst] = 1; 33873464ebd5Sriastradh } 33883464ebd5Sriastradh } 33893464ebd5Sriastradh else { 33903464ebd5Sriastradh const GLuint *uisrc = (const GLuint *) src; 33913464ebd5Sriastradh GLuint i; 33923464ebd5Sriastradh float f[3]; 33933464ebd5Sriastradh for (i = 0; i < n; i ++) { 33943464ebd5Sriastradh GLuint p = uisrc[i]; 33953464ebd5Sriastradh r11g11b10f_to_float3(p, f); 33963464ebd5Sriastradh rgba[i][rDst] = clamp_float_to_uint(f[0]); 33973464ebd5Sriastradh rgba[i][gDst] = clamp_float_to_uint(f[1]); 33983464ebd5Sriastradh rgba[i][bDst] = clamp_float_to_uint(f[2]); 33993464ebd5Sriastradh rgba[i][aDst] = 1; 34003464ebd5Sriastradh } 34013464ebd5Sriastradh } 34023464ebd5Sriastradh break; 34033464ebd5Sriastradh default: 34043464ebd5Sriastradh _mesa_problem(NULL, "bad srcType in extract uint data"); 34053464ebd5Sriastradh break; 34063464ebd5Sriastradh } 34073464ebd5Sriastradh#undef PROCESS 34083464ebd5Sriastradh} 34093464ebd5Sriastradh 34103464ebd5Sriastradh 34113464ebd5Sriastradh 34123464ebd5Sriastradh/* 34133464ebd5Sriastradh * Unpack a row of color image data from a client buffer according to 34143464ebd5Sriastradh * the pixel unpacking parameters. 34153464ebd5Sriastradh * Return GLchan values in the specified dest image format. 34163464ebd5Sriastradh * This is used by glDrawPixels and glTexImage?D(). 34173464ebd5Sriastradh * \param ctx - the context 34183464ebd5Sriastradh * n - number of pixels in the span 34193464ebd5Sriastradh * dstFormat - format of destination color array 34203464ebd5Sriastradh * dest - the destination color array 34213464ebd5Sriastradh * srcFormat - source image format 34223464ebd5Sriastradh * srcType - source image data type 34233464ebd5Sriastradh * source - source image pointer 34243464ebd5Sriastradh * srcPacking - pixel unpacking parameters 34253464ebd5Sriastradh * transferOps - bitmask of IMAGE_*_BIT values of operations to apply 34263464ebd5Sriastradh * 34273464ebd5Sriastradh * XXX perhaps expand this to process whole images someday. 34283464ebd5Sriastradh */ 34293464ebd5Sriastradhvoid 34303464ebd5Sriastradh_mesa_unpack_color_span_chan( struct gl_context *ctx, 34313464ebd5Sriastradh GLuint n, GLenum dstFormat, GLchan dest[], 34323464ebd5Sriastradh GLenum srcFormat, GLenum srcType, 34333464ebd5Sriastradh const GLvoid *source, 34343464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking, 34353464ebd5Sriastradh GLbitfield transferOps ) 34363464ebd5Sriastradh{ 34373464ebd5Sriastradh ASSERT(dstFormat == GL_ALPHA || 34383464ebd5Sriastradh dstFormat == GL_LUMINANCE || 34393464ebd5Sriastradh dstFormat == GL_LUMINANCE_ALPHA || 34403464ebd5Sriastradh dstFormat == GL_INTENSITY || 34413464ebd5Sriastradh dstFormat == GL_RED || 34423464ebd5Sriastradh dstFormat == GL_RG || 34433464ebd5Sriastradh dstFormat == GL_RGB || 34443464ebd5Sriastradh dstFormat == GL_RGBA || 34453464ebd5Sriastradh dstFormat == GL_COLOR_INDEX); 34463464ebd5Sriastradh 34473464ebd5Sriastradh ASSERT(srcFormat == GL_RED || 34483464ebd5Sriastradh srcFormat == GL_GREEN || 34493464ebd5Sriastradh srcFormat == GL_BLUE || 34503464ebd5Sriastradh srcFormat == GL_ALPHA || 34513464ebd5Sriastradh srcFormat == GL_LUMINANCE || 34523464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA || 34533464ebd5Sriastradh srcFormat == GL_INTENSITY || 34543464ebd5Sriastradh srcFormat == GL_RG || 34553464ebd5Sriastradh srcFormat == GL_RGB || 34563464ebd5Sriastradh srcFormat == GL_BGR || 34573464ebd5Sriastradh srcFormat == GL_RGBA || 34583464ebd5Sriastradh srcFormat == GL_BGRA || 34593464ebd5Sriastradh srcFormat == GL_ABGR_EXT || 34603464ebd5Sriastradh srcFormat == GL_COLOR_INDEX); 34613464ebd5Sriastradh 34623464ebd5Sriastradh ASSERT(srcType == GL_BITMAP || 34633464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE || 34643464ebd5Sriastradh srcType == GL_BYTE || 34653464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 34663464ebd5Sriastradh srcType == GL_SHORT || 34673464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 34683464ebd5Sriastradh srcType == GL_INT || 34693464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 34703464ebd5Sriastradh srcType == GL_FLOAT || 34713464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_3_3_2 || 34723464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 34733464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5 || 34743464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 34753464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 34763464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 34773464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 34783464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 34793464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8 || 34803464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 34813464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10_10_10_2 || 34823464ebd5Sriastradh srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 34833464ebd5Sriastradh srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 34843464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 34853464ebd5Sriastradh 34863464ebd5Sriastradh /* Try simple cases first */ 34873464ebd5Sriastradh if (transferOps == 0) { 34883464ebd5Sriastradh if (srcType == CHAN_TYPE) { 34893464ebd5Sriastradh if (dstFormat == GL_RGBA) { 34903464ebd5Sriastradh if (srcFormat == GL_RGBA) { 34913464ebd5Sriastradh memcpy( dest, source, n * 4 * sizeof(GLchan) ); 34923464ebd5Sriastradh return; 34933464ebd5Sriastradh } 34943464ebd5Sriastradh else if (srcFormat == GL_RGB) { 34953464ebd5Sriastradh GLuint i; 34963464ebd5Sriastradh const GLchan *src = (const GLchan *) source; 34973464ebd5Sriastradh GLchan *dst = dest; 34983464ebd5Sriastradh for (i = 0; i < n; i++) { 34993464ebd5Sriastradh dst[0] = src[0]; 35003464ebd5Sriastradh dst[1] = src[1]; 35013464ebd5Sriastradh dst[2] = src[2]; 35023464ebd5Sriastradh dst[3] = CHAN_MAX; 35033464ebd5Sriastradh src += 3; 35043464ebd5Sriastradh dst += 4; 35053464ebd5Sriastradh } 35063464ebd5Sriastradh return; 35073464ebd5Sriastradh } 35083464ebd5Sriastradh } 35093464ebd5Sriastradh else if (dstFormat == GL_RGB) { 35103464ebd5Sriastradh if (srcFormat == GL_RGB) { 35113464ebd5Sriastradh memcpy( dest, source, n * 3 * sizeof(GLchan) ); 35123464ebd5Sriastradh return; 35133464ebd5Sriastradh } 35143464ebd5Sriastradh else if (srcFormat == GL_RGBA) { 35153464ebd5Sriastradh GLuint i; 35163464ebd5Sriastradh const GLchan *src = (const GLchan *) source; 35173464ebd5Sriastradh GLchan *dst = dest; 35183464ebd5Sriastradh for (i = 0; i < n; i++) { 35193464ebd5Sriastradh dst[0] = src[0]; 35203464ebd5Sriastradh dst[1] = src[1]; 35213464ebd5Sriastradh dst[2] = src[2]; 35223464ebd5Sriastradh src += 4; 35233464ebd5Sriastradh dst += 3; 35243464ebd5Sriastradh } 35253464ebd5Sriastradh return; 35263464ebd5Sriastradh } 35273464ebd5Sriastradh } 35283464ebd5Sriastradh else if (dstFormat == srcFormat) { 35293464ebd5Sriastradh GLint comps = _mesa_components_in_format(srcFormat); 35303464ebd5Sriastradh assert(comps > 0); 35313464ebd5Sriastradh memcpy( dest, source, n * comps * sizeof(GLchan) ); 35323464ebd5Sriastradh return; 35333464ebd5Sriastradh } 35343464ebd5Sriastradh } 35353464ebd5Sriastradh /* 35363464ebd5Sriastradh * Common situation, loading 8bit RGBA/RGB source images 35373464ebd5Sriastradh * into 16/32 bit destination. (OSMesa16/32) 35383464ebd5Sriastradh */ 35393464ebd5Sriastradh else if (srcType == GL_UNSIGNED_BYTE) { 35403464ebd5Sriastradh if (dstFormat == GL_RGBA) { 35413464ebd5Sriastradh if (srcFormat == GL_RGB) { 35423464ebd5Sriastradh GLuint i; 35433464ebd5Sriastradh const GLubyte *src = (const GLubyte *) source; 35443464ebd5Sriastradh GLchan *dst = dest; 35453464ebd5Sriastradh for (i = 0; i < n; i++) { 35463464ebd5Sriastradh dst[0] = UBYTE_TO_CHAN(src[0]); 35473464ebd5Sriastradh dst[1] = UBYTE_TO_CHAN(src[1]); 35483464ebd5Sriastradh dst[2] = UBYTE_TO_CHAN(src[2]); 35493464ebd5Sriastradh dst[3] = CHAN_MAX; 35503464ebd5Sriastradh src += 3; 35513464ebd5Sriastradh dst += 4; 35523464ebd5Sriastradh } 35533464ebd5Sriastradh return; 35543464ebd5Sriastradh } 35553464ebd5Sriastradh else if (srcFormat == GL_RGBA) { 35563464ebd5Sriastradh GLuint i; 35573464ebd5Sriastradh const GLubyte *src = (const GLubyte *) source; 35583464ebd5Sriastradh GLchan *dst = dest; 35593464ebd5Sriastradh for (i = 0; i < n; i++) { 35603464ebd5Sriastradh dst[0] = UBYTE_TO_CHAN(src[0]); 35613464ebd5Sriastradh dst[1] = UBYTE_TO_CHAN(src[1]); 35623464ebd5Sriastradh dst[2] = UBYTE_TO_CHAN(src[2]); 35633464ebd5Sriastradh dst[3] = UBYTE_TO_CHAN(src[3]); 35643464ebd5Sriastradh src += 4; 35653464ebd5Sriastradh dst += 4; 35663464ebd5Sriastradh } 35673464ebd5Sriastradh return; 35683464ebd5Sriastradh } 35693464ebd5Sriastradh } 35703464ebd5Sriastradh else if (dstFormat == GL_RGB) { 35713464ebd5Sriastradh if (srcFormat == GL_RGB) { 35723464ebd5Sriastradh GLuint i; 35733464ebd5Sriastradh const GLubyte *src = (const GLubyte *) source; 35743464ebd5Sriastradh GLchan *dst = dest; 35753464ebd5Sriastradh for (i = 0; i < n; i++) { 35763464ebd5Sriastradh dst[0] = UBYTE_TO_CHAN(src[0]); 35773464ebd5Sriastradh dst[1] = UBYTE_TO_CHAN(src[1]); 35783464ebd5Sriastradh dst[2] = UBYTE_TO_CHAN(src[2]); 35793464ebd5Sriastradh src += 3; 35803464ebd5Sriastradh dst += 3; 35813464ebd5Sriastradh } 35823464ebd5Sriastradh return; 35833464ebd5Sriastradh } 35843464ebd5Sriastradh else if (srcFormat == GL_RGBA) { 35853464ebd5Sriastradh GLuint i; 35863464ebd5Sriastradh const GLubyte *src = (const GLubyte *) source; 35873464ebd5Sriastradh GLchan *dst = dest; 35883464ebd5Sriastradh for (i = 0; i < n; i++) { 35893464ebd5Sriastradh dst[0] = UBYTE_TO_CHAN(src[0]); 35903464ebd5Sriastradh dst[1] = UBYTE_TO_CHAN(src[1]); 35913464ebd5Sriastradh dst[2] = UBYTE_TO_CHAN(src[2]); 35923464ebd5Sriastradh src += 4; 35933464ebd5Sriastradh dst += 3; 35943464ebd5Sriastradh } 35953464ebd5Sriastradh return; 35963464ebd5Sriastradh } 35973464ebd5Sriastradh } 35983464ebd5Sriastradh } 35993464ebd5Sriastradh } 36003464ebd5Sriastradh 36013464ebd5Sriastradh 36023464ebd5Sriastradh /* general solution begins here */ 36033464ebd5Sriastradh { 36043464ebd5Sriastradh GLint dstComponents; 36053464ebd5Sriastradh GLint rDst, gDst, bDst, aDst, lDst, iDst; 36063464ebd5Sriastradh GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 36073464ebd5Sriastradh 36083464ebd5Sriastradh if (!rgba) { 36093464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 36103464ebd5Sriastradh return; 36113464ebd5Sriastradh } 36123464ebd5Sriastradh 36133464ebd5Sriastradh dstComponents = _mesa_components_in_format( dstFormat ); 36143464ebd5Sriastradh /* source & dest image formats should have been error checked by now */ 36153464ebd5Sriastradh assert(dstComponents > 0); 36163464ebd5Sriastradh 36173464ebd5Sriastradh /* 36183464ebd5Sriastradh * Extract image data and convert to RGBA floats 36193464ebd5Sriastradh */ 36203464ebd5Sriastradh if (srcFormat == GL_COLOR_INDEX) { 36213464ebd5Sriastradh GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 36223464ebd5Sriastradh 36233464ebd5Sriastradh if (!indexes) { 36243464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 36253464ebd5Sriastradh return; 36263464ebd5Sriastradh } 36273464ebd5Sriastradh 36283464ebd5Sriastradh extract_uint_indexes(n, indexes, srcFormat, srcType, source, 36293464ebd5Sriastradh srcPacking); 36303464ebd5Sriastradh 36313464ebd5Sriastradh if (dstFormat == GL_COLOR_INDEX) { 36323464ebd5Sriastradh GLuint i; 36333464ebd5Sriastradh _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 36343464ebd5Sriastradh /* convert to GLchan and return */ 36353464ebd5Sriastradh for (i = 0; i < n; i++) { 36363464ebd5Sriastradh dest[i] = (GLchan) (indexes[i] & 0xff); 36373464ebd5Sriastradh } 36383464ebd5Sriastradh free(indexes); 36393464ebd5Sriastradh free(rgba); 36403464ebd5Sriastradh return; 36413464ebd5Sriastradh } 36423464ebd5Sriastradh else { 36433464ebd5Sriastradh /* Convert indexes to RGBA */ 36443464ebd5Sriastradh if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 36453464ebd5Sriastradh _mesa_shift_and_offset_ci(ctx, n, indexes); 36463464ebd5Sriastradh } 36473464ebd5Sriastradh _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 36483464ebd5Sriastradh } 36493464ebd5Sriastradh 36503464ebd5Sriastradh /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 36513464ebd5Sriastradh * with color indexes. 36523464ebd5Sriastradh */ 36533464ebd5Sriastradh transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 36543464ebd5Sriastradh 36553464ebd5Sriastradh free(indexes); 36563464ebd5Sriastradh } 36573464ebd5Sriastradh else { 36583464ebd5Sriastradh /* non-color index data */ 36593464ebd5Sriastradh extract_float_rgba(n, rgba, srcFormat, srcType, source, 36603464ebd5Sriastradh srcPacking->SwapBytes); 36613464ebd5Sriastradh } 36623464ebd5Sriastradh 36633464ebd5Sriastradh /* Need to clamp if returning GLubytes or GLushorts */ 36643464ebd5Sriastradh#if CHAN_TYPE != GL_FLOAT 36653464ebd5Sriastradh transferOps |= IMAGE_CLAMP_BIT; 36663464ebd5Sriastradh#endif 36673464ebd5Sriastradh 36683464ebd5Sriastradh if (transferOps) { 36693464ebd5Sriastradh _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 36703464ebd5Sriastradh } 36713464ebd5Sriastradh 36723464ebd5Sriastradh get_component_indexes(dstFormat, 36733464ebd5Sriastradh &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 36743464ebd5Sriastradh 36753464ebd5Sriastradh /* Now return the GLchan data in the requested dstFormat */ 36763464ebd5Sriastradh if (rDst >= 0) { 36773464ebd5Sriastradh GLchan *dst = dest; 36783464ebd5Sriastradh GLuint i; 36793464ebd5Sriastradh for (i = 0; i < n; i++) { 36803464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[rDst], rgba[i][RCOMP]); 36813464ebd5Sriastradh dst += dstComponents; 36823464ebd5Sriastradh } 36833464ebd5Sriastradh } 36843464ebd5Sriastradh 36853464ebd5Sriastradh if (gDst >= 0) { 36863464ebd5Sriastradh GLchan *dst = dest; 36873464ebd5Sriastradh GLuint i; 36883464ebd5Sriastradh for (i = 0; i < n; i++) { 36893464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[gDst], rgba[i][GCOMP]); 36903464ebd5Sriastradh dst += dstComponents; 36913464ebd5Sriastradh } 36923464ebd5Sriastradh } 36933464ebd5Sriastradh 36943464ebd5Sriastradh if (bDst >= 0) { 36953464ebd5Sriastradh GLchan *dst = dest; 36963464ebd5Sriastradh GLuint i; 36973464ebd5Sriastradh for (i = 0; i < n; i++) { 36983464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[bDst], rgba[i][BCOMP]); 36993464ebd5Sriastradh dst += dstComponents; 37003464ebd5Sriastradh } 37013464ebd5Sriastradh } 37023464ebd5Sriastradh 37033464ebd5Sriastradh if (aDst >= 0) { 37043464ebd5Sriastradh GLchan *dst = dest; 37053464ebd5Sriastradh GLuint i; 37063464ebd5Sriastradh for (i = 0; i < n; i++) { 37073464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[aDst], rgba[i][ACOMP]); 37083464ebd5Sriastradh dst += dstComponents; 37093464ebd5Sriastradh } 37103464ebd5Sriastradh } 37113464ebd5Sriastradh 37123464ebd5Sriastradh if (iDst >= 0) { 37133464ebd5Sriastradh GLchan *dst = dest; 37143464ebd5Sriastradh GLuint i; 37153464ebd5Sriastradh assert(iDst == 0); 37163464ebd5Sriastradh assert(dstComponents == 1); 37173464ebd5Sriastradh for (i = 0; i < n; i++) { 37183464ebd5Sriastradh /* Intensity comes from red channel */ 37193464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]); 37203464ebd5Sriastradh } 37213464ebd5Sriastradh } 37223464ebd5Sriastradh 37233464ebd5Sriastradh if (lDst >= 0) { 37243464ebd5Sriastradh GLchan *dst = dest; 37253464ebd5Sriastradh GLuint i; 37263464ebd5Sriastradh assert(lDst == 0); 37273464ebd5Sriastradh for (i = 0; i < n; i++) { 37283464ebd5Sriastradh /* Luminance comes from red channel */ 37293464ebd5Sriastradh CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]); 37303464ebd5Sriastradh dst += dstComponents; 37313464ebd5Sriastradh } 37323464ebd5Sriastradh } 37333464ebd5Sriastradh 37343464ebd5Sriastradh free(rgba); 37353464ebd5Sriastradh } 37363464ebd5Sriastradh} 37373464ebd5Sriastradh 37383464ebd5Sriastradh 37393464ebd5Sriastradh/** 37403464ebd5Sriastradh * Same as _mesa_unpack_color_span_chan(), but return GLfloat data 37413464ebd5Sriastradh * instead of GLchan. 37423464ebd5Sriastradh */ 37433464ebd5Sriastradhvoid 37443464ebd5Sriastradh_mesa_unpack_color_span_float( struct gl_context *ctx, 37453464ebd5Sriastradh GLuint n, GLenum dstFormat, GLfloat dest[], 37463464ebd5Sriastradh GLenum srcFormat, GLenum srcType, 37473464ebd5Sriastradh const GLvoid *source, 37483464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking, 37493464ebd5Sriastradh GLbitfield transferOps ) 37503464ebd5Sriastradh{ 37513464ebd5Sriastradh ASSERT(dstFormat == GL_ALPHA || 37523464ebd5Sriastradh dstFormat == GL_LUMINANCE || 37533464ebd5Sriastradh dstFormat == GL_LUMINANCE_ALPHA || 37543464ebd5Sriastradh dstFormat == GL_INTENSITY || 37553464ebd5Sriastradh dstFormat == GL_RED || 37563464ebd5Sriastradh dstFormat == GL_RG || 37573464ebd5Sriastradh dstFormat == GL_RGB || 37583464ebd5Sriastradh dstFormat == GL_RGBA || 37593464ebd5Sriastradh dstFormat == GL_COLOR_INDEX); 37603464ebd5Sriastradh 37613464ebd5Sriastradh ASSERT(srcFormat == GL_RED || 37623464ebd5Sriastradh srcFormat == GL_GREEN || 37633464ebd5Sriastradh srcFormat == GL_BLUE || 37643464ebd5Sriastradh srcFormat == GL_ALPHA || 37653464ebd5Sriastradh srcFormat == GL_LUMINANCE || 37663464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA || 37673464ebd5Sriastradh srcFormat == GL_INTENSITY || 37683464ebd5Sriastradh srcFormat == GL_RG || 37693464ebd5Sriastradh srcFormat == GL_RGB || 37703464ebd5Sriastradh srcFormat == GL_BGR || 37713464ebd5Sriastradh srcFormat == GL_RGBA || 37723464ebd5Sriastradh srcFormat == GL_BGRA || 37733464ebd5Sriastradh srcFormat == GL_ABGR_EXT || 37743464ebd5Sriastradh srcFormat == GL_RED_INTEGER_EXT || 37753464ebd5Sriastradh srcFormat == GL_GREEN_INTEGER_EXT || 37763464ebd5Sriastradh srcFormat == GL_BLUE_INTEGER_EXT || 37773464ebd5Sriastradh srcFormat == GL_ALPHA_INTEGER_EXT || 37783464ebd5Sriastradh srcFormat == GL_RGB_INTEGER_EXT || 37793464ebd5Sriastradh srcFormat == GL_RGBA_INTEGER_EXT || 37803464ebd5Sriastradh srcFormat == GL_BGR_INTEGER_EXT || 37813464ebd5Sriastradh srcFormat == GL_BGRA_INTEGER_EXT || 37823464ebd5Sriastradh srcFormat == GL_LUMINANCE_INTEGER_EXT || 37833464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT || 37843464ebd5Sriastradh srcFormat == GL_COLOR_INDEX); 37853464ebd5Sriastradh 37863464ebd5Sriastradh ASSERT(srcType == GL_BITMAP || 37873464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE || 37883464ebd5Sriastradh srcType == GL_BYTE || 37893464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 37903464ebd5Sriastradh srcType == GL_SHORT || 37913464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 37923464ebd5Sriastradh srcType == GL_INT || 37933464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 37943464ebd5Sriastradh srcType == GL_FLOAT || 37953464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_3_3_2 || 37963464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 37973464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5 || 37983464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 37993464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 38003464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 38013464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 38023464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 38033464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8 || 38043464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 38053464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10_10_10_2 || 38063464ebd5Sriastradh srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 38073464ebd5Sriastradh srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 38083464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 38093464ebd5Sriastradh 38103464ebd5Sriastradh /* general solution, no special cases, yet */ 38113464ebd5Sriastradh { 38123464ebd5Sriastradh GLint dstComponents; 38133464ebd5Sriastradh GLint rDst, gDst, bDst, aDst, lDst, iDst; 38143464ebd5Sriastradh GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 38153464ebd5Sriastradh 38163464ebd5Sriastradh if (!rgba) { 38173464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 38183464ebd5Sriastradh return; 38193464ebd5Sriastradh } 38203464ebd5Sriastradh 38213464ebd5Sriastradh dstComponents = _mesa_components_in_format( dstFormat ); 38223464ebd5Sriastradh /* source & dest image formats should have been error checked by now */ 38233464ebd5Sriastradh assert(dstComponents > 0); 38243464ebd5Sriastradh 38253464ebd5Sriastradh /* 38263464ebd5Sriastradh * Extract image data and convert to RGBA floats 38273464ebd5Sriastradh */ 38283464ebd5Sriastradh if (srcFormat == GL_COLOR_INDEX) { 38293464ebd5Sriastradh GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 38303464ebd5Sriastradh 38313464ebd5Sriastradh if (!indexes) { 38323464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 38333464ebd5Sriastradh free(rgba); 38343464ebd5Sriastradh return; 38353464ebd5Sriastradh } 38363464ebd5Sriastradh 38373464ebd5Sriastradh extract_uint_indexes(n, indexes, srcFormat, srcType, source, 38383464ebd5Sriastradh srcPacking); 38393464ebd5Sriastradh 38403464ebd5Sriastradh if (dstFormat == GL_COLOR_INDEX) { 38413464ebd5Sriastradh GLuint i; 38423464ebd5Sriastradh _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 38433464ebd5Sriastradh /* convert to GLchan and return */ 38443464ebd5Sriastradh for (i = 0; i < n; i++) { 38453464ebd5Sriastradh dest[i] = (GLchan) (indexes[i] & 0xff); 38463464ebd5Sriastradh } 38473464ebd5Sriastradh free(indexes); 38483464ebd5Sriastradh free(rgba); 38493464ebd5Sriastradh return; 38503464ebd5Sriastradh } 38513464ebd5Sriastradh else { 38523464ebd5Sriastradh /* Convert indexes to RGBA */ 38533464ebd5Sriastradh if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 38543464ebd5Sriastradh _mesa_shift_and_offset_ci(ctx, n, indexes); 38553464ebd5Sriastradh } 38563464ebd5Sriastradh _mesa_map_ci_to_rgba(ctx, n, indexes, rgba); 38573464ebd5Sriastradh } 38583464ebd5Sriastradh 38593464ebd5Sriastradh /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting 38603464ebd5Sriastradh * with color indexes. 38613464ebd5Sriastradh */ 38623464ebd5Sriastradh transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT); 38633464ebd5Sriastradh 38643464ebd5Sriastradh free(indexes); 38653464ebd5Sriastradh } 38663464ebd5Sriastradh else { 38673464ebd5Sriastradh /* non-color index data */ 38683464ebd5Sriastradh extract_float_rgba(n, rgba, srcFormat, srcType, source, 38693464ebd5Sriastradh srcPacking->SwapBytes); 38703464ebd5Sriastradh } 38713464ebd5Sriastradh 38723464ebd5Sriastradh if (transferOps) { 38733464ebd5Sriastradh _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); 38743464ebd5Sriastradh } 38753464ebd5Sriastradh 38763464ebd5Sriastradh get_component_indexes(dstFormat, 38773464ebd5Sriastradh &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 38783464ebd5Sriastradh 38793464ebd5Sriastradh /* Now pack results in the requested dstFormat */ 38803464ebd5Sriastradh if (rDst >= 0) { 38813464ebd5Sriastradh GLfloat *dst = dest; 38823464ebd5Sriastradh GLuint i; 38833464ebd5Sriastradh for (i = 0; i < n; i++) { 38843464ebd5Sriastradh dst[rDst] = rgba[i][RCOMP]; 38853464ebd5Sriastradh dst += dstComponents; 38863464ebd5Sriastradh } 38873464ebd5Sriastradh } 38883464ebd5Sriastradh 38893464ebd5Sriastradh if (gDst >= 0) { 38903464ebd5Sriastradh GLfloat *dst = dest; 38913464ebd5Sriastradh GLuint i; 38923464ebd5Sriastradh for (i = 0; i < n; i++) { 38933464ebd5Sriastradh dst[gDst] = rgba[i][GCOMP]; 38943464ebd5Sriastradh dst += dstComponents; 38953464ebd5Sriastradh } 38963464ebd5Sriastradh } 38973464ebd5Sriastradh 38983464ebd5Sriastradh if (bDst >= 0) { 38993464ebd5Sriastradh GLfloat *dst = dest; 39003464ebd5Sriastradh GLuint i; 39013464ebd5Sriastradh for (i = 0; i < n; i++) { 39023464ebd5Sriastradh dst[bDst] = rgba[i][BCOMP]; 39033464ebd5Sriastradh dst += dstComponents; 39043464ebd5Sriastradh } 39053464ebd5Sriastradh } 39063464ebd5Sriastradh 39073464ebd5Sriastradh if (aDst >= 0) { 39083464ebd5Sriastradh GLfloat *dst = dest; 39093464ebd5Sriastradh GLuint i; 39103464ebd5Sriastradh for (i = 0; i < n; i++) { 39113464ebd5Sriastradh dst[aDst] = rgba[i][ACOMP]; 39123464ebd5Sriastradh dst += dstComponents; 39133464ebd5Sriastradh } 39143464ebd5Sriastradh } 39153464ebd5Sriastradh 39163464ebd5Sriastradh if (iDst >= 0) { 39173464ebd5Sriastradh GLfloat *dst = dest; 39183464ebd5Sriastradh GLuint i; 39193464ebd5Sriastradh assert(iDst == 0); 39203464ebd5Sriastradh assert(dstComponents == 1); 39213464ebd5Sriastradh for (i = 0; i < n; i++) { 39223464ebd5Sriastradh /* Intensity comes from red channel */ 39233464ebd5Sriastradh dst[i] = rgba[i][RCOMP]; 39243464ebd5Sriastradh } 39253464ebd5Sriastradh } 39263464ebd5Sriastradh 39273464ebd5Sriastradh if (lDst >= 0) { 39283464ebd5Sriastradh GLfloat *dst = dest; 39293464ebd5Sriastradh GLuint i; 39303464ebd5Sriastradh assert(lDst == 0); 39313464ebd5Sriastradh for (i = 0; i < n; i++) { 39323464ebd5Sriastradh /* Luminance comes from red channel */ 39333464ebd5Sriastradh dst[0] = rgba[i][RCOMP]; 39343464ebd5Sriastradh dst += dstComponents; 39353464ebd5Sriastradh } 39363464ebd5Sriastradh } 39373464ebd5Sriastradh 39383464ebd5Sriastradh free(rgba); 39393464ebd5Sriastradh } 39403464ebd5Sriastradh} 39413464ebd5Sriastradh 39423464ebd5Sriastradh 39433464ebd5Sriastradh/** 39443464ebd5Sriastradh * Same as _mesa_unpack_color_span_chan(), but return GLuint data 39453464ebd5Sriastradh * instead of GLchan. 39463464ebd5Sriastradh * No pixel transfer ops are applied. 39473464ebd5Sriastradh */ 39483464ebd5Sriastradhvoid 39493464ebd5Sriastradh_mesa_unpack_color_span_uint(struct gl_context *ctx, 39503464ebd5Sriastradh GLuint n, GLenum dstFormat, GLuint *dest, 39513464ebd5Sriastradh GLenum srcFormat, GLenum srcType, 39523464ebd5Sriastradh const GLvoid *source, 39533464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking) 39543464ebd5Sriastradh{ 39553464ebd5Sriastradh GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat)); 39563464ebd5Sriastradh 39573464ebd5Sriastradh if (!rgba) { 39583464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 39593464ebd5Sriastradh return; 39603464ebd5Sriastradh } 39613464ebd5Sriastradh 39623464ebd5Sriastradh ASSERT(dstFormat == GL_ALPHA || 39633464ebd5Sriastradh dstFormat == GL_LUMINANCE || 39643464ebd5Sriastradh dstFormat == GL_LUMINANCE_ALPHA || 39653464ebd5Sriastradh dstFormat == GL_INTENSITY || 39663464ebd5Sriastradh dstFormat == GL_RED || 39673464ebd5Sriastradh dstFormat == GL_RG || 39683464ebd5Sriastradh dstFormat == GL_RGB || 39693464ebd5Sriastradh dstFormat == GL_RGBA); 39703464ebd5Sriastradh 39713464ebd5Sriastradh ASSERT(srcFormat == GL_RED || 39723464ebd5Sriastradh srcFormat == GL_GREEN || 39733464ebd5Sriastradh srcFormat == GL_BLUE || 39743464ebd5Sriastradh srcFormat == GL_ALPHA || 39753464ebd5Sriastradh srcFormat == GL_LUMINANCE || 39763464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA || 39773464ebd5Sriastradh srcFormat == GL_INTENSITY || 39783464ebd5Sriastradh srcFormat == GL_RG || 39793464ebd5Sriastradh srcFormat == GL_RGB || 39803464ebd5Sriastradh srcFormat == GL_BGR || 39813464ebd5Sriastradh srcFormat == GL_RGBA || 39823464ebd5Sriastradh srcFormat == GL_BGRA || 39833464ebd5Sriastradh srcFormat == GL_ABGR_EXT || 39843464ebd5Sriastradh srcFormat == GL_RED_INTEGER_EXT || 39853464ebd5Sriastradh srcFormat == GL_GREEN_INTEGER_EXT || 39863464ebd5Sriastradh srcFormat == GL_BLUE_INTEGER_EXT || 39873464ebd5Sriastradh srcFormat == GL_ALPHA_INTEGER_EXT || 39883464ebd5Sriastradh srcFormat == GL_RGB_INTEGER_EXT || 39893464ebd5Sriastradh srcFormat == GL_RGBA_INTEGER_EXT || 39903464ebd5Sriastradh srcFormat == GL_BGR_INTEGER_EXT || 39913464ebd5Sriastradh srcFormat == GL_BGRA_INTEGER_EXT || 39923464ebd5Sriastradh srcFormat == GL_LUMINANCE_INTEGER_EXT || 39933464ebd5Sriastradh srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT); 39943464ebd5Sriastradh 39953464ebd5Sriastradh ASSERT(srcType == GL_UNSIGNED_BYTE || 39963464ebd5Sriastradh srcType == GL_BYTE || 39973464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 39983464ebd5Sriastradh srcType == GL_SHORT || 39993464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 40003464ebd5Sriastradh srcType == GL_INT || 40013464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 40023464ebd5Sriastradh srcType == GL_FLOAT || 40033464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_3_3_2 || 40043464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE_2_3_3_REV || 40053464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5 || 40063464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_6_5_REV || 40073464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4 || 40083464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV || 40093464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_5_5_5_1 || 40103464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV || 40113464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8 || 40123464ebd5Sriastradh srcType == GL_UNSIGNED_INT_8_8_8_8_REV || 40133464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10_10_10_2 || 40143464ebd5Sriastradh srcType == GL_UNSIGNED_INT_2_10_10_10_REV || 40153464ebd5Sriastradh srcType == GL_UNSIGNED_INT_5_9_9_9_REV || 40163464ebd5Sriastradh srcType == GL_UNSIGNED_INT_10F_11F_11F_REV); 40173464ebd5Sriastradh 40183464ebd5Sriastradh 40193464ebd5Sriastradh /* Extract image data as uint[4] pixels */ 40203464ebd5Sriastradh extract_uint_rgba(n, rgba, srcFormat, srcType, source, 40213464ebd5Sriastradh srcPacking->SwapBytes); 40223464ebd5Sriastradh 40233464ebd5Sriastradh if (dstFormat == GL_RGBA) { 40243464ebd5Sriastradh /* simple case */ 40253464ebd5Sriastradh memcpy(dest, rgba, 4 * sizeof(GLuint) * n); 40263464ebd5Sriastradh } 40273464ebd5Sriastradh else { 40283464ebd5Sriastradh /* general case */ 40293464ebd5Sriastradh GLint rDst, gDst, bDst, aDst, lDst, iDst; 40303464ebd5Sriastradh GLint dstComponents = _mesa_components_in_format( dstFormat ); 40313464ebd5Sriastradh 40323464ebd5Sriastradh assert(dstComponents > 0); 40333464ebd5Sriastradh 40343464ebd5Sriastradh get_component_indexes(dstFormat, 40353464ebd5Sriastradh &rDst, &gDst, &bDst, &aDst, &lDst, &iDst); 40363464ebd5Sriastradh 40373464ebd5Sriastradh /* Now pack values in the requested dest format */ 40383464ebd5Sriastradh if (rDst >= 0) { 40393464ebd5Sriastradh GLuint *dst = dest; 40403464ebd5Sriastradh GLuint i; 40413464ebd5Sriastradh for (i = 0; i < n; i++) { 40423464ebd5Sriastradh dst[rDst] = rgba[i][RCOMP]; 40433464ebd5Sriastradh dst += dstComponents; 40443464ebd5Sriastradh } 40453464ebd5Sriastradh } 40463464ebd5Sriastradh 40473464ebd5Sriastradh if (gDst >= 0) { 40483464ebd5Sriastradh GLuint *dst = dest; 40493464ebd5Sriastradh GLuint i; 40503464ebd5Sriastradh for (i = 0; i < n; i++) { 40513464ebd5Sriastradh dst[gDst] = rgba[i][GCOMP]; 40523464ebd5Sriastradh dst += dstComponents; 40533464ebd5Sriastradh } 40543464ebd5Sriastradh } 40553464ebd5Sriastradh 40563464ebd5Sriastradh if (bDst >= 0) { 40573464ebd5Sriastradh GLuint *dst = dest; 40583464ebd5Sriastradh GLuint i; 40593464ebd5Sriastradh for (i = 0; i < n; i++) { 40603464ebd5Sriastradh dst[bDst] = rgba[i][BCOMP]; 40613464ebd5Sriastradh dst += dstComponents; 40623464ebd5Sriastradh } 40633464ebd5Sriastradh } 40643464ebd5Sriastradh 40653464ebd5Sriastradh if (aDst >= 0) { 40663464ebd5Sriastradh GLuint *dst = dest; 40673464ebd5Sriastradh GLuint i; 40683464ebd5Sriastradh for (i = 0; i < n; i++) { 40693464ebd5Sriastradh dst[aDst] = rgba[i][ACOMP]; 40703464ebd5Sriastradh dst += dstComponents; 40713464ebd5Sriastradh } 40723464ebd5Sriastradh } 40733464ebd5Sriastradh 40743464ebd5Sriastradh if (iDst >= 0) { 40753464ebd5Sriastradh GLuint *dst = dest; 40763464ebd5Sriastradh GLuint i; 40773464ebd5Sriastradh assert(iDst == 0); 40783464ebd5Sriastradh assert(dstComponents == 1); 40793464ebd5Sriastradh for (i = 0; i < n; i++) { 40803464ebd5Sriastradh /* Intensity comes from red channel */ 40813464ebd5Sriastradh dst[i] = rgba[i][RCOMP]; 40823464ebd5Sriastradh } 40833464ebd5Sriastradh } 40843464ebd5Sriastradh 40853464ebd5Sriastradh if (lDst >= 0) { 40863464ebd5Sriastradh GLuint *dst = dest; 40873464ebd5Sriastradh GLuint i; 40883464ebd5Sriastradh assert(lDst == 0); 40893464ebd5Sriastradh for (i = 0; i < n; i++) { 40903464ebd5Sriastradh /* Luminance comes from red channel */ 40913464ebd5Sriastradh dst[0] = rgba[i][RCOMP]; 40923464ebd5Sriastradh dst += dstComponents; 40933464ebd5Sriastradh } 40943464ebd5Sriastradh } 40953464ebd5Sriastradh } 40963464ebd5Sriastradh 40973464ebd5Sriastradh free(rgba); 40983464ebd5Sriastradh} 40993464ebd5Sriastradh 41003464ebd5Sriastradh 41013464ebd5Sriastradh 41023464ebd5Sriastradh/** 41033464ebd5Sriastradh * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba, 41043464ebd5Sriastradh * directly return GLbyte data, no transfer ops apply. 41053464ebd5Sriastradh */ 41063464ebd5Sriastradhvoid 41073464ebd5Sriastradh_mesa_unpack_dudv_span_byte( struct gl_context *ctx, 41083464ebd5Sriastradh GLuint n, GLenum dstFormat, GLbyte dest[], 41093464ebd5Sriastradh GLenum srcFormat, GLenum srcType, 41103464ebd5Sriastradh const GLvoid *source, 41113464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking, 41123464ebd5Sriastradh GLbitfield transferOps ) 41133464ebd5Sriastradh{ 41143464ebd5Sriastradh ASSERT(dstFormat == GL_DUDV_ATI); 41153464ebd5Sriastradh ASSERT(srcFormat == GL_DUDV_ATI || 41163464ebd5Sriastradh srcFormat == GL_DU8DV8_ATI); 41173464ebd5Sriastradh 41183464ebd5Sriastradh ASSERT(srcType == GL_UNSIGNED_BYTE || 41193464ebd5Sriastradh srcType == GL_BYTE || 41203464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 41213464ebd5Sriastradh srcType == GL_SHORT || 41223464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 41233464ebd5Sriastradh srcType == GL_INT || 41243464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 41253464ebd5Sriastradh srcType == GL_FLOAT); 41263464ebd5Sriastradh 41273464ebd5Sriastradh /* general solution */ 41283464ebd5Sriastradh { 41293464ebd5Sriastradh GLint dstComponents; 41303464ebd5Sriastradh GLbyte *dst = dest; 41313464ebd5Sriastradh GLuint i; 41323464ebd5Sriastradh GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); 41333464ebd5Sriastradh 41343464ebd5Sriastradh if (!rgba) { 41353464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 41363464ebd5Sriastradh return; 41373464ebd5Sriastradh } 41383464ebd5Sriastradh 41393464ebd5Sriastradh dstComponents = _mesa_components_in_format( dstFormat ); 41403464ebd5Sriastradh /* source & dest image formats should have been error checked by now */ 41413464ebd5Sriastradh assert(dstComponents > 0); 41423464ebd5Sriastradh 41433464ebd5Sriastradh /* 41443464ebd5Sriastradh * Extract image data and convert to RGBA floats 41453464ebd5Sriastradh */ 41463464ebd5Sriastradh extract_float_rgba(n, rgba, srcFormat, srcType, source, 41473464ebd5Sriastradh srcPacking->SwapBytes); 41483464ebd5Sriastradh 41493464ebd5Sriastradh 41503464ebd5Sriastradh /* Now determine which color channels we need to produce. 41513464ebd5Sriastradh * And determine the dest index (offset) within each color tuple. 41523464ebd5Sriastradh */ 41533464ebd5Sriastradh 41543464ebd5Sriastradh /* Now pack results in the requested dstFormat */ 41553464ebd5Sriastradh for (i = 0; i < n; i++) { 41563464ebd5Sriastradh /* not sure - need clamp[-1,1] here? */ 41573464ebd5Sriastradh dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); 41583464ebd5Sriastradh dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); 41593464ebd5Sriastradh dst += dstComponents; 41603464ebd5Sriastradh } 41613464ebd5Sriastradh 41623464ebd5Sriastradh free(rgba); 41633464ebd5Sriastradh } 41643464ebd5Sriastradh} 41653464ebd5Sriastradh 41663464ebd5Sriastradh/* 41673464ebd5Sriastradh * Unpack a row of color index data from a client buffer according to 41683464ebd5Sriastradh * the pixel unpacking parameters. 41693464ebd5Sriastradh * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc. 41703464ebd5Sriastradh * 41713464ebd5Sriastradh * Args: ctx - the context 41723464ebd5Sriastradh * n - number of pixels 41733464ebd5Sriastradh * dstType - destination data type 41743464ebd5Sriastradh * dest - destination array 41753464ebd5Sriastradh * srcType - source pixel type 41763464ebd5Sriastradh * source - source data pointer 41773464ebd5Sriastradh * srcPacking - pixel unpacking parameters 41783464ebd5Sriastradh * transferOps - the pixel transfer operations to apply 41793464ebd5Sriastradh */ 41803464ebd5Sriastradhvoid 41813464ebd5Sriastradh_mesa_unpack_index_span( struct gl_context *ctx, GLuint n, 41823464ebd5Sriastradh GLenum dstType, GLvoid *dest, 41833464ebd5Sriastradh GLenum srcType, const GLvoid *source, 41843464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking, 41853464ebd5Sriastradh GLbitfield transferOps ) 41863464ebd5Sriastradh{ 41873464ebd5Sriastradh ASSERT(srcType == GL_BITMAP || 41883464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE || 41893464ebd5Sriastradh srcType == GL_BYTE || 41903464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 41913464ebd5Sriastradh srcType == GL_SHORT || 41923464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 41933464ebd5Sriastradh srcType == GL_INT || 41943464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 41953464ebd5Sriastradh srcType == GL_FLOAT); 41963464ebd5Sriastradh 41973464ebd5Sriastradh ASSERT(dstType == GL_UNSIGNED_BYTE || 41983464ebd5Sriastradh dstType == GL_UNSIGNED_SHORT || 41993464ebd5Sriastradh dstType == GL_UNSIGNED_INT); 42003464ebd5Sriastradh 42013464ebd5Sriastradh 42023464ebd5Sriastradh transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 42033464ebd5Sriastradh 42043464ebd5Sriastradh /* 42053464ebd5Sriastradh * Try simple cases first 42063464ebd5Sriastradh */ 42073464ebd5Sriastradh if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE 42083464ebd5Sriastradh && dstType == GL_UNSIGNED_BYTE) { 42093464ebd5Sriastradh memcpy(dest, source, n * sizeof(GLubyte)); 42103464ebd5Sriastradh } 42113464ebd5Sriastradh else if (transferOps == 0 && srcType == GL_UNSIGNED_INT 42123464ebd5Sriastradh && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) { 42133464ebd5Sriastradh memcpy(dest, source, n * sizeof(GLuint)); 42143464ebd5Sriastradh } 42153464ebd5Sriastradh else { 42163464ebd5Sriastradh /* 42173464ebd5Sriastradh * general solution 42183464ebd5Sriastradh */ 42193464ebd5Sriastradh GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 42203464ebd5Sriastradh 42213464ebd5Sriastradh if (!indexes) { 42223464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 42233464ebd5Sriastradh return; 42243464ebd5Sriastradh } 42253464ebd5Sriastradh 42263464ebd5Sriastradh extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source, 42273464ebd5Sriastradh srcPacking); 42283464ebd5Sriastradh 42293464ebd5Sriastradh if (transferOps) 42303464ebd5Sriastradh _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 42313464ebd5Sriastradh 42323464ebd5Sriastradh /* convert to dest type */ 42333464ebd5Sriastradh switch (dstType) { 42343464ebd5Sriastradh case GL_UNSIGNED_BYTE: 42353464ebd5Sriastradh { 42363464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 42373464ebd5Sriastradh GLuint i; 42383464ebd5Sriastradh for (i = 0; i < n; i++) { 42393464ebd5Sriastradh dst[i] = (GLubyte) (indexes[i] & 0xff); 42403464ebd5Sriastradh } 42413464ebd5Sriastradh } 42423464ebd5Sriastradh break; 42433464ebd5Sriastradh case GL_UNSIGNED_SHORT: 42443464ebd5Sriastradh { 42453464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 42463464ebd5Sriastradh GLuint i; 42473464ebd5Sriastradh for (i = 0; i < n; i++) { 42483464ebd5Sriastradh dst[i] = (GLushort) (indexes[i] & 0xffff); 42493464ebd5Sriastradh } 42503464ebd5Sriastradh } 42513464ebd5Sriastradh break; 42523464ebd5Sriastradh case GL_UNSIGNED_INT: 42533464ebd5Sriastradh memcpy(dest, indexes, n * sizeof(GLuint)); 42543464ebd5Sriastradh break; 42553464ebd5Sriastradh default: 42563464ebd5Sriastradh _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span"); 42573464ebd5Sriastradh } 42583464ebd5Sriastradh 42593464ebd5Sriastradh free(indexes); 42603464ebd5Sriastradh } 42613464ebd5Sriastradh} 42623464ebd5Sriastradh 42633464ebd5Sriastradh 42643464ebd5Sriastradhvoid 42653464ebd5Sriastradh_mesa_pack_index_span( struct gl_context *ctx, GLuint n, 42663464ebd5Sriastradh GLenum dstType, GLvoid *dest, const GLuint *source, 42673464ebd5Sriastradh const struct gl_pixelstore_attrib *dstPacking, 42683464ebd5Sriastradh GLbitfield transferOps ) 42693464ebd5Sriastradh{ 42703464ebd5Sriastradh GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 42713464ebd5Sriastradh 42723464ebd5Sriastradh if (!indexes) { 42733464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 42743464ebd5Sriastradh return; 42753464ebd5Sriastradh } 42763464ebd5Sriastradh 42773464ebd5Sriastradh transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT); 42783464ebd5Sriastradh 42793464ebd5Sriastradh if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) { 42803464ebd5Sriastradh /* make a copy of input */ 42813464ebd5Sriastradh memcpy(indexes, source, n * sizeof(GLuint)); 42823464ebd5Sriastradh _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes); 42833464ebd5Sriastradh source = indexes; 42843464ebd5Sriastradh } 42853464ebd5Sriastradh 42863464ebd5Sriastradh switch (dstType) { 42873464ebd5Sriastradh case GL_UNSIGNED_BYTE: 42883464ebd5Sriastradh { 42893464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 42903464ebd5Sriastradh GLuint i; 42913464ebd5Sriastradh for (i = 0; i < n; i++) { 42923464ebd5Sriastradh *dst++ = (GLubyte) source[i]; 42933464ebd5Sriastradh } 42943464ebd5Sriastradh } 42953464ebd5Sriastradh break; 42963464ebd5Sriastradh case GL_BYTE: 42973464ebd5Sriastradh { 42983464ebd5Sriastradh GLbyte *dst = (GLbyte *) dest; 42993464ebd5Sriastradh GLuint i; 43003464ebd5Sriastradh for (i = 0; i < n; i++) { 43013464ebd5Sriastradh dst[i] = (GLbyte) source[i]; 43023464ebd5Sriastradh } 43033464ebd5Sriastradh } 43043464ebd5Sriastradh break; 43053464ebd5Sriastradh case GL_UNSIGNED_SHORT: 43063464ebd5Sriastradh { 43073464ebd5Sriastradh GLushort *dst = (GLushort *) dest; 43083464ebd5Sriastradh GLuint i; 43093464ebd5Sriastradh for (i = 0; i < n; i++) { 43103464ebd5Sriastradh dst[i] = (GLushort) source[i]; 43113464ebd5Sriastradh } 43123464ebd5Sriastradh if (dstPacking->SwapBytes) { 43133464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 43143464ebd5Sriastradh } 43153464ebd5Sriastradh } 43163464ebd5Sriastradh break; 43173464ebd5Sriastradh case GL_SHORT: 43183464ebd5Sriastradh { 43193464ebd5Sriastradh GLshort *dst = (GLshort *) dest; 43203464ebd5Sriastradh GLuint i; 43213464ebd5Sriastradh for (i = 0; i < n; i++) { 43223464ebd5Sriastradh dst[i] = (GLshort) source[i]; 43233464ebd5Sriastradh } 43243464ebd5Sriastradh if (dstPacking->SwapBytes) { 43253464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 43263464ebd5Sriastradh } 43273464ebd5Sriastradh } 43283464ebd5Sriastradh break; 43293464ebd5Sriastradh case GL_UNSIGNED_INT: 43303464ebd5Sriastradh { 43313464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 43323464ebd5Sriastradh GLuint i; 43333464ebd5Sriastradh for (i = 0; i < n; i++) { 43343464ebd5Sriastradh dst[i] = (GLuint) source[i]; 43353464ebd5Sriastradh } 43363464ebd5Sriastradh if (dstPacking->SwapBytes) { 43373464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 43383464ebd5Sriastradh } 43393464ebd5Sriastradh } 43403464ebd5Sriastradh break; 43413464ebd5Sriastradh case GL_INT: 43423464ebd5Sriastradh { 43433464ebd5Sriastradh GLint *dst = (GLint *) dest; 43443464ebd5Sriastradh GLuint i; 43453464ebd5Sriastradh for (i = 0; i < n; i++) { 43463464ebd5Sriastradh dst[i] = (GLint) source[i]; 43473464ebd5Sriastradh } 43483464ebd5Sriastradh if (dstPacking->SwapBytes) { 43493464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 43503464ebd5Sriastradh } 43513464ebd5Sriastradh } 43523464ebd5Sriastradh break; 43533464ebd5Sriastradh case GL_FLOAT: 43543464ebd5Sriastradh { 43553464ebd5Sriastradh GLfloat *dst = (GLfloat *) dest; 43563464ebd5Sriastradh GLuint i; 43573464ebd5Sriastradh for (i = 0; i < n; i++) { 43583464ebd5Sriastradh dst[i] = (GLfloat) source[i]; 43593464ebd5Sriastradh } 43603464ebd5Sriastradh if (dstPacking->SwapBytes) { 43613464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 43623464ebd5Sriastradh } 43633464ebd5Sriastradh } 43643464ebd5Sriastradh break; 43653464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 43663464ebd5Sriastradh { 43673464ebd5Sriastradh GLhalfARB *dst = (GLhalfARB *) dest; 43683464ebd5Sriastradh GLuint i; 43693464ebd5Sriastradh for (i = 0; i < n; i++) { 43703464ebd5Sriastradh dst[i] = _mesa_float_to_half((GLfloat) source[i]); 43713464ebd5Sriastradh } 43723464ebd5Sriastradh if (dstPacking->SwapBytes) { 43733464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 43743464ebd5Sriastradh } 43753464ebd5Sriastradh } 43763464ebd5Sriastradh break; 43773464ebd5Sriastradh default: 43783464ebd5Sriastradh _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 43793464ebd5Sriastradh } 43803464ebd5Sriastradh 43813464ebd5Sriastradh free(indexes); 43823464ebd5Sriastradh} 43833464ebd5Sriastradh 43843464ebd5Sriastradh 43853464ebd5Sriastradh/* 43863464ebd5Sriastradh * Unpack a row of stencil data from a client buffer according to 43873464ebd5Sriastradh * the pixel unpacking parameters. 43883464ebd5Sriastradh * This is (or will be) used by glDrawPixels 43893464ebd5Sriastradh * 43903464ebd5Sriastradh * Args: ctx - the context 43913464ebd5Sriastradh * n - number of pixels 43923464ebd5Sriastradh * dstType - destination data type 43933464ebd5Sriastradh * dest - destination array 43943464ebd5Sriastradh * srcType - source pixel type 43953464ebd5Sriastradh * source - source data pointer 43963464ebd5Sriastradh * srcPacking - pixel unpacking parameters 43973464ebd5Sriastradh * transferOps - apply offset/bias/lookup ops? 43983464ebd5Sriastradh */ 43993464ebd5Sriastradhvoid 44003464ebd5Sriastradh_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, 44013464ebd5Sriastradh GLenum dstType, GLvoid *dest, 44023464ebd5Sriastradh GLenum srcType, const GLvoid *source, 44033464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking, 44043464ebd5Sriastradh GLbitfield transferOps ) 44053464ebd5Sriastradh{ 44063464ebd5Sriastradh ASSERT(srcType == GL_BITMAP || 44073464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE || 44083464ebd5Sriastradh srcType == GL_BYTE || 44093464ebd5Sriastradh srcType == GL_UNSIGNED_SHORT || 44103464ebd5Sriastradh srcType == GL_SHORT || 44113464ebd5Sriastradh srcType == GL_UNSIGNED_INT || 44123464ebd5Sriastradh srcType == GL_INT || 44133464ebd5Sriastradh srcType == GL_UNSIGNED_INT_24_8_EXT || 44143464ebd5Sriastradh srcType == GL_HALF_FLOAT_ARB || 44153464ebd5Sriastradh srcType == GL_FLOAT); 44163464ebd5Sriastradh 44173464ebd5Sriastradh ASSERT(dstType == GL_UNSIGNED_BYTE || 44183464ebd5Sriastradh dstType == GL_UNSIGNED_SHORT || 44193464ebd5Sriastradh dstType == GL_UNSIGNED_INT); 44203464ebd5Sriastradh 44213464ebd5Sriastradh /* only shift and offset apply to stencil */ 44223464ebd5Sriastradh transferOps &= IMAGE_SHIFT_OFFSET_BIT; 44233464ebd5Sriastradh 44243464ebd5Sriastradh /* 44253464ebd5Sriastradh * Try simple cases first 44263464ebd5Sriastradh */ 44273464ebd5Sriastradh if (transferOps == 0 && 44283464ebd5Sriastradh !ctx->Pixel.MapStencilFlag && 44293464ebd5Sriastradh srcType == GL_UNSIGNED_BYTE && 44303464ebd5Sriastradh dstType == GL_UNSIGNED_BYTE) { 44313464ebd5Sriastradh memcpy(dest, source, n * sizeof(GLubyte)); 44323464ebd5Sriastradh } 44333464ebd5Sriastradh else if (transferOps == 0 && 44343464ebd5Sriastradh !ctx->Pixel.MapStencilFlag && 44353464ebd5Sriastradh srcType == GL_UNSIGNED_INT && 44363464ebd5Sriastradh dstType == GL_UNSIGNED_INT && 44373464ebd5Sriastradh !srcPacking->SwapBytes) { 44383464ebd5Sriastradh memcpy(dest, source, n * sizeof(GLuint)); 44393464ebd5Sriastradh } 44403464ebd5Sriastradh else { 44413464ebd5Sriastradh /* 44423464ebd5Sriastradh * general solution 44433464ebd5Sriastradh */ 44443464ebd5Sriastradh GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); 44453464ebd5Sriastradh 44463464ebd5Sriastradh if (!indexes) { 44473464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); 44483464ebd5Sriastradh return; 44493464ebd5Sriastradh } 44503464ebd5Sriastradh 44513464ebd5Sriastradh extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source, 44523464ebd5Sriastradh srcPacking); 44533464ebd5Sriastradh 44543464ebd5Sriastradh if (transferOps & IMAGE_SHIFT_OFFSET_BIT) { 44553464ebd5Sriastradh /* shift and offset indexes */ 44563464ebd5Sriastradh _mesa_shift_and_offset_ci(ctx, n, indexes); 44573464ebd5Sriastradh } 44583464ebd5Sriastradh 44593464ebd5Sriastradh if (ctx->Pixel.MapStencilFlag) { 44603464ebd5Sriastradh /* Apply stencil lookup table */ 44613464ebd5Sriastradh const GLuint mask = ctx->PixelMaps.StoS.Size - 1; 44623464ebd5Sriastradh GLuint i; 44633464ebd5Sriastradh for (i = 0; i < n; i++) { 44643464ebd5Sriastradh indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ]; 44653464ebd5Sriastradh } 44663464ebd5Sriastradh } 44673464ebd5Sriastradh 44683464ebd5Sriastradh /* convert to dest type */ 44693464ebd5Sriastradh switch (dstType) { 44703464ebd5Sriastradh case GL_UNSIGNED_BYTE: 44713464ebd5Sriastradh { 44723464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 44733464ebd5Sriastradh GLuint i; 44743464ebd5Sriastradh for (i = 0; i < n; i++) { 44753464ebd5Sriastradh dst[i] = (GLubyte) (indexes[i] & 0xff); 44763464ebd5Sriastradh } 44773464ebd5Sriastradh } 44783464ebd5Sriastradh break; 44793464ebd5Sriastradh case GL_UNSIGNED_SHORT: 44803464ebd5Sriastradh { 44813464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 44823464ebd5Sriastradh GLuint i; 44833464ebd5Sriastradh for (i = 0; i < n; i++) { 44843464ebd5Sriastradh dst[i] = (GLushort) (indexes[i] & 0xffff); 44853464ebd5Sriastradh } 44863464ebd5Sriastradh } 44873464ebd5Sriastradh break; 44883464ebd5Sriastradh case GL_UNSIGNED_INT: 44893464ebd5Sriastradh memcpy(dest, indexes, n * sizeof(GLuint)); 44903464ebd5Sriastradh break; 44913464ebd5Sriastradh default: 44923464ebd5Sriastradh _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span"); 44933464ebd5Sriastradh } 44943464ebd5Sriastradh 44953464ebd5Sriastradh free(indexes); 44963464ebd5Sriastradh } 44973464ebd5Sriastradh} 44983464ebd5Sriastradh 44993464ebd5Sriastradh 45003464ebd5Sriastradhvoid 45013464ebd5Sriastradh_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, 45023464ebd5Sriastradh GLenum dstType, GLvoid *dest, const GLstencil *source, 45033464ebd5Sriastradh const struct gl_pixelstore_attrib *dstPacking ) 45043464ebd5Sriastradh{ 45053464ebd5Sriastradh GLstencil *stencil = (GLstencil *) malloc(n * sizeof(GLstencil)); 45063464ebd5Sriastradh 45073464ebd5Sriastradh if (!stencil) { 45083464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); 45093464ebd5Sriastradh return; 45103464ebd5Sriastradh } 45113464ebd5Sriastradh 45123464ebd5Sriastradh if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || 45133464ebd5Sriastradh ctx->Pixel.MapStencilFlag) { 45143464ebd5Sriastradh /* make a copy of input */ 45153464ebd5Sriastradh memcpy(stencil, source, n * sizeof(GLstencil)); 45163464ebd5Sriastradh _mesa_apply_stencil_transfer_ops(ctx, n, stencil); 45173464ebd5Sriastradh source = stencil; 45183464ebd5Sriastradh } 45193464ebd5Sriastradh 45203464ebd5Sriastradh switch (dstType) { 45213464ebd5Sriastradh case GL_UNSIGNED_BYTE: 45223464ebd5Sriastradh if (sizeof(GLstencil) == 1) { 45233464ebd5Sriastradh memcpy( dest, source, n ); 45243464ebd5Sriastradh } 45253464ebd5Sriastradh else { 45263464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 45273464ebd5Sriastradh GLuint i; 45283464ebd5Sriastradh for (i=0;i<n;i++) { 45293464ebd5Sriastradh dst[i] = (GLubyte) source[i]; 45303464ebd5Sriastradh } 45313464ebd5Sriastradh } 45323464ebd5Sriastradh break; 45333464ebd5Sriastradh case GL_BYTE: 45343464ebd5Sriastradh { 45353464ebd5Sriastradh GLbyte *dst = (GLbyte *) dest; 45363464ebd5Sriastradh GLuint i; 45373464ebd5Sriastradh for (i=0;i<n;i++) { 45383464ebd5Sriastradh dst[i] = (GLbyte) (source[i] & 0x7f); 45393464ebd5Sriastradh } 45403464ebd5Sriastradh } 45413464ebd5Sriastradh break; 45423464ebd5Sriastradh case GL_UNSIGNED_SHORT: 45433464ebd5Sriastradh { 45443464ebd5Sriastradh GLushort *dst = (GLushort *) dest; 45453464ebd5Sriastradh GLuint i; 45463464ebd5Sriastradh for (i=0;i<n;i++) { 45473464ebd5Sriastradh dst[i] = (GLushort) source[i]; 45483464ebd5Sriastradh } 45493464ebd5Sriastradh if (dstPacking->SwapBytes) { 45503464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 45513464ebd5Sriastradh } 45523464ebd5Sriastradh } 45533464ebd5Sriastradh break; 45543464ebd5Sriastradh case GL_SHORT: 45553464ebd5Sriastradh { 45563464ebd5Sriastradh GLshort *dst = (GLshort *) dest; 45573464ebd5Sriastradh GLuint i; 45583464ebd5Sriastradh for (i=0;i<n;i++) { 45593464ebd5Sriastradh dst[i] = (GLshort) source[i]; 45603464ebd5Sriastradh } 45613464ebd5Sriastradh if (dstPacking->SwapBytes) { 45623464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 45633464ebd5Sriastradh } 45643464ebd5Sriastradh } 45653464ebd5Sriastradh break; 45663464ebd5Sriastradh case GL_UNSIGNED_INT: 45673464ebd5Sriastradh { 45683464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 45693464ebd5Sriastradh GLuint i; 45703464ebd5Sriastradh for (i=0;i<n;i++) { 45713464ebd5Sriastradh dst[i] = (GLuint) source[i]; 45723464ebd5Sriastradh } 45733464ebd5Sriastradh if (dstPacking->SwapBytes) { 45743464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 45753464ebd5Sriastradh } 45763464ebd5Sriastradh } 45773464ebd5Sriastradh break; 45783464ebd5Sriastradh case GL_INT: 45793464ebd5Sriastradh { 45803464ebd5Sriastradh GLint *dst = (GLint *) dest; 45813464ebd5Sriastradh GLuint i; 45823464ebd5Sriastradh for (i=0;i<n;i++) { 45833464ebd5Sriastradh dst[i] = (GLint) source[i]; 45843464ebd5Sriastradh } 45853464ebd5Sriastradh if (dstPacking->SwapBytes) { 45863464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 45873464ebd5Sriastradh } 45883464ebd5Sriastradh } 45893464ebd5Sriastradh break; 45903464ebd5Sriastradh case GL_FLOAT: 45913464ebd5Sriastradh { 45923464ebd5Sriastradh GLfloat *dst = (GLfloat *) dest; 45933464ebd5Sriastradh GLuint i; 45943464ebd5Sriastradh for (i=0;i<n;i++) { 45953464ebd5Sriastradh dst[i] = (GLfloat) source[i]; 45963464ebd5Sriastradh } 45973464ebd5Sriastradh if (dstPacking->SwapBytes) { 45983464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 45993464ebd5Sriastradh } 46003464ebd5Sriastradh } 46013464ebd5Sriastradh break; 46023464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 46033464ebd5Sriastradh { 46043464ebd5Sriastradh GLhalfARB *dst = (GLhalfARB *) dest; 46053464ebd5Sriastradh GLuint i; 46063464ebd5Sriastradh for (i=0;i<n;i++) { 46073464ebd5Sriastradh dst[i] = _mesa_float_to_half( (float) source[i] ); 46083464ebd5Sriastradh } 46093464ebd5Sriastradh if (dstPacking->SwapBytes) { 46103464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 46113464ebd5Sriastradh } 46123464ebd5Sriastradh } 46133464ebd5Sriastradh break; 46143464ebd5Sriastradh case GL_BITMAP: 46153464ebd5Sriastradh if (dstPacking->LsbFirst) { 46163464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 46173464ebd5Sriastradh GLint shift = 0; 46183464ebd5Sriastradh GLuint i; 46193464ebd5Sriastradh for (i = 0; i < n; i++) { 46203464ebd5Sriastradh if (shift == 0) 46213464ebd5Sriastradh *dst = 0; 46223464ebd5Sriastradh *dst |= ((source[i] != 0) << shift); 46233464ebd5Sriastradh shift++; 46243464ebd5Sriastradh if (shift == 8) { 46253464ebd5Sriastradh shift = 0; 46263464ebd5Sriastradh dst++; 46273464ebd5Sriastradh } 46283464ebd5Sriastradh } 46293464ebd5Sriastradh } 46303464ebd5Sriastradh else { 46313464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 46323464ebd5Sriastradh GLint shift = 7; 46333464ebd5Sriastradh GLuint i; 46343464ebd5Sriastradh for (i = 0; i < n; i++) { 46353464ebd5Sriastradh if (shift == 7) 46363464ebd5Sriastradh *dst = 0; 46373464ebd5Sriastradh *dst |= ((source[i] != 0) << shift); 46383464ebd5Sriastradh shift--; 46393464ebd5Sriastradh if (shift < 0) { 46403464ebd5Sriastradh shift = 7; 46413464ebd5Sriastradh dst++; 46423464ebd5Sriastradh } 46433464ebd5Sriastradh } 46443464ebd5Sriastradh } 46453464ebd5Sriastradh break; 46463464ebd5Sriastradh default: 46473464ebd5Sriastradh _mesa_problem(ctx, "bad type in _mesa_pack_index_span"); 46483464ebd5Sriastradh } 46493464ebd5Sriastradh 46503464ebd5Sriastradh free(stencil); 46513464ebd5Sriastradh} 46523464ebd5Sriastradh 46533464ebd5Sriastradh#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \ 46543464ebd5Sriastradh do { \ 46553464ebd5Sriastradh GLuint i; \ 46563464ebd5Sriastradh const GLTYPE *src = (const GLTYPE *)source; \ 46573464ebd5Sriastradh for (i = 0; i < n; i++) { \ 46583464ebd5Sriastradh GLTYPE value = src[i]; \ 46593464ebd5Sriastradh if (srcPacking->SwapBytes) { \ 46603464ebd5Sriastradh if (sizeof(GLTYPE) == 2) { \ 46613464ebd5Sriastradh SWAP2BYTE(value); \ 46623464ebd5Sriastradh } else if (sizeof(GLTYPE) == 4) { \ 46633464ebd5Sriastradh SWAP4BYTE(value); \ 46643464ebd5Sriastradh } \ 46653464ebd5Sriastradh } \ 46663464ebd5Sriastradh depthValues[i] = GLTYPE2FLOAT(value); \ 46673464ebd5Sriastradh } \ 46683464ebd5Sriastradh } while (0) 46693464ebd5Sriastradh 46703464ebd5Sriastradh 46713464ebd5Sriastradh/** 46723464ebd5Sriastradh * Unpack a row of depth/z values from memory, returning GLushort, GLuint 46733464ebd5Sriastradh * or GLfloat values. 46743464ebd5Sriastradh * The glPixelTransfer (scale/bias) params will be applied. 46753464ebd5Sriastradh * 46763464ebd5Sriastradh * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT 46773464ebd5Sriastradh * \param depthMax max value for returned GLushort or GLuint values 46783464ebd5Sriastradh * (ignored for GLfloat). 46793464ebd5Sriastradh */ 46803464ebd5Sriastradhvoid 46813464ebd5Sriastradh_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n, 46823464ebd5Sriastradh GLenum dstType, GLvoid *dest, GLuint depthMax, 46833464ebd5Sriastradh GLenum srcType, const GLvoid *source, 46843464ebd5Sriastradh const struct gl_pixelstore_attrib *srcPacking ) 46853464ebd5Sriastradh{ 46863464ebd5Sriastradh GLfloat *depthTemp = NULL, *depthValues; 46873464ebd5Sriastradh GLboolean needClamp = GL_FALSE; 46883464ebd5Sriastradh 46893464ebd5Sriastradh /* Look for special cases first. 46903464ebd5Sriastradh * Not only are these faster, they're less prone to numeric conversion 46913464ebd5Sriastradh * problems. Otherwise, converting from an int type to a float then 46923464ebd5Sriastradh * back to an int type can introduce errors that will show up as 46933464ebd5Sriastradh * artifacts in things like depth peeling which uses glCopyTexImage. 46943464ebd5Sriastradh */ 46953464ebd5Sriastradh if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) { 46963464ebd5Sriastradh if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) { 46973464ebd5Sriastradh const GLuint *src = (const GLuint *) source; 46983464ebd5Sriastradh GLushort *dst = (GLushort *) dest; 46993464ebd5Sriastradh GLuint i; 47003464ebd5Sriastradh for (i = 0; i < n; i++) { 47013464ebd5Sriastradh dst[i] = src[i] >> 16; 47023464ebd5Sriastradh } 47033464ebd5Sriastradh return; 47043464ebd5Sriastradh } 47053464ebd5Sriastradh if (srcType == GL_UNSIGNED_SHORT 47063464ebd5Sriastradh && dstType == GL_UNSIGNED_INT 47073464ebd5Sriastradh && depthMax == 0xffffffff) { 47083464ebd5Sriastradh const GLushort *src = (const GLushort *) source; 47093464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 47103464ebd5Sriastradh GLuint i; 47113464ebd5Sriastradh for (i = 0; i < n; i++) { 47123464ebd5Sriastradh dst[i] = src[i] | (src[i] << 16); 47133464ebd5Sriastradh } 47143464ebd5Sriastradh return; 47153464ebd5Sriastradh } 47163464ebd5Sriastradh if (srcType == GL_UNSIGNED_INT_24_8 47173464ebd5Sriastradh && dstType == GL_UNSIGNED_INT 47183464ebd5Sriastradh && depthMax == 0xffffff) { 47193464ebd5Sriastradh const GLuint *src = (const GLuint *) source; 47203464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 47213464ebd5Sriastradh GLuint i; 47223464ebd5Sriastradh for (i = 0; i < n; i++) { 47233464ebd5Sriastradh dst[i] = src[i] >> 8; 47243464ebd5Sriastradh } 47253464ebd5Sriastradh return; 47263464ebd5Sriastradh } 47273464ebd5Sriastradh /* XXX may want to add additional cases here someday */ 47283464ebd5Sriastradh } 47293464ebd5Sriastradh 47303464ebd5Sriastradh /* general case path follows */ 47313464ebd5Sriastradh 47323464ebd5Sriastradh if (dstType == GL_FLOAT) { 47333464ebd5Sriastradh depthValues = (GLfloat *) dest; 47343464ebd5Sriastradh } 47353464ebd5Sriastradh else { 47363464ebd5Sriastradh depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat)); 47373464ebd5Sriastradh if (!depthTemp) { 47383464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); 47393464ebd5Sriastradh return; 47403464ebd5Sriastradh } 47413464ebd5Sriastradh 47423464ebd5Sriastradh depthValues = depthTemp; 47433464ebd5Sriastradh } 47443464ebd5Sriastradh 47453464ebd5Sriastradh /* Convert incoming values to GLfloat. Some conversions will require 47463464ebd5Sriastradh * clamping, below. 47473464ebd5Sriastradh */ 47483464ebd5Sriastradh switch (srcType) { 47493464ebd5Sriastradh case GL_BYTE: 47503464ebd5Sriastradh DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT); 47513464ebd5Sriastradh needClamp = GL_TRUE; 47523464ebd5Sriastradh break; 47533464ebd5Sriastradh case GL_UNSIGNED_BYTE: 47543464ebd5Sriastradh DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT); 47553464ebd5Sriastradh break; 47563464ebd5Sriastradh case GL_SHORT: 47573464ebd5Sriastradh DEPTH_VALUES(GLshort, SHORT_TO_FLOAT); 47583464ebd5Sriastradh needClamp = GL_TRUE; 47593464ebd5Sriastradh break; 47603464ebd5Sriastradh case GL_UNSIGNED_SHORT: 47613464ebd5Sriastradh DEPTH_VALUES(GLushort, USHORT_TO_FLOAT); 47623464ebd5Sriastradh break; 47633464ebd5Sriastradh case GL_INT: 47643464ebd5Sriastradh DEPTH_VALUES(GLint, INT_TO_FLOAT); 47653464ebd5Sriastradh needClamp = GL_TRUE; 47663464ebd5Sriastradh break; 47673464ebd5Sriastradh case GL_UNSIGNED_INT: 47683464ebd5Sriastradh DEPTH_VALUES(GLuint, UINT_TO_FLOAT); 47693464ebd5Sriastradh break; 47703464ebd5Sriastradh case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */ 47713464ebd5Sriastradh if (dstType == GL_UNSIGNED_INT_24_8_EXT && 47723464ebd5Sriastradh depthMax == 0xffffff && 47733464ebd5Sriastradh ctx->Pixel.DepthScale == 1.0 && 47743464ebd5Sriastradh ctx->Pixel.DepthBias == 0.0) { 47753464ebd5Sriastradh const GLuint *src = (const GLuint *) source; 47763464ebd5Sriastradh GLuint *zValues = (GLuint *) dest; 47773464ebd5Sriastradh GLuint i; 47783464ebd5Sriastradh for (i = 0; i < n; i++) { 47793464ebd5Sriastradh GLuint value = src[i]; 47803464ebd5Sriastradh if (srcPacking->SwapBytes) { 47813464ebd5Sriastradh SWAP4BYTE(value); 47823464ebd5Sriastradh } 47833464ebd5Sriastradh zValues[i] = value & 0xffffff00; 47843464ebd5Sriastradh } 47853464ebd5Sriastradh free(depthTemp); 47863464ebd5Sriastradh return; 47873464ebd5Sriastradh } 47883464ebd5Sriastradh else { 47893464ebd5Sriastradh const GLuint *src = (const GLuint *) source; 47903464ebd5Sriastradh const GLfloat scale = 1.0f / 0xffffff; 47913464ebd5Sriastradh GLuint i; 47923464ebd5Sriastradh for (i = 0; i < n; i++) { 47933464ebd5Sriastradh GLuint value = src[i]; 47943464ebd5Sriastradh if (srcPacking->SwapBytes) { 47953464ebd5Sriastradh SWAP4BYTE(value); 47963464ebd5Sriastradh } 47973464ebd5Sriastradh depthValues[i] = (value >> 8) * scale; 47983464ebd5Sriastradh } 47993464ebd5Sriastradh } 48003464ebd5Sriastradh break; 48013464ebd5Sriastradh case GL_FLOAT: 48023464ebd5Sriastradh DEPTH_VALUES(GLfloat, 1*); 48033464ebd5Sriastradh needClamp = GL_TRUE; 48043464ebd5Sriastradh break; 48053464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 48063464ebd5Sriastradh { 48073464ebd5Sriastradh GLuint i; 48083464ebd5Sriastradh const GLhalfARB *src = (const GLhalfARB *) source; 48093464ebd5Sriastradh for (i = 0; i < n; i++) { 48103464ebd5Sriastradh GLhalfARB value = src[i]; 48113464ebd5Sriastradh if (srcPacking->SwapBytes) { 48123464ebd5Sriastradh SWAP2BYTE(value); 48133464ebd5Sriastradh } 48143464ebd5Sriastradh depthValues[i] = _mesa_half_to_float(value); 48153464ebd5Sriastradh } 48163464ebd5Sriastradh needClamp = GL_TRUE; 48173464ebd5Sriastradh } 48183464ebd5Sriastradh break; 48193464ebd5Sriastradh default: 48203464ebd5Sriastradh _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()"); 48213464ebd5Sriastradh free(depthTemp); 48223464ebd5Sriastradh return; 48233464ebd5Sriastradh } 48243464ebd5Sriastradh 48253464ebd5Sriastradh /* apply depth scale and bias */ 48263464ebd5Sriastradh { 48273464ebd5Sriastradh const GLfloat scale = ctx->Pixel.DepthScale; 48283464ebd5Sriastradh const GLfloat bias = ctx->Pixel.DepthBias; 48293464ebd5Sriastradh if (scale != 1.0 || bias != 0.0) { 48303464ebd5Sriastradh GLuint i; 48313464ebd5Sriastradh for (i = 0; i < n; i++) { 48323464ebd5Sriastradh depthValues[i] = depthValues[i] * scale + bias; 48333464ebd5Sriastradh } 48343464ebd5Sriastradh needClamp = GL_TRUE; 48353464ebd5Sriastradh } 48363464ebd5Sriastradh } 48373464ebd5Sriastradh 48383464ebd5Sriastradh /* clamp to [0, 1] */ 48393464ebd5Sriastradh if (needClamp) { 48403464ebd5Sriastradh GLuint i; 48413464ebd5Sriastradh for (i = 0; i < n; i++) { 48423464ebd5Sriastradh depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0); 48433464ebd5Sriastradh } 48443464ebd5Sriastradh } 48453464ebd5Sriastradh 48463464ebd5Sriastradh /* 48473464ebd5Sriastradh * Convert values to dstType 48483464ebd5Sriastradh */ 48493464ebd5Sriastradh if (dstType == GL_UNSIGNED_INT) { 48503464ebd5Sriastradh GLuint *zValues = (GLuint *) dest; 48513464ebd5Sriastradh GLuint i; 48523464ebd5Sriastradh if (depthMax <= 0xffffff) { 48533464ebd5Sriastradh /* no overflow worries */ 48543464ebd5Sriastradh for (i = 0; i < n; i++) { 48553464ebd5Sriastradh zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax); 48563464ebd5Sriastradh } 48573464ebd5Sriastradh } 48583464ebd5Sriastradh else { 48593464ebd5Sriastradh /* need to use double precision to prevent overflow problems */ 48603464ebd5Sriastradh for (i = 0; i < n; i++) { 48613464ebd5Sriastradh GLdouble z = depthValues[i] * (GLfloat) depthMax; 48623464ebd5Sriastradh if (z >= (GLdouble) 0xffffffff) 48633464ebd5Sriastradh zValues[i] = 0xffffffff; 48643464ebd5Sriastradh else 48653464ebd5Sriastradh zValues[i] = (GLuint) z; 48663464ebd5Sriastradh } 48673464ebd5Sriastradh } 48683464ebd5Sriastradh } 48693464ebd5Sriastradh else if (dstType == GL_UNSIGNED_SHORT) { 48703464ebd5Sriastradh GLushort *zValues = (GLushort *) dest; 48713464ebd5Sriastradh GLuint i; 48723464ebd5Sriastradh ASSERT(depthMax <= 0xffff); 48733464ebd5Sriastradh for (i = 0; i < n; i++) { 48743464ebd5Sriastradh zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax); 48753464ebd5Sriastradh } 48763464ebd5Sriastradh } 48773464ebd5Sriastradh else { 48783464ebd5Sriastradh ASSERT(dstType == GL_FLOAT); 48793464ebd5Sriastradh /*ASSERT(depthMax == 1.0F);*/ 48803464ebd5Sriastradh } 48813464ebd5Sriastradh 48823464ebd5Sriastradh free(depthTemp); 48833464ebd5Sriastradh} 48843464ebd5Sriastradh 48853464ebd5Sriastradh 48863464ebd5Sriastradh/* 48873464ebd5Sriastradh * Pack an array of depth values. The values are floats in [0,1]. 48883464ebd5Sriastradh */ 48893464ebd5Sriastradhvoid 48903464ebd5Sriastradh_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, 48913464ebd5Sriastradh GLenum dstType, const GLfloat *depthSpan, 48923464ebd5Sriastradh const struct gl_pixelstore_attrib *dstPacking ) 48933464ebd5Sriastradh{ 48943464ebd5Sriastradh GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 48953464ebd5Sriastradh if (!depthCopy) { 48963464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 48973464ebd5Sriastradh return; 48983464ebd5Sriastradh } 48993464ebd5Sriastradh 49003464ebd5Sriastradh if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 49013464ebd5Sriastradh memcpy(depthCopy, depthSpan, n * sizeof(GLfloat)); 49023464ebd5Sriastradh _mesa_scale_and_bias_depth(ctx, n, depthCopy); 49033464ebd5Sriastradh depthSpan = depthCopy; 49043464ebd5Sriastradh } 49053464ebd5Sriastradh 49063464ebd5Sriastradh switch (dstType) { 49073464ebd5Sriastradh case GL_UNSIGNED_BYTE: 49083464ebd5Sriastradh { 49093464ebd5Sriastradh GLubyte *dst = (GLubyte *) dest; 49103464ebd5Sriastradh GLuint i; 49113464ebd5Sriastradh for (i = 0; i < n; i++) { 49123464ebd5Sriastradh dst[i] = FLOAT_TO_UBYTE( depthSpan[i] ); 49133464ebd5Sriastradh } 49143464ebd5Sriastradh } 49153464ebd5Sriastradh break; 49163464ebd5Sriastradh case GL_BYTE: 49173464ebd5Sriastradh { 49183464ebd5Sriastradh GLbyte *dst = (GLbyte *) dest; 49193464ebd5Sriastradh GLuint i; 49203464ebd5Sriastradh for (i = 0; i < n; i++) { 49213464ebd5Sriastradh dst[i] = FLOAT_TO_BYTE( depthSpan[i] ); 49223464ebd5Sriastradh } 49233464ebd5Sriastradh } 49243464ebd5Sriastradh break; 49253464ebd5Sriastradh case GL_UNSIGNED_SHORT: 49263464ebd5Sriastradh { 49273464ebd5Sriastradh GLushort *dst = (GLushort *) dest; 49283464ebd5Sriastradh GLuint i; 49293464ebd5Sriastradh for (i = 0; i < n; i++) { 49303464ebd5Sriastradh CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]); 49313464ebd5Sriastradh } 49323464ebd5Sriastradh if (dstPacking->SwapBytes) { 49333464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 49343464ebd5Sriastradh } 49353464ebd5Sriastradh } 49363464ebd5Sriastradh break; 49373464ebd5Sriastradh case GL_SHORT: 49383464ebd5Sriastradh { 49393464ebd5Sriastradh GLshort *dst = (GLshort *) dest; 49403464ebd5Sriastradh GLuint i; 49413464ebd5Sriastradh for (i = 0; i < n; i++) { 49423464ebd5Sriastradh dst[i] = FLOAT_TO_SHORT( depthSpan[i] ); 49433464ebd5Sriastradh } 49443464ebd5Sriastradh if (dstPacking->SwapBytes) { 49453464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 49463464ebd5Sriastradh } 49473464ebd5Sriastradh } 49483464ebd5Sriastradh break; 49493464ebd5Sriastradh case GL_UNSIGNED_INT: 49503464ebd5Sriastradh { 49513464ebd5Sriastradh GLuint *dst = (GLuint *) dest; 49523464ebd5Sriastradh GLuint i; 49533464ebd5Sriastradh for (i = 0; i < n; i++) { 49543464ebd5Sriastradh dst[i] = FLOAT_TO_UINT( depthSpan[i] ); 49553464ebd5Sriastradh } 49563464ebd5Sriastradh if (dstPacking->SwapBytes) { 49573464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 49583464ebd5Sriastradh } 49593464ebd5Sriastradh } 49603464ebd5Sriastradh break; 49613464ebd5Sriastradh case GL_INT: 49623464ebd5Sriastradh { 49633464ebd5Sriastradh GLint *dst = (GLint *) dest; 49643464ebd5Sriastradh GLuint i; 49653464ebd5Sriastradh for (i = 0; i < n; i++) { 49663464ebd5Sriastradh dst[i] = FLOAT_TO_INT( depthSpan[i] ); 49673464ebd5Sriastradh } 49683464ebd5Sriastradh if (dstPacking->SwapBytes) { 49693464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 49703464ebd5Sriastradh } 49713464ebd5Sriastradh } 49723464ebd5Sriastradh break; 49733464ebd5Sriastradh case GL_FLOAT: 49743464ebd5Sriastradh { 49753464ebd5Sriastradh GLfloat *dst = (GLfloat *) dest; 49763464ebd5Sriastradh GLuint i; 49773464ebd5Sriastradh for (i = 0; i < n; i++) { 49783464ebd5Sriastradh dst[i] = depthSpan[i]; 49793464ebd5Sriastradh } 49803464ebd5Sriastradh if (dstPacking->SwapBytes) { 49813464ebd5Sriastradh _mesa_swap4( (GLuint *) dst, n ); 49823464ebd5Sriastradh } 49833464ebd5Sriastradh } 49843464ebd5Sriastradh break; 49853464ebd5Sriastradh case GL_HALF_FLOAT_ARB: 49863464ebd5Sriastradh { 49873464ebd5Sriastradh GLhalfARB *dst = (GLhalfARB *) dest; 49883464ebd5Sriastradh GLuint i; 49893464ebd5Sriastradh for (i = 0; i < n; i++) { 49903464ebd5Sriastradh dst[i] = _mesa_float_to_half(depthSpan[i]); 49913464ebd5Sriastradh } 49923464ebd5Sriastradh if (dstPacking->SwapBytes) { 49933464ebd5Sriastradh _mesa_swap2( (GLushort *) dst, n ); 49943464ebd5Sriastradh } 49953464ebd5Sriastradh } 49963464ebd5Sriastradh break; 49973464ebd5Sriastradh default: 49983464ebd5Sriastradh _mesa_problem(ctx, "bad type in _mesa_pack_depth_span"); 49993464ebd5Sriastradh } 50003464ebd5Sriastradh 50013464ebd5Sriastradh free(depthCopy); 50023464ebd5Sriastradh} 50033464ebd5Sriastradh 50043464ebd5Sriastradh 50053464ebd5Sriastradh 50063464ebd5Sriastradh/** 50073464ebd5Sriastradh * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8. 50083464ebd5Sriastradh */ 50093464ebd5Sriastradhvoid 50103464ebd5Sriastradh_mesa_pack_depth_stencil_span(struct gl_context *ctx, GLuint n, GLuint *dest, 50113464ebd5Sriastradh const GLfloat *depthVals, 50123464ebd5Sriastradh const GLstencil *stencilVals, 50133464ebd5Sriastradh const struct gl_pixelstore_attrib *dstPacking) 50143464ebd5Sriastradh{ 50153464ebd5Sriastradh GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); 50163464ebd5Sriastradh GLstencil *stencilCopy = (GLstencil *) malloc(n * sizeof(GLstencil)); 50173464ebd5Sriastradh GLuint i; 50183464ebd5Sriastradh 50193464ebd5Sriastradh if (!depthCopy || !stencilCopy) { 50203464ebd5Sriastradh _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); 50213464ebd5Sriastradh free(depthCopy); 50223464ebd5Sriastradh free(stencilCopy); 50233464ebd5Sriastradh return; 50243464ebd5Sriastradh } 50253464ebd5Sriastradh 50263464ebd5Sriastradh if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) { 50273464ebd5Sriastradh memcpy(depthCopy, depthVals, n * sizeof(GLfloat)); 50283464ebd5Sriastradh _mesa_scale_and_bias_depth(ctx, n, depthCopy); 50293464ebd5Sriastradh depthVals = depthCopy; 50303464ebd5Sriastradh } 50313464ebd5Sriastradh 50323464ebd5Sriastradh if (ctx->Pixel.IndexShift || 50333464ebd5Sriastradh ctx->Pixel.IndexOffset || 50343464ebd5Sriastradh ctx->Pixel.MapStencilFlag) { 50353464ebd5Sriastradh memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil)); 50363464ebd5Sriastradh _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); 50373464ebd5Sriastradh stencilVals = stencilCopy; 50383464ebd5Sriastradh } 50393464ebd5Sriastradh 50403464ebd5Sriastradh for (i = 0; i < n; i++) { 50413464ebd5Sriastradh GLuint z = (GLuint) (depthVals[i] * 0xffffff); 50423464ebd5Sriastradh dest[i] = (z << 8) | (stencilVals[i] & 0xff); 50433464ebd5Sriastradh } 50443464ebd5Sriastradh 50453464ebd5Sriastradh if (dstPacking->SwapBytes) { 50463464ebd5Sriastradh _mesa_swap4(dest, n); 50473464ebd5Sriastradh } 50483464ebd5Sriastradh 50493464ebd5Sriastradh free(depthCopy); 50503464ebd5Sriastradh free(stencilCopy); 50513464ebd5Sriastradh} 50523464ebd5Sriastradh 50533464ebd5Sriastradh 50543464ebd5Sriastradh 50553464ebd5Sriastradh 50563464ebd5Sriastradh/** 50573464ebd5Sriastradh * Unpack image data. Apply byte swapping, byte flipping (bitmap). 50583464ebd5Sriastradh * Return all image data in a contiguous block. This is used when we 50593464ebd5Sriastradh * compile glDrawPixels, glTexImage, etc into a display list. We 50603464ebd5Sriastradh * need a copy of the data in a standard format. 50613464ebd5Sriastradh */ 50623464ebd5Sriastradhvoid * 50633464ebd5Sriastradh_mesa_unpack_image( GLuint dimensions, 50643464ebd5Sriastradh GLsizei width, GLsizei height, GLsizei depth, 50653464ebd5Sriastradh GLenum format, GLenum type, const GLvoid *pixels, 50663464ebd5Sriastradh const struct gl_pixelstore_attrib *unpack ) 50673464ebd5Sriastradh{ 50683464ebd5Sriastradh GLint bytesPerRow, compsPerRow; 50693464ebd5Sriastradh GLboolean flipBytes, swap2, swap4; 50703464ebd5Sriastradh 50713464ebd5Sriastradh if (!pixels) 50723464ebd5Sriastradh return NULL; /* not necessarily an error */ 50733464ebd5Sriastradh 50743464ebd5Sriastradh if (width <= 0 || height <= 0 || depth <= 0) 50753464ebd5Sriastradh return NULL; /* generate error later */ 50763464ebd5Sriastradh 50773464ebd5Sriastradh if (type == GL_BITMAP) { 50783464ebd5Sriastradh bytesPerRow = (width + 7) >> 3; 50793464ebd5Sriastradh flipBytes = unpack->LsbFirst; 50803464ebd5Sriastradh swap2 = swap4 = GL_FALSE; 50813464ebd5Sriastradh compsPerRow = 0; 50823464ebd5Sriastradh } 50833464ebd5Sriastradh else { 50843464ebd5Sriastradh const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type); 50853464ebd5Sriastradh GLint components = _mesa_components_in_format(format); 50863464ebd5Sriastradh GLint bytesPerComp; 50873464ebd5Sriastradh 50883464ebd5Sriastradh if (_mesa_type_is_packed(type)) 50893464ebd5Sriastradh components = 1; 50903464ebd5Sriastradh 50913464ebd5Sriastradh if (bytesPerPixel <= 0 || components <= 0) 50923464ebd5Sriastradh return NULL; /* bad format or type. generate error later */ 50933464ebd5Sriastradh bytesPerRow = bytesPerPixel * width; 50943464ebd5Sriastradh bytesPerComp = bytesPerPixel / components; 50953464ebd5Sriastradh flipBytes = GL_FALSE; 50963464ebd5Sriastradh swap2 = (bytesPerComp == 2) && unpack->SwapBytes; 50973464ebd5Sriastradh swap4 = (bytesPerComp == 4) && unpack->SwapBytes; 50983464ebd5Sriastradh compsPerRow = components * width; 50993464ebd5Sriastradh assert(compsPerRow >= width); 51003464ebd5Sriastradh } 51013464ebd5Sriastradh 51023464ebd5Sriastradh { 51033464ebd5Sriastradh GLubyte *destBuffer 51043464ebd5Sriastradh = (GLubyte *) malloc(bytesPerRow * height * depth); 51053464ebd5Sriastradh GLubyte *dst; 51063464ebd5Sriastradh GLint img, row; 51073464ebd5Sriastradh if (!destBuffer) 51083464ebd5Sriastradh return NULL; /* generate GL_OUT_OF_MEMORY later */ 51093464ebd5Sriastradh 51103464ebd5Sriastradh dst = destBuffer; 51113464ebd5Sriastradh for (img = 0; img < depth; img++) { 51123464ebd5Sriastradh for (row = 0; row < height; row++) { 51133464ebd5Sriastradh const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels, 51143464ebd5Sriastradh width, height, format, type, img, row, 0); 51153464ebd5Sriastradh 51163464ebd5Sriastradh if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) { 51173464ebd5Sriastradh GLint i; 51183464ebd5Sriastradh flipBytes = GL_FALSE; 51193464ebd5Sriastradh if (unpack->LsbFirst) { 51203464ebd5Sriastradh GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7); 51213464ebd5Sriastradh GLubyte dstMask = 128; 51223464ebd5Sriastradh const GLubyte *s = src; 51233464ebd5Sriastradh GLubyte *d = dst; 51243464ebd5Sriastradh *d = 0; 51253464ebd5Sriastradh for (i = 0; i < width; i++) { 51263464ebd5Sriastradh if (*s & srcMask) { 51273464ebd5Sriastradh *d |= dstMask; 51283464ebd5Sriastradh } 51293464ebd5Sriastradh if (srcMask == 128) { 51303464ebd5Sriastradh srcMask = 1; 51313464ebd5Sriastradh s++; 51323464ebd5Sriastradh } 51333464ebd5Sriastradh else { 51343464ebd5Sriastradh srcMask = srcMask << 1; 51353464ebd5Sriastradh } 51363464ebd5Sriastradh if (dstMask == 1) { 51373464ebd5Sriastradh dstMask = 128; 51383464ebd5Sriastradh d++; 51393464ebd5Sriastradh *d = 0; 51403464ebd5Sriastradh } 51413464ebd5Sriastradh else { 51423464ebd5Sriastradh dstMask = dstMask >> 1; 51433464ebd5Sriastradh } 51443464ebd5Sriastradh } 51453464ebd5Sriastradh } 51463464ebd5Sriastradh else { 51473464ebd5Sriastradh GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7); 51483464ebd5Sriastradh GLubyte dstMask = 128; 51493464ebd5Sriastradh const GLubyte *s = src; 51503464ebd5Sriastradh GLubyte *d = dst; 51513464ebd5Sriastradh *d = 0; 51523464ebd5Sriastradh for (i = 0; i < width; i++) { 51533464ebd5Sriastradh if (*s & srcMask) { 51543464ebd5Sriastradh *d |= dstMask; 51553464ebd5Sriastradh } 51563464ebd5Sriastradh if (srcMask == 1) { 51573464ebd5Sriastradh srcMask = 128; 51583464ebd5Sriastradh s++; 51593464ebd5Sriastradh } 51603464ebd5Sriastradh else { 51613464ebd5Sriastradh srcMask = srcMask >> 1; 51623464ebd5Sriastradh } 51633464ebd5Sriastradh if (dstMask == 1) { 51643464ebd5Sriastradh dstMask = 128; 51653464ebd5Sriastradh d++; 51663464ebd5Sriastradh *d = 0; 51673464ebd5Sriastradh } 51683464ebd5Sriastradh else { 51693464ebd5Sriastradh dstMask = dstMask >> 1; 51703464ebd5Sriastradh } 51713464ebd5Sriastradh } 51723464ebd5Sriastradh } 51733464ebd5Sriastradh } 51743464ebd5Sriastradh else { 51753464ebd5Sriastradh memcpy(dst, src, bytesPerRow); 51763464ebd5Sriastradh } 51773464ebd5Sriastradh 51783464ebd5Sriastradh /* byte flipping/swapping */ 51793464ebd5Sriastradh if (flipBytes) { 51803464ebd5Sriastradh flip_bytes((GLubyte *) dst, bytesPerRow); 51813464ebd5Sriastradh } 51823464ebd5Sriastradh else if (swap2) { 51833464ebd5Sriastradh _mesa_swap2((GLushort*) dst, compsPerRow); 51843464ebd5Sriastradh } 51853464ebd5Sriastradh else if (swap4) { 51863464ebd5Sriastradh _mesa_swap4((GLuint*) dst, compsPerRow); 51873464ebd5Sriastradh } 51883464ebd5Sriastradh dst += bytesPerRow; 51893464ebd5Sriastradh } 51903464ebd5Sriastradh } 51913464ebd5Sriastradh return destBuffer; 51923464ebd5Sriastradh } 51933464ebd5Sriastradh} 51943464ebd5Sriastradh 5195