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