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