11c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
21c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Mesa 3-D graphics library
31c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
41c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
51c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
61c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
71c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
81c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * copy of this software and associated documentation files (the "Software"),
91c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * to deal in the Software without restriction, including without limitation
101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Software is furnished to do so, subject to the following conditions:
131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * The above copyright notice and this permission notice shall be included
151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * in all copies or substantial portions of the Software.
161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \file pack.c
281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Image and pixel span packing and unpacking.
291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
321a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca/*
331a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
341a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * this global optimization.
351a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca *
361a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * See also:
371a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
381a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
391a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca */
401a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca#if defined(_MSC_VER) && defined(_M_X64)
411a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca#  pragma optimize( "g", off )
421a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca#endif
431a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca
441a8f6ac5a46dfbb8287ee2bacdd11c3a1a3a65c7José Fonseca
451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "glheader.h"
461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "colormac.h"
471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "enums.h"
481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "image.h"
49b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#include "imports.h"
50b098e1af1cdaea8767b8f1416469cdd02a9c39a9Brian Paul#include "macros.h"
510117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h"
531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pixeltransfer.h"
549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák#include "imports.h"
559ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen#include "glformats.h"
561271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Flip the 8 bits in each byte of the given array.
621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param p array.
641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param n number of bytes.
651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \todo try this trick to flip bytes someday:
671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \code
681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \endcode
721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
731c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void
741c131752c3e07ef91f49d4970dafca6d26585334Brian Paulflip_bytes( GLubyte *p, GLuint n )
751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLuint i, a, b;
771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   for (i = 0; i < n; i++) {
781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      b = (GLuint) p[i];        /* words are often faster than bytes */
791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      a = ((b & 0x01) << 7) |
801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x02) << 5) |
811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x04) << 3) |
821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x08) << 1) |
831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x10) >> 1) |
841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x20) >> 3) |
851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x40) >> 5) |
861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul	  ((b & 0x80) >> 7);
871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      p[i] = (GLubyte) a;
881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a 32x32 pixel polygon stipple from user memory using the
951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * current pixel unpack settings.
961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
971c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
1001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
1011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
1021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ptrn) {
1031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
1041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * endian differences
1051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
1061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *p = ptrn;
1071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint i;
1081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (i = 0; i < 32; i++) {
1091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         dest[i] = (p[0] << 24)
1101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                 | (p[1] << 16)
1111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                 | (p[2] <<  8)
1121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                 | (p[3]      );
1131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         p += 4;
1141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
1151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      free(ptrn);
1161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
1171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
1181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
1211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack polygon stipple into user memory given current pixel packing
1221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * settings.
1231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
1241c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
1251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
1261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                            const struct gl_pixelstore_attrib *packing )
1271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
1281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
1291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * endian differences.
1301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
1311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLubyte ptrn[32*4];
1321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLint i;
1331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   for (i = 0; i < 32; i++) {
1341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
1351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
1361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
1371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
1381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
1391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
1411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
1421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
1451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
1461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * order with row alignment = 1 byte.
1471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
1481c131752c3e07ef91f49d4970dafca6d26585334Brian PaulGLvoid *
1491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
1501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     const struct gl_pixelstore_attrib *packing )
1511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
1521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLint bytes, row, width_in_bytes;
1531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLubyte *buffer, *dst;
1541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (!pixels)
1561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return NULL;
1571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* Alloc dest storage */
1591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   bytes = ((width + 7) / 8 * height);
1601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   buffer = (GLubyte *) malloc( bytes );
1611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (!buffer)
1621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return NULL;
1631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   width_in_bytes = CEILING( width, 8 );
1651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   dst = buffer;
1661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   for (row = 0; row < height; row++) {
1671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const GLubyte *src = (const GLubyte *)
1681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_image_address2d(packing, pixels, width, height,
1691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               GL_COLOR_INDEX, GL_BITMAP, row, 0);
1701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (!src) {
1711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         free(buffer);
1721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return NULL;
1731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
1741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if ((packing->SkipPixels & 7) == 0) {
1761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         memcpy( dst, src, width_in_bytes );
1771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (packing->LsbFirst) {
1781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            flip_bytes( dst, width_in_bytes );
1791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
1801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
1811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
1821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
1831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint i;
1841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (packing->LsbFirst) {
1851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
1861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte dstMask = 128;
1871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *s = src;
1881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *d = dst;
1891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *d = 0;
1901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < width; i++) {
1911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (*s & srcMask) {
1921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d |= dstMask;
1931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
1941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (srcMask == 128) {
1951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = 1;
1961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  s++;
1971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
1981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
1991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = srcMask << 1;
2001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (dstMask == 1) {
2021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = 128;
2031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  d++;
2041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
2051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
2071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = dstMask >> 1;
2081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
2101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
2111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
2121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
2131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte dstMask = 128;
2141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *s = src;
2151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *d = dst;
2161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *d = 0;
2171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < width; i++) {
2181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (*s & srcMask) {
2191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d |= dstMask;
2201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (srcMask == 1) {
2221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = 128;
2231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  s++;
2241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
2261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = srcMask >> 1;
2271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (dstMask == 1) {
2291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = 128;
2301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  d++;
2311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
2321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
2341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = dstMask >> 1;
2351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
2371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
2381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
2391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      dst += width_in_bytes;
2401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
2411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   return buffer;
2431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
2441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
2471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack bitmap data.
2481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
2491c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
2501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
2511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
2521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
2531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLint row, width_in_bytes;
2541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   const GLubyte *src;
2551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (!source)
2571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return;
2581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   width_in_bytes = CEILING( width, 8 );
2601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   src = source;
2611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   for (row = 0; row < height; row++) {
2621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
2631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
2641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (!dst)
2651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
2661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if ((packing->SkipPixels & 7) == 0) {
2681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         memcpy( dst, src, width_in_bytes );
2691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (packing->LsbFirst) {
2701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            flip_bytes( dst, width_in_bytes );
2711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
2721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
2731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
2741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
2751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint i;
2761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (packing->LsbFirst) {
2771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte srcMask = 128;
2781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
2791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *s = src;
2801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *d = dst;
2811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *d = 0;
2821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < width; i++) {
2831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (*s & srcMask) {
2841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d |= dstMask;
2851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (srcMask == 1) {
2871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = 128;
2881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  s++;
2891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
2911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = srcMask >> 1;
2921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (dstMask == 128) {
2941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = 1;
2951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  d++;
2961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
2971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
2981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
2991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = dstMask << 1;
3001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
3021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
3031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
3041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte srcMask = 128;
3051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
3061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *s = src;
3071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *d = dst;
3081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *d = 0;
3091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < width; i++) {
3101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (*s & srcMask) {
3111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d |= dstMask;
3121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (srcMask == 1) {
3141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = 128;
3151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  s++;
3161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
3181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  srcMask = srcMask >> 1;
3191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (dstMask == 1) {
3211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = 128;
3221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  d++;
3231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
3241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
3261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dstMask = dstMask >> 1;
3271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
3281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
3291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
3301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
3311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      src += width_in_bytes;
3321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
3331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
3341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
336e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul/**
337e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * Get indexes of color components for a basic color format, such as
338e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc.  Return -1 for indexes
339e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * that do not apply.
340e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul */
341e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulstatic void
342e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulget_component_indexes(GLenum format,
343e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *redIndex,
344e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *greenIndex,
345e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *blueIndex,
346e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *alphaIndex,
347e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *luminanceIndex,
348e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                      GLint *intensityIndex)
349e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul{
350e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *redIndex = -1;
351e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *greenIndex = -1;
352e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *blueIndex = -1;
353e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *alphaIndex = -1;
354e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *luminanceIndex = -1;
355e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   *intensityIndex = -1;
356e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
357e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   switch (format) {
358e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE:
359e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_INTEGER_EXT:
360e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *luminanceIndex = 0;
361e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
362e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_ALPHA:
363e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
364e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *luminanceIndex = 0;
365e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *alphaIndex = 1;
366e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
367e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_INTENSITY:
368e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *intensityIndex = 0;
369e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
370e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RED:
371e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RED_INTEGER_EXT:
372e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 0;
373e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
374e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_GREEN:
375e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_GREEN_INTEGER_EXT:
376e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 0;
377e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
378e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BLUE:
379e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BLUE_INTEGER_EXT:
380e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 0;
381e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
382e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ALPHA:
383e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ALPHA_INTEGER_EXT:
384e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *alphaIndex = 0;
385e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
386e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RG:
387e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RG_INTEGER:
388e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 0;
389e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
390e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
391e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGB:
392e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGB_INTEGER_EXT:
393e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 0;
394e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
395e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 2;
396e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
397e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGR:
398e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGR_INTEGER_EXT:
399e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 0;
400e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
401e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 2;
402e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
403e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGBA:
404e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGBA_INTEGER_EXT:
405e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 0;
406e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
407e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 2;
408e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *alphaIndex = 3;
409e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
410e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGRA:
411e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGRA_INTEGER:
412e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 2;
413e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
414e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 0;
415e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *alphaIndex = 3;
416e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
417e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ABGR_EXT:
418e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 3;
419e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 2;
420e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *blueIndex = 1;
421e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *alphaIndex = 0;
422e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
423e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_DU8DV8_ATI:
424e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_DUDV_ATI:
425e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *redIndex = 0;
426e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      *greenIndex = 1;
427e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
428e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   default:
429e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      assert(0 && "bad format in get_component_indexes()");
430e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   }
431e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul}
432e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
433e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
4341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
435f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul/**
436f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * For small integer types, return the min and max possible values.
437f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * Used for clamping floats to unscaled integer types.
438f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * \return GL_TRUE if type is handled, GL_FALSE otherwise.
439f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul */
440f6dbb693d211feca9980437c54897ca6619e0a15Brian Paulstatic GLboolean
441f6dbb693d211feca9980437c54897ca6619e0a15Brian Paulget_type_min_max(GLenum type, GLfloat *min, GLfloat *max)
442f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul{
443f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   switch (type) {
444f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   case GL_BYTE:
445f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *min = -128.0;
446f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *max = 127.0;
447f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      return GL_TRUE;
448f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   case GL_UNSIGNED_BYTE:
449f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *min = 0.0;
450f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *max = 255.0;
451f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      return GL_TRUE;
452f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   case GL_SHORT:
453f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *min = -32768.0;
454f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *max = 32767.0;
455f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      return GL_TRUE;
456f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   case GL_UNSIGNED_SHORT:
457f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *min = 0.0;
458f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      *max = 65535.0;
459f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      return GL_TRUE;
460f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   default:
461f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      return GL_FALSE;
462f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   }
463f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul}
464f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul
4657ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen/* Customization of unsigned integer packing.
4668f9edbad6f972792a51234715aad83c406e1845dDave Airlie */
467d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define SRC_TYPE GLuint
468d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
469d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLuint
470d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define SRC_CONVERT(x) (x)
471d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_uint_from_uint_rgba
472d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h"
473d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE
474d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT
475d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME
476d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
4777ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLint
4787ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MIN2(x, 0x7fffffff)
4797ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_int_from_uint_rgba
4807ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
4817ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
4827ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
4837ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
4847ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
485d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLushort
4868b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) MIN2(x, 0xffff)
487d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_ushort_from_uint_rgba
488d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h"
489d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE
490d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT
491d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME
492d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
493d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLshort
4948b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
495d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_short_from_uint_rgba
496d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h"
497d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE
498d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT
499d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME
500d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
501d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLubyte
5028b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) MIN2(x, 0xff)
503d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_ubyte_from_uint_rgba
504d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h"
505d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE
506d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT
507d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME
508d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
509d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define DST_TYPE GLbyte
5108b97bb02fb1a55a6b0fe558ea1eb97bb4dae0347Eric Anholt#define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
511d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#define FN_NAME pack_byte_from_uint_rgba
512d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#include "pack_tmp.h"
513d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef DST_TYPE
514d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef SRC_CONVERT
515d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt#undef FN_NAME
516d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt
5177ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_TYPE
5187ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
519f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justenstatic void
520f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen_pack_rgba_span_from_uints_problem(struct gl_context *ctx,
521f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                                   GLenum dstFormat, GLenum dstType)
522f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen{
523f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   _mesa_problem(ctx,
524f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 "Unsupported type (%s) / format (%s) "
525f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 "in _mesa_pack_rgba_span_from_uints",
526f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 _mesa_lookup_enum_by_nr(dstType),
527f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 _mesa_lookup_enum_by_nr(dstFormat));
528f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen}
529f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen
5308f9edbad6f972792a51234715aad83c406e1845dDave Airlievoid
5317ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4],
5327ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen                                GLenum dstFormat, GLenum dstType,
5337ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen                                GLvoid *dstAddr)
5348f9edbad6f972792a51234715aad83c406e1845dDave Airlie{
535f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   GLuint i;
536f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen
5378f9edbad6f972792a51234715aad83c406e1845dDave Airlie   switch(dstType) {
538d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_UNSIGNED_INT:
5398c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen      pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
5408f9edbad6f972792a51234715aad83c406e1845dDave Airlie      break;
541d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_INT:
5427ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
543d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt      break;
544d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_UNSIGNED_SHORT:
5458c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen      pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
546d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt      break;
547d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_SHORT:
5488c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen      pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
549d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt      break;
550d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_UNSIGNED_BYTE:
5518c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen      pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
552d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt      break;
553d6c58545a1da8c83f0aad296a5e9e31a7c77cfe4Eric Anholt   case GL_BYTE:
5548c265cf5ef47ac8ae8565456d8ac023d6c847d57Jordan Justen      pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
5558f9edbad6f972792a51234715aad83c406e1845dDave Airlie      break;
556f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_BYTE_3_3_2:
557f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
558f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLubyte *dst = (GLubyte *) dstAddr;
559f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
560f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5)
561f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 2)
562f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 3)     );
563f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
564f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
565f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
566f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
567f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
568f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_BYTE_2_3_3_REV:
569f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
570f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLubyte *dst = (GLubyte *) dstAddr;
571f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
572f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7)     )
573f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 3)
574f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 3) << 6);
575f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
576f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
577f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
578f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
579f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
580f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_6_5:
581f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
582f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
583f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
584f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
585f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
586f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31)      );
587f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
588f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
589f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
590f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
591f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
592f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_6_5_REV:
593f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
594f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
595f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
596f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
597f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
598f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 11);
599f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
600f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
601f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
602f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
603f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
604f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_4_4_4_4:
605f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
606f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
607f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
608f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12)
609f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
610f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
611f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
612f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
613f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
614f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
615f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
616f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
617f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12)
618f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
619f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  4)
620f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
621f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
622f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
623f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
624f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
625f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
626f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12)
627f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
628f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
629f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15)      );
630f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
631f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
632f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
633f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
634f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
635f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
636f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
637f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
638f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
639f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15)      )
640f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
641f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
642f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
643f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
644f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
645f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
646f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
647f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
648f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15)      )
649f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
650f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  8)
651f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
652f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
653f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
654f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
655f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
656f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
657f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15)      )
658f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
659f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
660f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) << 12);
661f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
662f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
663f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
664f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
665f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
666f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_5_5_1:
667f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
668f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
669f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
670f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
671f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
672f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  1)
673f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
674f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
675f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
676f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
677f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
678f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
679f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11)
680f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
681f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 31) <<  1)
682f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
683f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
684f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
685f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
686f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
687f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
688f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11)
689f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  6)
690f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  1)
691f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,  1)      );
692f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
693f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
694f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
695f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
696f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
697f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
698f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
699f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
700f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
701f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
702f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
703f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 10)
704f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
705f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
706f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
707f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
708f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
709f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
710f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31)      )
711f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
712f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 31) << 10)
713f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
714f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
715f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
716f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
717f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
718f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
719f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31)      )
720f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  5)
721f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) << 10)
722f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,  1) << 15);
723f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
724f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
725f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
726f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
727f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
728f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_8_8_8_8:
729f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
730f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
731f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
732f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24)
733f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
734f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
735f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
736f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
737f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
738f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
739f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
740f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
741f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24)
742f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
743f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) <<  8)
744f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
745f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
746f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
747f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
748f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
749f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
750f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24)
751f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
752f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
753f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255)      );
754f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
755f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
756f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
757f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
758f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
759f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_8_8_8_8_REV:
760f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
761f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
762f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
763f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255)      )
764f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
765f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
766f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
767f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
768f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
769f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
770f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
771f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
772f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255)      )
773f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
774f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 16)
775f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
776f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
777f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
778f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
779f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
780f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
781f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255)      )
782f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
783f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
784f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 24);
785f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
786f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
787f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
788f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
789f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
790f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_10_10_10_2:
791f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
792f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
793f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
794f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22)
795f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
796f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) <<  2)
797f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
798f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
799f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
800f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
801f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
802f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
803f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22)
804f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
805f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 1023) <<  2)
806f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
807f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
808f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
809f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
810f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
811f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
812f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22)
813f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12)
814f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) <<  2)
815f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,    3)      );
816f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
817f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
818f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
819f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
820f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
821f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_2_10_10_10_REV:
822f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
823f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
824f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
825f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023)      )
826f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
827f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20)
828f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
829f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
830f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
831f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
832f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
833f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
834f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023)      )
835f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
836f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20)
837f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
838f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
839f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
840f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
841f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
842f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
843f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023)      )
844f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10)
845f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20)
846f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,    3) << 30);
847f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
848f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
849f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
850f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
851f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
8527ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   default:
853f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
8547ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      return;
8557ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   }
8567ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen}
8577ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8587ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8597ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen/* Customization of signed integer packing.
8607ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen */
8617ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_TYPE GLint
8627ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8637ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLuint
8647ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0)
8657ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_uint_from_int_rgba
8667ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
8677ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
8687ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
8697ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
8707ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8717ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLushort
8727ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0)
8737ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_ushort_from_int_rgba
8747ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
8757ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
8767ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
8777ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
8787ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8797ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLshort
8807ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff)
8817ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_short_from_int_rgba
8827ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
8837ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
8847ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
8857ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
8867ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8877ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLubyte
8887ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) MAX2(x, 0)
8897ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_ubyte_from_int_rgba
8907ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
8917ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
8927ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
8937ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
8947ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
8957ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define DST_TYPE GLbyte
8967ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f)
8977ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#define FN_NAME pack_byte_from_int_rgba
8987ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#include "pack_tmp.h"
8997ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef DST_TYPE
9007ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_CONVERT
9017ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef FN_NAME
9027ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
9037ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen#undef SRC_TYPE
9047ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
905f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justenstatic void
906f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen_pack_rgba_span_from_ints_problem(struct gl_context *ctx,
907f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                                   GLenum dstFormat, GLenum dstType)
908f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen{
909f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   _mesa_problem(ctx,
910f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 "Unsupported type (%s) / format (%s) "
911f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 "in _mesa_pack_rgba_span_from_ints",
912f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 _mesa_lookup_enum_by_nr(dstType),
913f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                 _mesa_lookup_enum_by_nr(dstFormat));
914f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen}
915f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen
9167ef270867cb1f3e19067c93449e48987a32730d3Jordan Justenvoid
9177ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen_mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4],
9187ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen                               GLenum dstFormat, GLenum dstType,
9197ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen                               GLvoid *dstAddr)
9207ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen{
921f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   GLuint i;
9227ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen
9237ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   switch(dstType) {
9247ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_UNSIGNED_INT:
9257ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
9267ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
9277ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_INT:
9287ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      /* No conversion necessary. */
929fd41cbc557509a36ae513eb7170edffbaa5e5715Brian Paul      pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n);
9307ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
9317ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_UNSIGNED_SHORT:
9327ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
9337ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
9347ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_SHORT:
9357ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
9367ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
9377ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_UNSIGNED_BYTE:
9387ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
9397ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
9407ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen   case GL_BYTE:
9417ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
9427ef270867cb1f3e19067c93449e48987a32730d3Jordan Justen      break;
943f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_BYTE_3_3_2:
944f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
945f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLubyte *dst = (GLubyte *) dstAddr;
946f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
947f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5)
948f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 2)
949f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 3)     );
950f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
951f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
952f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
953f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
954f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
955f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_BYTE_2_3_3_REV:
956f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
957f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLubyte *dst = (GLubyte *) dstAddr;
958f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
959f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7)     )
960f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 3)
961f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 3) << 6);
962f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
963f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
964f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
965f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
966f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
967f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_6_5:
968f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
969f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
970f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
971f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
972f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
973f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31)      );
974f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
975f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
976f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
977f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
978f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
979f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_6_5_REV:
980f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
981f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
982f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
983f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
984f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
985f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 11);
986f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
987f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
988f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
989f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
990f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
991f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_4_4_4_4:
992f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
993f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
994f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
995f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12)
996f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
997f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
998f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
999f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1000f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1001f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1002f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1003f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1004f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12)
1005f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
1006f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  4)
1007f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
1008f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1009f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1010f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1011f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1012f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1013f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12)
1014f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
1015f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1016f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15)      );
1017f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1018f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1019f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1020f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1021f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1022f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1023f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1024f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1025f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1026f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15)      )
1027f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1028f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
1029f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
1030f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1031f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1032f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1033f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1034f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1035f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15)      )
1036f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1037f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  8)
1038f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
1039f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1040f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1041f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1042f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1043f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1044f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15)      )
1045f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
1046f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
1047f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 15) << 12);
1048f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1049f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1050f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1051f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1052f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1053f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_5_5_5_1:
1054f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1055f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1056f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1057f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
1058f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
1059f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  1)
1060f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
1061f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1062f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1063f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1064f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1065f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1066f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11)
1067f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
1068f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 31) <<  1)
1069f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
1070f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1071f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1072f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1073f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1074f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1075f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11)
1076f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  6)
1077f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  1)
1078f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,  1)      );
1079f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1080f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1081f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1082f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1083f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1084f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1085f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1086f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1087f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1088f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
1089f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
1090f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 10)
1091f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
1092f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1093f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1094f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1095f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1096f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1097f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31)      )
1098f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
1099f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 31) << 10)
1100f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
1101f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1102f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1103f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1104f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLushort *dst = (GLushort *) dstAddr;
1105f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1106f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31)      )
1107f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  5)
1108f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 31) << 10)
1109f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,  1) << 15);
1110f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1111f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1112f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1113f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1114f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1115f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_8_8_8_8:
1116f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1117f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1118f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1119f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24)
1120f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1121f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
1122f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
1123f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1124f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1125f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1126f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1127f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1128f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24)
1129f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1130f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) <<  8)
1131f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
1132f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1133f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1134f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1135f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1136f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1137f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24)
1138f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
1139f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1140f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255)      );
1141f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1142f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1143f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1144f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1145f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1146f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_8_8_8_8_REV:
1147f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1148f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1149f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1150f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255)      )
1151f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1152f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
1153f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
1154f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1155f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1156f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1157f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1158f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1159f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255)      )
1160f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1161f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 16)
1162f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
1163f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1164f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1165f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1166f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1167f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1168f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255)      )
1169f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
1170f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1171f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 24);
1172f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1173f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1174f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1175f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1176f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1177f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_10_10_10_2:
1178f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1179f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1180f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1181f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22)
1182f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
1183f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) <<  2)
1184f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
1185f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1186f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1187f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1188f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1189f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1190f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22)
1191f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
1192f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 1023) <<  2)
1193f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
1194f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1195f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1196f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1197f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1198f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1199f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22)
1200f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12)
1201f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) <<  2)
1202f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,    3)      );
1203f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1204f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1205f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1206f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1207f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
1208f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen   case GL_UNSIGNED_INT_2_10_10_10_REV:
1209f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1210f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1211f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1212f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023)      )
1213f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
1214f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20)
1215f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
1216f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1217f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1218f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1219f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1220f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1221f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023)      )
1222f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
1223f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20)
1224f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
1225f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1226f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1227f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      else if (dstFormat == GL_ABGR_EXT) {
1228f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         GLuint *dst = (GLuint *) dstAddr;
1229f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         for (i=0;i<n;i++) {
1230f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023)      )
1231f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10)
1232f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20)
1233f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen                   | (CLAMP(rgba[i][RCOMP], 0,    3) << 30);
1234f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         }
1235f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      } else {
1236f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1237f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      }
1238f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      break;
12398f9edbad6f972792a51234715aad83c406e1845dDave Airlie   default:
1240f7333b6345deb1c0322079039544bc322ca1dad9Jordan Justen      _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
12418f9edbad6f972792a51234715aad83c406e1845dDave Airlie      return;
12428f9edbad6f972792a51234715aad83c406e1845dDave Airlie   }
12438f9edbad6f972792a51234715aad83c406e1845dDave Airlie}
12441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
12451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
12461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
12471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Used to pack an array [][4] of RGBA float colors as specified
1248f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * by the dstFormat, dstType and dstPacking.  Used by glReadPixels.
1249f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * Historically, the RGBA values were in [0,1] and rescaled to fit
1250f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * into GLubytes, etc.  But with new integer formats, the RGBA values
1251f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * may have any value and we don't always rescale when converting to
1252f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul * integers.
1253f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul *
12541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Note: the rgba values will be modified by this function when any pixel
12551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * transfer ops are enabled.
12561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
12571c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
12581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
12591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLenum dstFormat, GLenum dstType,
12601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLvoid *dstAddr,
12611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           const struct gl_pixelstore_attrib *dstPacking,
12621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLbitfield transferOps)
12631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
126436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   GLfloat *luminance;
12651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
12669ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen   const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat);
12671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLuint i;
12681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
126936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   if (dstFormat == GL_LUMINANCE ||
127036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul       dstFormat == GL_LUMINANCE_ALPHA ||
127136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul       dstFormat == GL_LUMINANCE_INTEGER_EXT ||
127236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul       dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) {
127336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      luminance = (GLfloat *) malloc(n * sizeof(GLfloat));
127436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      if (!luminance) {
127536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
127636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         return;
127736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      }
127836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
127936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   else {
128036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      luminance = NULL;
128136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
128236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
12831ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie   /* EXT_texture_integer specifies no transfer ops on integer
12841ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    * types in the resolved issues section. Just set them to 0
12851ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    * for integer surfaces.
12861ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    */
12871ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie   if (intDstFormat)
12881ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie      transferOps = 0;
12891ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie
12901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (transferOps) {
12911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
12921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
12931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
1294f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   /*
1295f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul    * Component clamping (besides clamping to [0,1] in
1296f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul    * _mesa_apply_rgba_transfer_ops()).
1297f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul    */
1298f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   if (intDstFormat) {
1299f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      /* clamping to dest type's min/max values */
1300f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      GLfloat min, max;
1301f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      if (get_type_min_max(dstType, &min, &max)) {
1302f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul         for (i = 0; i < n; i++) {
1303f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
1304f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
1305f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
1306f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
1307f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul         }
1308f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul      }
1309f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   }
1310f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul   else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
13111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* compute luminance values */
13121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (transferOps & IMAGE_CLAMP_BIT) {
13131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
13141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
13151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
13161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
13171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
13181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
13191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
13201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
13211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
13221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
13231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
13241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
13251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /*
13261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
13271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
13281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (dstType) {
13291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE:
13301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
13311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *dst = (GLubyte *) dstAddr;
13321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
13331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
13341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
13351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
13361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
13381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
13391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
13401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
13421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
13431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
13461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
13471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
13481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
13501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
13511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
13521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
13541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
13561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
13571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
13581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1359f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
1360f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1361f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1362f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1363f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1364f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
13651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
13661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
13681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
13691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
13711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
13731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
13751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
13761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
13781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
13791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
13811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
13841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
13851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
13861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
13881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
13911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
13921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
13931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
13941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
13951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
13961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
13971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
13981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
13991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
14001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
14011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
14021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1403f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
1404f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1405f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLubyte) rgba[i][RCOMP];
1406f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1407f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1408f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
1409f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1410f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLubyte) rgba[i][GCOMP];
1411f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1412f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1413f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
1414f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1415f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLubyte) rgba[i][BCOMP];
1416f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1417f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1418f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
1419f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1420f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLubyte) rgba[i][ACOMP];
1421f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1422f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
14230e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
14240e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
14250e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+0] = (GLubyte) rgba[i][RCOMP];
14260e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+1] = (GLubyte) rgba[i][GCOMP];
14270e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
14280e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
1429f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
1430f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1431f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
1432f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
1433f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
1434f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1435f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1436f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
1437f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1438f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
1439f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
1440f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
1441f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
1442f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1443f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1444f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
1445f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1446f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
1447f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
1448f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
1449f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1450f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1451f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
1452f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1453f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
1454f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
1455f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
1456f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
1457f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1458f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1459f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
1460f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1461f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
1462f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                             rgba[i][GCOMP] +
1463f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                             rgba[i][BCOMP]);
1464f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
1465f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1466f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1467f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1468f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1469f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLubyte) (rgba[i][RCOMP] +
1470f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                         rgba[i][GCOMP] +
1471f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                         rgba[i][BCOMP]);
1472f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1473f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
14741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
14751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
14761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
14771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
14781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
14791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
14801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
14811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
14821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
14831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
14841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
14851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
14861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_BYTE:
14871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
14881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLbyte *dst = (GLbyte *) dstAddr;
14891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
14901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
14911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
14921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
14931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
14941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
14951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
14961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
14971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
14981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
14991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
15001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
15031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
15041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
15051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
15071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
15081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
15091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
15111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
15131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
15141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1516f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
1517f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1518f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1519f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1520f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1521f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
15221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
15231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
15251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
15261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
15301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
15321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
15331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
15351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
15381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
15411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
15421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
15441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
15451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
15481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
15491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
15501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul		  break;
15521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
15531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
15541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
15551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
15561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
15571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
15581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
15591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1560f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
1561f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1562f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLbyte) rgba[i][RCOMP];
1563f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1564f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1565f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
1566f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1567f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLbyte) rgba[i][GCOMP];
1568f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1569f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1570f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
1571f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1572f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLbyte) rgba[i][BCOMP];
1573f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1574f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1575f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
1576f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1577f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLbyte) rgba[i][ACOMP];
1578f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1579f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
15800e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
15810e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
15820e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+0] = (GLbyte) rgba[i][RCOMP];
15830e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+1] = (GLbyte) rgba[i][GCOMP];
15840e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
15850e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
1586f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
1587f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1588f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
1589f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
1590f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
1591f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1592f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1593f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
1594f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1595f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
1596f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
1597f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
1598f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
1599f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1600f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1601f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
1602f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1603f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
1604f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
1605f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
1606f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1607f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1608f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
1609f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1610f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
1611f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
1612f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
1613f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
1614f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1615f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1616f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
1617f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1618f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
1619f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                            rgba[i][GCOMP] +
1620f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                            rgba[i][BCOMP]);
1621f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
1622f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1623f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1624f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1625f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1626f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLbyte) (rgba[i][RCOMP] +
1627f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                        rgba[i][GCOMP] +
1628f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                        rgba[i][BCOMP]);
1629f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1630f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
16311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
16321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
16331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
16341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
16351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
16361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
16371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
16391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
16401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
16411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
16421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
16431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT:
16441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
16451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
16461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
16471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
16481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
16491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
16501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
16521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
16531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
16541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
16561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
16571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
16581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
16601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
16611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
16621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
16641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
16651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
16661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
16681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
16691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
16701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
16711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
16721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1673f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
1674f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1675f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
1676f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
1677f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1678f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
16791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
16801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
16811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
16821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
16831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
16841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
16851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
16871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
16881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
16891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
16901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
16911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
16921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
16931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
16941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
16951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
16961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
16971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
16981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
16991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
17001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
17011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
17021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
17031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
17041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
17051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
17061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
17071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
17081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
17091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
17101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
17111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
17121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
17131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
17141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
17151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
17161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1717f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
1718f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1719f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLushort) rgba[i][RCOMP];
1720f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1721f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1722f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
1723f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1724f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLushort) rgba[i][GCOMP];
1725f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1726f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1727f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
1728f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1729f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLushort) rgba[i][BCOMP];
1730f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1731f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1732f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
1733f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1734f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLushort) rgba[i][ACOMP];
1735f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1736f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
17370e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
17380e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
17390e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+0] = (GLushort) rgba[i][RCOMP];
17400e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+1] = (GLushort) rgba[i][GCOMP];
17410e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
17420e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
1743f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
1744f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1745f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLushort) rgba[i][RCOMP];
1746f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1747f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLushort) rgba[i][BCOMP];
1748f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1749f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1750f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
1751f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1752f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLushort) rgba[i][RCOMP];
1753f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1754f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLushort) rgba[i][BCOMP];
1755f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1756f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1757f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1758f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
1759f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1760f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLushort) rgba[i][BCOMP];
1761f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1762f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLushort) rgba[i][RCOMP];
1763f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1764f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1765f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
1766f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1767f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLushort) rgba[i][BCOMP];
1768f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1769f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLushort) rgba[i][RCOMP];
1770f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1771f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1772f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1773f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
1774f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1775f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
1776f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                              rgba[i][GCOMP] +
1777f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                              rgba[i][BCOMP]);
1778f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLushort) rgba[i][ACOMP];
1779f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1780f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1781f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1782f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1783f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLushort) (rgba[i][RCOMP] +
1784f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                          rgba[i][GCOMP] +
1785f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                          rgba[i][BCOMP]);
1786f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1787f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
17881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
17891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
17901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
17911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
17921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
17931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
17941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
17951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
17961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
17971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
17981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
17991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
18001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_SHORT:
18011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
18021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLshort *dst = (GLshort *) dstAddr;
18031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
18041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
18051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
18061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
18091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
18101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
18131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
18141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
18171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
18181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
18191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
18211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
18221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
18231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
18251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
18271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
18281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1830f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
1831f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1832f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1833f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1834f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1835f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
18361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
18371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
18441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
18491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
18521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
18581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
18591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
18641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul		  break;
18661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
18671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
18681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
18691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
18701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
18711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
18721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
18731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1874f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
1875f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1876f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLshort) rgba[i][RCOMP];
1877f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1878f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1879f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
1880f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1881f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLshort) rgba[i][GCOMP];
1882f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1883f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1884f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
1885f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1886f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLshort) rgba[i][BCOMP];
1887f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1888f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1889f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
1890f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1891f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLshort) rgba[i][ACOMP];
1892f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1893f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
18940e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
18950e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
18962e8f8cb383320b83ba5d85c27808ac2d841834e6Ian Romanick                     dst[i*2+0] = (GLshort) rgba[i][RCOMP];
18972e8f8cb383320b83ba5d85c27808ac2d841834e6Ian Romanick                     dst[i*2+1] = (GLshort) rgba[i][GCOMP];
18980e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
18990e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
1900f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
1901f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1902f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLshort) rgba[i][RCOMP];
1903f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1904f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1905f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1906f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1907f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
1908f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1909f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLshort) rgba[i][RCOMP];
1910f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1911f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLshort) rgba[i][BCOMP];
1912f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1913f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1914f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1915f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
1916f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1917f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLshort) rgba[i][BCOMP];
1918f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1919f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLshort) rgba[i][RCOMP];
1920f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1921f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1922f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
1923f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1924f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLshort) rgba[i][BCOMP];
1925f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1926f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLshort) rgba[i][RCOMP];
1927f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1928f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1929f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1930f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
1931f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1932f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
1933f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                             rgba[i][GCOMP] +
1934f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                             rgba[i][BCOMP]);
1935f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLshort) rgba[i][ACOMP];
1936f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1937f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
1938f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1939f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1940f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLshort) (rgba[i][RCOMP] +
1941f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                         rgba[i][GCOMP] +
1942f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                         rgba[i][BCOMP]);
1943f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1944f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
19451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
19461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
19471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
19481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
19491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
19501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
19511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
19531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
19541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
19551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
19561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
19571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT:
19581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
19591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
19601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
19611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
19621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
19631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
19641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
19661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
19671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
19681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
19701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
19711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
19721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
19741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
19751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
19761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
19781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
19791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
19801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
19811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
19821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
19831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
19841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
19851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
19861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
1987f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
1988f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
1989f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1990f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1991f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
1992f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
19931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
19941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
19951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
19961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
19971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
19981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
19991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
20001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
20011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
20021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
20031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
20041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
20051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
20061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
20071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
20081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
20091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
20101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
20111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
20121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
20131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
20141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
20151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
20161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
20171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
20181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
20191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
20201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
20211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
20221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
20231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
20241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
20251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
20261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
20271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
20281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
20291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
20301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
2031f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
2032f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2033f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLuint) rgba[i][RCOMP];
2034f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2035f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2036f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
2037f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2038f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLuint) rgba[i][GCOMP];
2039f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2040f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2041f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
2042f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2043f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLuint) rgba[i][BCOMP];
2044f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2045f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2046f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
2047f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2048f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLuint) rgba[i][ACOMP];
2049f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2050f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
20510e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
20520e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
20530e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+0] = (GLuint) rgba[i][RCOMP];
20540e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+1] = (GLuint) rgba[i][GCOMP];
20550e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
20560e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
2057f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
2058f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2059f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLuint) rgba[i][RCOMP];
2060f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
2061f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLuint) rgba[i][BCOMP];
2062f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2063f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2064f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
2065f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2066f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLuint) rgba[i][RCOMP];
2067f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
2068f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLuint) rgba[i][BCOMP];
2069f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
2070f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2071f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2072f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
2073f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2074f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLuint) rgba[i][BCOMP];
2075f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
2076f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLuint) rgba[i][RCOMP];
2077f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2078f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2079f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
2080f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2081f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLuint) rgba[i][BCOMP];
2082f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
2083f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLuint) rgba[i][RCOMP];
2084f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
2085f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2086f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2087f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
2088f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2089f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
2090f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                            rgba[i][GCOMP] +
2091f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                            rgba[i][BCOMP]);
2092f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLuint) rgba[i][ACOMP];
2093f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2094f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2095f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2096f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2097f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLuint) (rgba[i][RCOMP] +
2098f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                        rgba[i][GCOMP] +
2099f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                        rgba[i][BCOMP]);
2100f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2101f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
21021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
21031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
21041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
21061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
21071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
21101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
21111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
21121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
21131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
21141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_INT:
21151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
21161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLint *dst = (GLint *) dstAddr;
21171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
21181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
21191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
21201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
21211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
21231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
21241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
21251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
21271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
21281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
21291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
21311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
21321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
21331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
21351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
21361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
21371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
21391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
21411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
21421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
2144f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
2145f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2146f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2147f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2148f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2149f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
21501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
21511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
21531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
21541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
21551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
21581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
21601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
21611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
21621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
21631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
21661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
21681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
21691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
21701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
21731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
21751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
21761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
21771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
21781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
21811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
21831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
21841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
21851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
21861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
21881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
21891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
21901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
21911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
21921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
21931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
21941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
2195f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RED_INTEGER_EXT:
2196f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2197f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLint) rgba[i][RCOMP];
2198f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2199f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2200f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_GREEN_INTEGER_EXT:
2201f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2202f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLint) rgba[i][GCOMP];
2203f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2204f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2205f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BLUE_INTEGER_EXT:
2206f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2207f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLint) rgba[i][BCOMP];
2208f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2209f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2210f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_ALPHA_INTEGER_EXT:
2211f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2212f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLint) rgba[i][ACOMP];
2213f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2214f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
22150e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick               case GL_RG_INTEGER:
22160e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  for (i=0;i<n;i++) {
22170e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+0] = (GLint) rgba[i][RCOMP];
22180e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                     dst[i*2+1] = (GLint) rgba[i][GCOMP];
22190e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  }
22200e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick                  break;
2221f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGB_INTEGER_EXT:
2222f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2223f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLint) rgba[i][RCOMP];
2224f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
2225f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLint) rgba[i][BCOMP];
2226f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2227f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2228f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RGBA_INTEGER_EXT:
2229f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2230f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLint) rgba[i][RCOMP];
2231f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
2232f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLint) rgba[i][BCOMP];
2233f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
2234f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2235f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2236f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGR_INTEGER_EXT:
2237f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2238f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+0] = (GLint) rgba[i][BCOMP];
2239f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
2240f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*3+2] = (GLint) rgba[i][RCOMP];
2241f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2242f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2243f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_BGRA_INTEGER_EXT:
2244f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2245f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+0] = (GLint) rgba[i][BCOMP];
2246f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
2247f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+2] = (GLint) rgba[i][RCOMP];
2248f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
2249f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2250f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2251f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_INTEGER_EXT:
2252f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2253f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
2254f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                           rgba[i][GCOMP] +
2255f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                           rgba[i][BCOMP]);
2256f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = (GLint) rgba[i][ACOMP];
2257f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2258f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
2259f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2260f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2261f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i] = (GLint) (rgba[i][RCOMP] +
2262f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                       rgba[i][GCOMP] +
2263f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                                       rgba[i][BCOMP]);
2264f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2265f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
22661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
22671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
22681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
22691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
22701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
22711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_FLOAT:
22721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
22731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLfloat *dst = (GLfloat *) dstAddr;
22741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
22751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
22761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
22771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = rgba[i][RCOMP];
22781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
22791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
22801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
22811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = rgba[i][GCOMP];
22821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
22831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
22841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
22851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = rgba[i][BCOMP];
22861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
22871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
22881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
22891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = rgba[i][ACOMP];
22901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
22911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
22921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
22931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = luminance[i];
22941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
22951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
22961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
22971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = luminance[i];
22981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
22991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
2301f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
2302f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2303f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = rgba[i][RCOMP];
2304f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = rgba[i][GCOMP];
2305f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2306f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
23071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
23081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
23101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
23111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
23121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
23151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
23171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
23181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
23191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
23201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
23231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
23251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
23261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
23271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
23301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
23321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
23331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
23341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
23351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
23381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
23401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
23411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
23421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
23431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
23461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
23471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = rgba[i][RCOMP];
23491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = rgba[i][GCOMP];
23501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
23531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
23541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
23551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
23561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
23571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_HALF_FLOAT_ARB:
23581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
23591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLhalfARB *dst = (GLhalfARB *) dstAddr;
23601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            switch (dstFormat) {
23611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RED:
23621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
23631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
23641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_GREEN:
23661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
23671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
23681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BLUE:
23701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
23711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
23721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ALPHA:
23741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
23751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
23761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE:
23781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++)
23791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i] = _mesa_float_to_half(luminance[i]);
23801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
23811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_LUMINANCE_ALPHA:
23821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
23841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
23851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
2387f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul               case GL_RG:
2388f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  for (i=0;i<n;i++) {
2389f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2390f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2391f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  }
2392f6dbb693d211feca9980437c54897ca6619e0a15Brian Paul                  break;
23931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGB:
23941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
23951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
23961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
23971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
23981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
23991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_RGBA:
24011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
24021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
24031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
24041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
24051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
24061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
24071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGR:
24091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
24101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
24111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
24121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
24131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
24141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_BGRA:
24161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
24171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
24181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
24191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
24201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
24211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
24221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_ABGR_EXT:
24241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
24251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
24261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
24271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
24281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
24291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
24301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DUDV_ATI:
24321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               case GL_DU8DV8_ATI:
24331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i=0;i<n;i++) {
24341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
24351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
24361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
24371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  break;
24381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               default:
24391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
24401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
24431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
24441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGB) {
24451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *dst = (GLubyte *) dstAddr;
24461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2447c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5)
2448c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2)
2449c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 3.0F)     );
24501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
24531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
24541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGB) {
24551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *dst = (GLubyte *) dstAddr;
24561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2457c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F)     )
2458c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3)
2459c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6);
24601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
24631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
24641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGB) {
24651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
24661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2467c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11)
2468c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 63.0F) <<  5)
2469c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F)      );
24701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
24731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
24741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGB) {
24751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
24761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2477c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F)      )
2478c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 63.0F) <<  5)
2479c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11);
24801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
24831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
24841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
24851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
24861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2487c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12)
2488c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2489c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  4)
2490c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 15.0F)      );
24911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
24921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
24931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
24941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
24951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2496c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12)
2497c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2498c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) <<  4)
2499c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 15.0F)      );
25001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
25031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2505c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12)
2506c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  8)
2507c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2508c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 15.0F)      );
25091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
25121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
25131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
25141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2516c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F)      )
2517c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2518c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  8)
2519c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12);
25201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
25231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2525c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F)      )
2526c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2527c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) <<  8)
2528c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12);
25291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
25321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2534c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F)      )
2535c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  4)
2536c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2537c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12);
25381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
25411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
25421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
25431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2545c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11)
2546c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  6)
2547c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  1)
2548c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *  1.0F)      );
25491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
25521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2554c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11)
2555c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  6)
2556c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 31.0F) <<  1)
2557c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *  1.0F)      );
25581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
25611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2563c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11)
2564c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  6)
2565c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  1)
2566c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] *  1.0F)      );
25671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
25701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
25711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
25721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2574c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F)      )
2575c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  5)
2576c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10)
2577c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *  1.0F) << 15);
25781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
25811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2583c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F)      )
2584c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  5)
2585c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10)
2586c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *  1.0F) << 15);
25871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
25901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLushort *dst = (GLushort *) dstAddr;
25911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2592c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F)      )
2593c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  5)
2594c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10)
2595c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] *  1.0F) << 15);
25961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
25971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
25981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
25991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
26001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
26011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2603c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24)
2604c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16)
2605c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 255.F) <<  8)
2606c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 255.F)      );
26071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
26101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2612c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24)
2613c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16)
2614c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 255.F) <<  8)
2615c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 255.F)      );
26161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
26191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2621c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24)
2622c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16)
2623c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.F) <<  8)
2624c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 255.F)      );
26251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
26281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
26291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
26301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2632c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F)      )
2633c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) <<  8)
2634c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16)
2635c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24);
26361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
26391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2641c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F)      )
2642c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) <<  8)
2643c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16)
2644c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24);
26451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
26481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2650c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F)      )
2651c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 255.0F) <<  8)
2652c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16)
2653c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24);
26541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
26571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
26581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
26591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2661c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22)
2662c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12)
2663c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) <<  2)
2664c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *    3.0F)      );
26651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
26681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2670c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22)
2671c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12)
2672c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 1023.0F) <<  2)
2673c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *    3.0F)      );
26741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
26771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2679c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22)
2680c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12)
2681c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) <<  2)
2682c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] *    3.0F)      );
26831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
26861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
26871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstFormat == GL_RGBA) {
26881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2690c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F)      )
2691c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10)
2692c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20)
2693c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *    3.0F) << 30);
26941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
26951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
26961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_BGRA) {
26971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
26981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2699c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F)      )
2700c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10)
2701c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20)
2702c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][ACOMP] *    3.0F) << 30);
27031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
27041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
27051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (dstFormat == GL_ABGR_EXT) {
27061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *dst = (GLuint *) dstAddr;
27071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i=0;i<n;i++) {
2708c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul               dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F)      )
2709c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10)
2710c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20)
2711c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul                      | (F_TO_I(rgba[i][RCOMP] *    3.0F) << 30);
27121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
27131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
27141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
27159d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_UNSIGNED_INT_5_9_9_9_REV:
27169d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         {
27179d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint *dst = (GLuint *) dstAddr;
27189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (i = 0; i < n; i++) {
27199d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               dst[i] = float3_to_rgb9e5(rgba[i]);
27209d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
27219d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
27229d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         break;
2723631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_UNSIGNED_INT_10F_11F_11F_REV:
2724631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         {
2725631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint *dst = (GLuint *) dstAddr;
2726631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (i = 0; i < n; i++) {
2727631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               dst[i] = float3_to_r11g11b10f(rgba[i]);
2728631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
2729631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
2730631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         break;
27311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      default:
27321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
27333d6d44348150cef8316f32de79470d9a0ed71155Vinson Lee         free(luminance);
27341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
27351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
27361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (dstPacking->SwapBytes) {
27381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint swapSize = _mesa_sizeof_packed_type(dstType);
27391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (swapSize == 2) {
2740370e5d2106c88bad0587265254edf3a8cffbaef2Brian Paul         _mesa_swap2((GLushort *) dstAddr, n * comps);
27411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
27421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else if (swapSize == 4) {
2743370e5d2106c88bad0587265254edf3a8cffbaef2Brian Paul         _mesa_swap4((GLuint *) dstAddr, n * comps);
27441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
27451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
274636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
274736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(luminance);
27481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
27491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define SWAP2BYTE(VALUE)			\
27531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {						\
27541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
27551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte tmp = bytes[0];			\
27561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[0] = bytes[1];			\
27571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[1] = tmp;				\
27581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
27591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define SWAP4BYTE(VALUE)			\
27611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {						\
27621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
27631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte tmp = bytes[0];			\
27641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[0] = bytes[3];			\
27651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[3] = tmp;				\
27661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      tmp = bytes[1];				\
27671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[1] = bytes[2];			\
27681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytes[2] = tmp;				\
27691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
27701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27721c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void
27731c131752c3e07ef91f49d4970dafca6d26585334Brian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
27741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
27751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     const struct gl_pixelstore_attrib *unpack )
27761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
27771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
27781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_BITMAP ||
27801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE ||
27811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
27821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
27831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
27841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
27851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
27861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT ||
27871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
2788ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          srcType == GL_FLOAT ||
2789ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
27901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
27911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (srcType) {
27921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_BITMAP:
27931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
27941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLubyte *ubsrc = (GLubyte *) src;
27951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->LsbFirst) {
27961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
27971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
27981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
27991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
28001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  if (mask == 128) {
28011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     mask = 1;
28021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     ubsrc++;
28031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
28041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  else {
28051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     mask = mask << 1;
28061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
28071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
28081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
28101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
28111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
28121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
28131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
28141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  if (mask == 1) {
28151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     mask = 128;
28161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     ubsrc++;
28171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
28181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  else {
28191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     mask = mask >> 1;
28201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
28211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
28221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE:
28261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *s = (const GLubyte *) src;
28291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i++)
28301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               indexes[i] = s[i];
28311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_BYTE:
28341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLbyte *s = (const GLbyte *) src;
28371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i++)
28381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               indexes[i] = s[i];
28391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT:
28421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *s = (const GLushort *) src;
28451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
28461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
28471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLushort value = s[i];
28481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP2BYTE(value);
28491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = value;
28501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
28511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
28531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
28541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = s[i];
28551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_SHORT:
28591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLshort *s = (const GLshort *) src;
28621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
28631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
28641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLshort value = s[i];
28651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP2BYTE(value);
28661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = value;
28671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
28681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
28701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
28711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = s[i];
28721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT:
28761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *s = (const GLuint *) src;
28791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
28801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
28811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint value = s[i];
28821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP4BYTE(value);
28831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = value;
28841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
28851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
28871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
28881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = s[i];
28891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
28901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
28911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
28921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_INT:
28931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
28941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
28951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLint *s = (const GLint *) src;
28961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
28971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
28981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLint value = s[i];
28991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP4BYTE(value);
29001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = value;
29011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
29021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
29041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
29051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = s[i];
29061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
29081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
29091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_FLOAT:
29101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
29111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
29121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLfloat *s = (const GLfloat *) src;
29131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
29141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
29151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLfloat value = s[i];
29161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP4BYTE(value);
29171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (GLuint) value;
29181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
29191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
29211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
29221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (GLuint) s[i];
29231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
29251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
29261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_HALF_FLOAT_ARB:
29271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
29281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
29291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLhalfARB *s = (const GLhalfARB *) src;
29301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
29311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
29321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLhalfARB value = s[i];
29331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP2BYTE(value);
29341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(value);
29351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
29361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
29381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
29391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
29401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
29421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
29431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_24_8_EXT:
29441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
29451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
29461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *s = (const GLuint *) src;
29471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (unpack->SwapBytes) {
29481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
29491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint value = s[i];
29501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP4BYTE(value);
29511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = value & 0xff;  /* lower 8 bits */
29521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
29531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
29551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++)
29561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  indexes[i] = s[i] & 0xff;  /* lower 8 bits */
29571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
29581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
29591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
2960ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2961ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák         {
2962ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            GLuint i;
2963ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            const GLuint *s = (const GLuint *) src;
2964ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            if (unpack->SwapBytes) {
2965ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               for (i = 0; i < n; i++) {
2966ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák                  GLuint value = s[i*2+1];
2967ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák                  SWAP4BYTE(value);
2968ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák                  indexes[i] = value & 0xff;  /* lower 8 bits */
2969ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               }
2970ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            }
2971ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            else {
2972ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               for (i = 0; i < n; i++)
2973ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák                  indexes[i] = s[i*2+1] & 0xff;  /* lower 8 bits */
2974ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            }
2975ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák         }
2976ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák         break;
29771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
29781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      default:
29791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
29801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
29811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
29821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
29831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
29841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
2985e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul/**
2986e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul * Return source/dest RGBA indexes for unpacking pixels.
2987e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul */
2988e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulstatic void
2989e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paulget_component_mapping(GLenum format,
299090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *rSrc,
299190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *gSrc,
299290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *bSrc,
299390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *aSrc,
299490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *rDst,
299590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *gDst,
299690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *bDst,
299790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                      GLint *aDst)
2998e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul{
2999e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   switch (format) {
3000e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RED:
3001e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RED_INTEGER_EXT:
300290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 0;
300390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = *bSrc = *aSrc = -1;
3004e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3005e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_GREEN:
3006e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_GREEN_INTEGER_EXT:
300790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 0;
300890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *bSrc = *aSrc = -1;
3009e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3010b50e017ae1941c91cd73099b5c76e292080312e4Dave Airlie   case GL_BLUE:
3011e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BLUE_INTEGER_EXT:
301290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 0;
301390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *gSrc = *aSrc = -1;
3014e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3015e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ALPHA:
3016e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ALPHA_INTEGER_EXT:
301790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *gSrc = *bSrc = -1;
301890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = 0;
3019e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3020e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE:
3021e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_INTEGER_EXT:
302290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *gSrc = *bSrc = 0;
302390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = -1;
3024e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3025e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_ALPHA:
3026e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
302790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *gSrc = *bSrc = 0;
302890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = 1;
3029e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3030e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_INTENSITY:
303190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = *gSrc = *bSrc = *aSrc = 0;
3032e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3033e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RG:
3034e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RG_INTEGER:
303590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 0;
303690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
303790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = -1;
303890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = -1;
303990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 0;
304090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 1;
304190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 2;
304290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 3;
3043e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3044e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGB:
3045e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGB_INTEGER:
304690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 0;
304790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
304890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 2;
304990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = -1;
305090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 0;
305190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 1;
305290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 2;
305390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 3;
3054e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3055e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGR:
305647e2e367170edec022481f1487cd980e00ef3203Dave Airlie   case GL_BGR_INTEGER:
305790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 2;
305890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
305990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 0;
306090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = -1;
306190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 2;
306290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 1;
306390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 0;
306490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 3;
3065e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3066e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGBA:
3067e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_RGBA_INTEGER:
306890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 0;
306990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
307090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 2;
307190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = 3;
307290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 0;
307390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 1;
307490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 2;
307590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 3;
3076e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3077e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_BGRA:
307847e2e367170edec022481f1487cd980e00ef3203Dave Airlie   case GL_BGRA_INTEGER:
307990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 2;
308090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
308190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 0;
308290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = 3;
308390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 2;
308490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 1;
308590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 0;
308690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 3;
3087e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3088e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_ABGR_EXT:
308990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 3;
309090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 2;
309190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = 1;
309290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = 0;
309390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rDst = 3;
309490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gDst = 2;
309590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bDst = 1;
309690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aDst = 0;
3097e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3098e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_DU8DV8_ATI:
3099e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   case GL_DUDV_ATI:
310090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *rSrc = 0;
310190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *gSrc = 1;
310290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *bSrc = -1;
310390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      *aSrc = -1;
3104e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      break;
3105e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   default:
3106e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
3107e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul                    _mesa_lookup_enum_by_nr(format));
3108e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul      return;
3109e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   }
3110e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul}
3111e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
3112e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
3113e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul
31141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
31151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This function extracts floating point RGBA values from arbitrary
31161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * image data.  srcFormat and srcType are the format and type parameters
31171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
31181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
31191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
31201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * implements the "Conversion to floating point", "Conversion to RGB",
31211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * and "Final Expansion to RGBA" operations.
31221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
31231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args:  n - number of pixels
31241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        rgba - output colors
31251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcFormat - format of incoming data
31261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcType - data type of incoming data
31271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        src - source data pointer
31281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        swapBytes - perform byteswapping of incoming data?
31291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
31301c131752c3e07ef91f49d4970dafca6d26585334Brian Paulstatic void
31311c131752c3e07ef91f49d4970dafca6d26585334Brian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
31321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
31331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                   GLboolean swapBytes)
31341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
313590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   GLint rSrc, gSrc, bSrc, aSrc;
31361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLint stride;
313790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   GLint rDst, bDst, gDst, aDst;
31381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLboolean intFormat;
31391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
31401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
31411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcFormat == GL_RED ||
31421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_GREEN ||
31431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BLUE ||
31441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ALPHA ||
31451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE ||
31461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
31471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_INTENSITY ||
31481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RG ||
31491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGB ||
31501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGR ||
31511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGBA ||
31521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGRA ||
31531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ABGR_EXT ||
31541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_DU8DV8_ATI ||
31551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_DUDV_ATI ||
31561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RED_INTEGER_EXT ||
31571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_GREEN_INTEGER_EXT ||
31581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BLUE_INTEGER_EXT ||
31591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ALPHA_INTEGER_EXT ||
31600e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick          srcFormat == GL_RG_INTEGER ||
31611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGB_INTEGER_EXT ||
31621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGBA_INTEGER_EXT ||
31631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGR_INTEGER_EXT ||
31641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGRA_INTEGER_EXT ||
31651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
31661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
31671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
31681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
31691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
31701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
31711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
31721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
31731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
31741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
31751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_FLOAT ||
31761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
31771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
31781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
31791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
31801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
31811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
31821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
31831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
31841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
31851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
31861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
31879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3188631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
31901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3191e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   get_component_mapping(srcFormat,
319290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                         &rSrc, &gSrc, &bSrc, &aSrc,
319390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                         &rDst, &gDst, &bDst, &aDst);
31941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3195e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   stride = _mesa_components_in_format(srcFormat);
31961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
31979ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen   intFormat = _mesa_is_enum_format_integer(srcFormat);
31981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
319990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
320090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   if ((SRC_INDEX) < 0) {						\
32011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;								\
32021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (intFormat) {							\
32031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {					\
320490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = DEFAULT_INT;				\
32051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }									\
32071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {								\
32081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {					\
320990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = DEFAULT_FLT;				\
32101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }									\
32121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }									\
32131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else if (swapBytes) {						\
32141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const TYPE *s = (const TYPE *) src;				\
32151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;								\
32161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (i = 0; i < n; i++) {						\
321790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         TYPE value = s[SRC_INDEX];					\
32181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (sizeof(TYPE) == 2) {					\
32191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            SWAP2BYTE(value);						\
32201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else if (sizeof(TYPE) == 4) {					\
32221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            SWAP4BYTE(value);						\
32231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (intFormat)							\
322590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = (GLfloat) value;			\
32261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else								\
322790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value);		\
32281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         s += stride;							\
32291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }									\
32301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }									\
32311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {								\
32321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const TYPE *s = (const TYPE *) src;				\
32331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;								\
32341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (intFormat) {							\
32351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {					\
323690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX];		\
32371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            s += stride;						\
32381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }									\
32401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {								\
32411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {					\
324290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]);	\
32431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            s += stride;						\
32441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }								\
32451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }									\
32461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
32471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
32481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (srcType) {
32491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE:
325090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
325190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
325290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
325390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
32541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_BYTE:
3256546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(rSrc, RCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOATZ);
3257546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(gSrc, GCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOATZ);
3258546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(bSrc, BCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOATZ);
3259546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ);
32601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT:
326290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
326390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
326490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
326590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
32661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_SHORT:
3268546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(rSrc, RCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOATZ);
3269546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(gSrc, GCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOATZ);
3270546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(bSrc, BCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOATZ);
3271546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ);
32721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT:
327490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
327590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
327690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
327790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
32781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_INT:
328090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
328190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
328290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
328390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
32841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_FLOAT:
328690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
328790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
328890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
328990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
32901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_HALF_FLOAT_ARB:
329290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
329390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
329490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
329590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
32961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
32971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
32981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
32991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
33001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (!intFormat) {
33021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               rs = 1.0F / 7.0F;
33031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               gs = 1.0F / 7.0F;
33041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               bs = 1.0F / 3.0F;
33051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte p = ubsrc[i];
330890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 5)      ) * rs;
330990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
331090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p     ) & 0x3) * bs;
331190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
33151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
33161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
33171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
33181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (!intFormat) {
33201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               rs = 1.0F / 7.0F;
33211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               gs = 1.0F / 7.0F;
33221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               bs = 1.0F / 3.0F;
33231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte p = ubsrc[i];
332690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p     ) & 0x7) * rs;
332790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
332890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 6)      ) * bs;
332990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
33331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
33341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
33351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = 1.0F / 31.0F;
33361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            gs = 1.0F / 63.0F;
33371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            bs = 1.0F / 31.0F;
33381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
33401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
33411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
33441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
334590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       ) * rs;
334690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
334790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
334890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
33521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
33531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
335690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       ) * rs;
335790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
335890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
335990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
33631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
33641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
33651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = 1.0F / 31.0F;
33661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            gs = 1.0F / 63.0F;
33671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            bs = 1.0F / 31.0F;
33681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
33701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
33711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
33741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
337590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
337690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
337790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 11)       ) * bs;
337890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
33821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
33831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
33841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
33851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
338690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
338790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
338890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 11)       ) * bs;
338990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1.0F;
33901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
33911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
33931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
33941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
33951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = gs = bs = as = 1.0F / 15.0F;
33961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
33971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
33981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
33991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
34021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
340390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 12)      ) * rs;
340490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
340590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
340690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xf) * as;
34071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
34101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
341490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 12)      ) * rs;
341590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
341690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
341790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xf) * as;
34181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
34211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
34221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
34231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = gs = bs = as = 1.0F / 15.0F;
34241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
34261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
34301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
343190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xf) * rs;
343290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
343390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
343490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 12)      ) * as;
34351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
34381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
344290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xf) * rs;
344390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
344490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
344590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 12)      ) * as;
34461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
34491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
34501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
34511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = gs = bs = 1.0F / 31.0F;
34521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
34541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
34581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
345990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       ) * rs;
346090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
346190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
346290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x1)  * as;
34631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
34661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
347090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       ) * rs;
347190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
347290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
347390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x1)  * as;
34741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
34771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
34781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
34791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = gs = bs = 1.0F / 31.0F;
34801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
34821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
34861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP2BYTE(p);
348790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
348890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
348990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
349090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 15)       ) * as;
34911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
34921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
34931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
34941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLushort *ussrc = (const GLushort *) src;
34951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
34961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
34971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLushort p = ussrc[i];
349890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
349990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
350090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
350190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 15)       ) * as;
35021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
35041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
35051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
35061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
35071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
35081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
35091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (intFormat) {
35101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
351290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
351390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
351490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
351590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
35161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
35191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
352190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
352290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
352390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
352490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
35251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
35281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
35291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
35301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
35311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (intFormat) {
35321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
353490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
353590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
353690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
353790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
35381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
35411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
354390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
354490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
354590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
354690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
35471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
35501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
35511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
35521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
35531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
35541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
35551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (intFormat) {
35561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
355890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
355990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
356090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
356190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
35621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
35651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
356790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
356890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
356990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
357090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
35711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
35741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
35751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
35761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
35771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (intFormat) {
35781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
358090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
358190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
358290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
358390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
35841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
35871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i ++) {
35881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLuint p = uisrc[i];
358990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
359090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
359190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
359290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
35931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
35941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
35951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
35961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
35971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
35981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
35991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = 1.0F / 1023.0F;
36001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            gs = 1.0F / 1023.0F;
36011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            bs = 1.0F / 1023.0F;
36021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            as = 1.0F / 3.0F;
36031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
36051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
36061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
36071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
36081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint p = uisrc[i];
36091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP4BYTE(p);
361090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 22)        ) * rs;
361190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
361290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
361390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
36141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
36151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
36171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
36181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
36191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
36201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint p = uisrc[i];
362190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 22)        ) * rs;
362290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
362390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
362490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
36251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
36261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
36281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
36291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (!intFormat) {
36301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            rs = 1.0F / 1023.0F;
36311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            gs = 1.0F / 1023.0F;
36321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            bs = 1.0F / 1023.0F;
36331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            as = 1.0F / 3.0F;
36341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (swapBytes) {
36361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
36371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
36381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
36391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint p = uisrc[i];
36401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               SWAP4BYTE(p);
364190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
364290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
364390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
364490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 30)        ) * as;
36451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
36461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
36481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *uisrc = (const GLuint *) src;
36491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
36501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i ++) {
36511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint p = uisrc[i];
365290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
365390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
365490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
365590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 30)        ) * as;
36561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
36571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
36581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
36599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_UNSIGNED_INT_5_9_9_9_REV:
36609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         if (swapBytes) {
36619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            const GLuint *uisrc = (const GLuint *) src;
36629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint i;
36639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLfloat f[3];
36649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (i = 0; i < n; i ++) {
36659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               GLuint p = uisrc[i];
36669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               SWAP4BYTE(p);
36679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgb9e5_to_float3(p, f);
36689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][rDst] = f[0];
36699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][gDst] = f[1];
36709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][bDst] = f[2];
36719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][aDst] = 1.0F;
36729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
36739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
36749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         else {
36759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            const GLuint *uisrc = (const GLuint *) src;
36769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint i;
36779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLfloat f[3];
36789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (i = 0; i < n; i ++) {
36799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgb9e5_to_float3(uisrc[i], f);
36809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][rDst] = f[0];
36819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][gDst] = f[1];
36829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][bDst] = f[2];
36839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][aDst] = 1.0F;
36849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
36859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
36869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         break;
3687631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_UNSIGNED_INT_10F_11F_11F_REV:
3688631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         if (swapBytes) {
3689631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            const GLuint *uisrc = (const GLuint *) src;
3690631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint i;
3691631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLfloat f[3];
3692631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (i = 0; i < n; i ++) {
3693631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               GLuint p = uisrc[i];
3694631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               SWAP4BYTE(p);
3695631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               r11g11b10f_to_float3(p, f);
3696631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][rDst] = f[0];
3697631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][gDst] = f[1];
3698631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][bDst] = f[2];
3699631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][aDst] = 1.0F;
3700631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
3701631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
3702631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         else {
3703631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            const GLuint *uisrc = (const GLuint *) src;
3704631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint i;
3705631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLfloat f[3];
3706631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (i = 0; i < n; i ++) {
3707631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               r11g11b10f_to_float3(uisrc[i], f);
3708631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][rDst] = f[0];
3709631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][gDst] = f[1];
3710631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][bDst] = f[2];
3711631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][aDst] = 1.0F;
3712631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
3713631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
3714631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         break;
37151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      default:
37161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_problem(NULL, "bad srcType in extract float data");
37171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
37181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
3719b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#undef PROCESS
37201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
37211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
37221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
37239520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint
3724b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulclamp_float_to_uint(GLfloat f)
3725b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{
3726c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul   return f < 0.0F ? 0 : F_TO_I(f);
3727b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul}
3728b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
3729b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
37309520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint
3731b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulclamp_half_to_uint(GLhalfARB h)
3732b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{
3733b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   GLfloat f = _mesa_half_to_float(h);
3734c9cb9cf0502f4ca179ed1b4dd763c94912843d38Brian Paul   return f < 0.0F ? 0 : F_TO_I(f);
3735b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul}
3736b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
3737b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
3738b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/**
3739b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * \sa extract_float_rgba()
37401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
3741b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulstatic void
3742b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulextract_uint_rgba(GLuint n, GLuint rgba[][4],
3743b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  GLenum srcFormat, GLenum srcType, const GLvoid *src,
3744b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  GLboolean swapBytes)
37451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
374690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   GLint rSrc, gSrc, bSrc, aSrc;
3747b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   GLint stride;
374890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   GLint rDst, bDst, gDst, aDst;
37491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
37501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcFormat == GL_RED ||
37511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_GREEN ||
37521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BLUE ||
37531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ALPHA ||
37541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE ||
37551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
37561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_INTENSITY ||
37571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RG ||
37581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGB ||
37591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGR ||
37601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGBA ||
37611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGRA ||
37621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ABGR_EXT ||
3763b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_DU8DV8_ATI ||
3764b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_DUDV_ATI ||
3765b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RED_INTEGER_EXT ||
3766f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          srcFormat == GL_RG_INTEGER ||
3767b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_GREEN_INTEGER_EXT ||
3768b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BLUE_INTEGER_EXT ||
3769b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ALPHA_INTEGER_EXT ||
3770b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGB_INTEGER_EXT ||
3771b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGBA_INTEGER_EXT ||
3772b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGR_INTEGER_EXT ||
3773b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGRA_INTEGER_EXT ||
3774b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3775b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
37761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3777b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
37781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
37791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
37801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
37811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
37821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
37831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
37841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_FLOAT ||
37851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
37861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
37871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
37881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
37891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
37901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
37911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
37921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
37931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
37941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
37951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
37969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3797631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3798631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
37991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3800e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   get_component_mapping(srcFormat,
380190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                         &rSrc, &gSrc, &bSrc, &aSrc,
380290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                         &rDst, &gDst, &bDst, &aDst);
38031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
3804e54d5a9d681dbf81d5b61f708ae32c5fda3858ffBrian Paul   stride = _mesa_components_in_format(srcFormat);
3805b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
380690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION)	\
380790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul   if ((SRC_INDEX) < 0) {						\
3808b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      GLuint i;								\
3809b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      for (i = 0; i < n; i++) {						\
381090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         rgba[i][DST_INDEX] = DEFAULT;					\
3811b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }									\
3812b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }									\
3813b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   else if (swapBytes) {						\
3814b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      const TYPE *s = (const TYPE *) src;				\
3815b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      GLuint i;								\
3816b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      for (i = 0; i < n; i++) {						\
381790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         TYPE value = s[SRC_INDEX];					\
3818b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (sizeof(TYPE) == 2) {					\
3819b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            SWAP2BYTE(value);						\
3820b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }								\
3821b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else if (sizeof(TYPE) == 4) {					\
3822b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            SWAP4BYTE(value);						\
3823b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }								\
382490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         rgba[i][DST_INDEX] = CONVERSION(value);                        \
3825b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         s += stride;							\
3826b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }									\
3827b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }									\
3828b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   else {								\
3829b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      const TYPE *s = (const TYPE *) src;				\
3830b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      GLuint i;								\
3831b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      for (i = 0; i < n; i++) {						\
383290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]);			\
3833b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         s += stride;							\
3834b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }									\
3835b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }
3836b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
3837b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   switch (srcType) {
3838b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_BYTE:
383990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
384090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
384190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
384290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
3843b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3844b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_BYTE:
3845dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint));
3846dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint));
3847dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint));
3848dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint));
3849b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3850b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT:
385190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
385290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
385390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
385490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
3855b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3856b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_SHORT:
3857dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint));
3858dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint));
3859dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint));
3860dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint));
3861b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3862b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_INT:
386390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
386490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
386590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
386690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
3867b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3868b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_INT:
3869dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(rSrc, RCOMP, 0, GLint, (GLuint));
3870dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(gSrc, GCOMP, 0, GLint, (GLuint));
3871dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(bSrc, BCOMP, 0, GLint, (GLuint));
3872dadbec1e90415f0744eb91e684bf9d7496f474c0Eric Anholt         PROCESS(aSrc, ACOMP, 1, GLint, (GLuint));
3873b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3874b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_FLOAT:
387590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
387690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
387790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
387890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
3879b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3880b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_HALF_FLOAT_ARB:
388190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
388290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
388390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
388490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
3885b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3886b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
3887b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         {
3888b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
3889b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3890b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3891b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLubyte p = ubsrc[i];
389290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 5)      );
389390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 2) & 0x7);
389490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p     ) & 0x3);
389590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3896b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3897b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3898b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3899b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
3900b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         {
3901b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
3902b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3903b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3904b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLubyte p = ubsrc[i];
390590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p     ) & 0x7);
390690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 3) & 0x7);
390790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 6)      );
390890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3909b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3910b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3911b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3912b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
3913b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
3914b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3915b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3916b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3917b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
3918b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
391990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       );
392090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f);
392190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p      ) & 0x1f);
392290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3923b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3924b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3925b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
3926b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3927b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3928b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3929b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
393090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       );
393190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f);
393290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p      ) & 0x1f);
393390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3934b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3935b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3936b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3937b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
3938b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
3939b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3940b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3941b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3942b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
3943b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
394490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f);
394590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f);
394690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 11)       );
394790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3948b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3949b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3950b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
3951b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3952b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3953b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3954b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
395590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f);
395690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x3f);
395790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 11)       );
395890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = 1;
3959b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3960b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3961b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3962b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
3963b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
3964b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3965b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3966b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3967b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
3968b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
396990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 12)      );
397090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xf);
397190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  4) & 0xf);
397290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xf);
3973b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3974b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3975b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
3976b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3977b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3978b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3979b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
398090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 12)      );
398190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xf);
398290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  4) & 0xf);
398390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xf);
3984b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3985b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
3986b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
3987b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3988b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
3989b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
3990b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
3991b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
3992b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
3993b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
399490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xf);
399590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  4) & 0xf);
399690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xf);
399790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 12)      );
3998b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
3999b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4000b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4001b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
4002b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4003b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4004b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
400590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xf);
400690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  4) & 0xf);
400790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xf);
400890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 12)      );
4009b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4010b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4011b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4012b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
4013b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4014b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
4015b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4016b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4017b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
4018b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
401990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       );
402090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  6) & 0x1f);
402190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  1) & 0x1f);
402290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x1 );
4023b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4024b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4025b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4026b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
4027b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4028b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4029b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
403090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 11)       );
403190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  6) & 0x1f);
403290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  1) & 0x1f);
403390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x1 );
4034b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4035b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4036b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4037b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
4038b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4039b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
4040b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4041b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4042b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
4043b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP2BYTE(p);
404490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f);
404590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x1f);
404690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 10) & 0x1f);
404790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 15)       );
4048b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4049b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4050b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4051b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLushort *ussrc = (const GLushort *) src;
4052b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4053b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4054b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLushort p = ussrc[i];
405590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x1f);
405690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  5) & 0x1f);
405790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 10) & 0x1f);
405890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 15)       );
4059b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4060b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4061b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4062b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
4063b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4064b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4065b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4066b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4067b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
406890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xff);
406990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xff);
407090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 16) & 0xff);
407190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 24)       );
4072b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4073b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4074b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4075b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4076b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4077b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4078b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
407990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 24)       );
408090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 16) & 0xff);
408190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xff);
408290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xff);
4083b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4084b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4085b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4086b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
4087b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4088b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4089b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4090b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4091b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
409290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 24)       );
409390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 16) & 0xff);
409490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  8) & 0xff);
409590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0xff);
4096b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4097b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4098b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4099b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4100b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4101b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4102b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
410390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0xff);
410490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >>  8) & 0xff);
410590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 16) & 0xff);
410690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 24)       );
4107b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4108b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4109b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4110b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
4111b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4112b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4113b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4114b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4115b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
4116b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP4BYTE(p);
411790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 22)        );
411890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 12) & 0x3ff);
411990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  2) & 0x3ff);
412090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x3  );
4121b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4122b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4123b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4124b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4125b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4126b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4127b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
412890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p >> 22)        );
412990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 12) & 0x3ff);
413090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >>  2) & 0x3ff);
413190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p      ) & 0x3  );
4132b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4133b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4134b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4135b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
4136b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (swapBytes) {
4137b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4138b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4139b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4140b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
4141b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               SWAP4BYTE(p);
414290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x3ff);
414390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 10) & 0x3ff);
414490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 20) & 0x3ff);
414590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 30)        );
4146b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4147b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4148b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else {
4149b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            const GLuint *uisrc = (const GLuint *) src;
4150b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLuint i;
4151b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            for (i = 0; i < n; i ++) {
4152b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint p = uisrc[i];
415390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][rDst] = ((p      ) & 0x3ff);
415490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][gDst] = ((p >> 10) & 0x3ff);
415590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][bDst] = ((p >> 20) & 0x3ff);
415690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul               rgba[i][aDst] = ((p >> 30)        );
4157b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4158b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4159b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
41609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_UNSIGNED_INT_5_9_9_9_REV:
41619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         if (swapBytes) {
41629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            const GLuint *uisrc = (const GLuint *) src;
41639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint i;
41649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            float f[3];
41659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (i = 0; i < n; i ++) {
41669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               GLuint p = uisrc[i];
41679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               SWAP4BYTE(p);
41689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgb9e5_to_float3(p, f);
41699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][rDst] = clamp_float_to_uint(f[0]);
41709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][gDst] = clamp_float_to_uint(f[1]);
41719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][bDst] = clamp_float_to_uint(f[2]);
41729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][aDst] = 1;
41739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
41749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
41759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         else {
41769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            const GLuint *uisrc = (const GLuint *) src;
41779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            GLuint i;
41789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            float f[3];
41799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            for (i = 0; i < n; i ++) {
41809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               GLuint p = uisrc[i];
41819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgb9e5_to_float3(p, f);
41829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][rDst] = clamp_float_to_uint(f[0]);
41839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][gDst] = clamp_float_to_uint(f[1]);
41849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][bDst] = clamp_float_to_uint(f[2]);
41859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               rgba[i][aDst] = 1;
41869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            }
41879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         }
41889d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         break;
4189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_UNSIGNED_INT_10F_11F_11F_REV:
4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         if (swapBytes) {
4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            const GLuint *uisrc = (const GLuint *) src;
4192631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint i;
4193631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            float f[3];
4194631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (i = 0; i < n; i ++) {
4195631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               GLuint p = uisrc[i];
4196631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               SWAP4BYTE(p);
4197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               r11g11b10f_to_float3(p, f);
4198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4199631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4200631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4201631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][aDst] = 1;
4202631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
4203631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
4204631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         else {
4205631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            const GLuint *uisrc = (const GLuint *) src;
4206631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            GLuint i;
4207631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            float f[3];
4208631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            for (i = 0; i < n; i ++) {
4209631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               GLuint p = uisrc[i];
4210631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               r11g11b10f_to_float3(p, f);
4211631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4212631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4213631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4214631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               rgba[i][aDst] = 1;
4215631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            }
4216631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         }
4217631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         break;
4218b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      default:
4219b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         _mesa_problem(NULL, "bad srcType in extract uint data");
4220b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         break;
4221b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }
4222b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul#undef PROCESS
4223b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul}
4224b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4225b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4226b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4227b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/*
4228b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * Unpack a row of color image data from a client buffer according to
4229b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * the pixel unpacking parameters.
4230e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Return GLubyte values in the specified dest image format.
4231b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * This is used by glDrawPixels and glTexImage?D().
4232b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * \param ctx - the context
4233b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         n - number of pixels in the span
4234b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         dstFormat - format of destination color array
4235b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         dest - the destination color array
4236b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         srcFormat - source image format
4237b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         srcType - source image  data type
4238b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         source - source image pointer
4239b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         srcPacking - pixel unpacking parameters
4240b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
4241b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul *
4242b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * XXX perhaps expand this to process whole images someday.
4243b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */
4244b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulvoid
4245e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul_mesa_unpack_color_span_ubyte(struct gl_context *ctx,
4246e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                              GLuint n, GLenum dstFormat, GLubyte dest[],
4247b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                              GLenum srcFormat, GLenum srcType,
4248b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                              const GLvoid *source,
4249b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                              const struct gl_pixelstore_attrib *srcPacking,
4250b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                              GLbitfield transferOps )
4251b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{
42529ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen   GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat);
4253b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
4254b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_LUMINANCE ||
4255b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
4256b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_INTENSITY ||
4257b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RED ||
4258b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RG ||
4259b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RGB ||
42603602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick          dstFormat == GL_RGBA);
4261b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4262b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(srcFormat == GL_RED ||
4263b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_GREEN ||
4264b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BLUE ||
4265b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ALPHA ||
4266b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE ||
4267b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
4268b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_INTENSITY ||
4269b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RG ||
4270b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGB ||
4271b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGR ||
4272b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGBA ||
4273b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGRA ||
4274b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ABGR_EXT ||
4275b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_COLOR_INDEX);
4276b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4277b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(srcType == GL_BITMAP ||
4278b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_BYTE ||
4279b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_BYTE ||
4280b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT ||
4281b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_SHORT ||
4282b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT ||
4283b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_INT ||
4284b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
4285b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_FLOAT ||
4286b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4287b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4288b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4289b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4290b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4291b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4292b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4293b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4294b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4295b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4296b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
42979d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4298631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4299631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4300b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
43011ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie   /* EXT_texture_integer specifies no transfer ops on integer
43021ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    * types in the resolved issues section. Just set them to 0
43031ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    * for integer surfaces.
43041ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie    */
43051ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie   if (intFormat)
43061ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie      transferOps = 0;
43071ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie
4308b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   /* Try simple cases first */
4309b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   if (transferOps == 0) {
4310e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul      if (srcType == GL_UNSIGNED_BYTE) {
4311b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         if (dstFormat == GL_RGBA) {
4312b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            if (srcFormat == GL_RGBA) {
4313e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               memcpy( dest, source, n * 4 * sizeof(GLubyte) );
4314b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               return;
4315b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4316b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            else if (srcFormat == GL_RGB) {
4317b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint i;
4318e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               const GLubyte *src = (const GLubyte *) source;
4319e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               GLubyte *dst = dest;
4320b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               for (i = 0; i < n; i++) {
4321b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[0] = src[0];
4322b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[1] = src[1];
4323b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[2] = src[2];
4324e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul                  dst[3] = 255;
4325b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  src += 3;
4326b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst += 4;
4327b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               }
4328b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               return;
4329b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4330b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4331b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else if (dstFormat == GL_RGB) {
4332b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            if (srcFormat == GL_RGB) {
4333e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               memcpy( dest, source, n * 3 * sizeof(GLubyte) );
4334b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               return;
4335b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4336b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            else if (srcFormat == GL_RGBA) {
4337b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               GLuint i;
4338e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               const GLubyte *src = (const GLubyte *) source;
4339e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul               GLubyte *dst = dest;
4340b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               for (i = 0; i < n; i++) {
4341b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[0] = src[0];
4342b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[1] = src[1];
4343b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst[2] = src[2];
4344b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  src += 4;
4345b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                  dst += 3;
4346b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               }
4347b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul               return;
4348b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            }
4349b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4350b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         else if (dstFormat == srcFormat) {
4351b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            GLint comps = _mesa_components_in_format(srcFormat);
4352b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            assert(comps > 0);
4353e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            memcpy( dest, source, n * comps * sizeof(GLubyte) );
4354b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            return;
4355b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4356b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4357b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }
4358b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4359b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4360b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   /* general solution begins here */
4361b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   {
4362b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      GLint dstComponents;
436390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      GLint rDst, gDst, bDst, aDst, lDst, iDst;
43642addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
43652addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
43662addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      if (!rgba) {
43672addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
43682addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         return;
43692addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      }
4370b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4371b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
4372b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      /* source & dest image formats should have been error checked by now */
4373b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      assert(dstComponents > 0);
4374b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4375b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      /*
4376b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul       * Extract image data and convert to RGBA floats
4377b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul       */
4378b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
437936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
438036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
438136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         if (!indexes) {
438236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
43834e6a0b40c5bb31101718f25ffaff8ffeb3d921b9Vinson Lee            free(rgba);
438436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul            return;
438536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         }
438636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
4387b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
4388b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                              srcPacking);
4389b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
43903602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 /* Convert indexes to RGBA */
43913602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
43923602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	    _mesa_shift_and_offset_ci(ctx, n, indexes);
43933602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 }
43943602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
4395b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4396b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4397b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          * with color indexes.
4398b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          */
4399b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
440036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
440136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         free(indexes);
4402b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4403b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      else {
4404b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         /* non-color index data */
4405b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
4406b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                            srcPacking->SwapBytes);
4407b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4408b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4409e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul      /* Need to clamp if returning GLubytes */
4410b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      transferOps |= IMAGE_CLAMP_BIT;
4411b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4412b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      if (transferOps) {
4413b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
4414b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4415b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
441690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      get_component_indexes(dstFormat,
441790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
44181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
4419e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul      /* Now return the GLubyte data in the requested dstFormat */
442090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (rDst >= 0) {
4421e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
44231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
4424e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]);
44251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
44261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
442990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (gDst >= 0) {
4430e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
44321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
4433e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]);
44341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
44351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
443890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (bDst >= 0) {
4439e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
44411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
4442e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]);
44431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
44441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
444790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (aDst >= 0) {
4448e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
44501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
4451e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]);
44521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
44531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
445690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (iDst >= 0) {
4457e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
445990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(iDst == 0);
44601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         assert(dstComponents == 1);
44611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
44621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            /* Intensity comes from red channel */
4463e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]);
44641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
446790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (lDst >= 0) {
4468e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul         GLubyte *dst = dest;
44691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
447090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(lDst == 0);
44711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
44721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            /* Luminance comes from red channel */
4473e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul            CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]);
44741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
44751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
44761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
44772addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
44782addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      free(rgba);
44791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
44801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
44811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
44821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
44831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
4484e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
4485e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * instead of GLubyte.
44861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
44871c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
44881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_color_span_float( struct gl_context *ctx,
44891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
44901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               GLenum srcFormat, GLenum srcType,
44911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               const GLvoid *source,
44921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               const struct gl_pixelstore_attrib *srcPacking,
44931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               GLbitfield transferOps )
44941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
44951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
44961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_LUMINANCE ||
44971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
44981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_INTENSITY ||
44991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_RED ||
45001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_RG ||
45011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstFormat == GL_RGB ||
45023602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick          dstFormat == GL_RGBA);
45031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcFormat == GL_RED ||
45051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_GREEN ||
45061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BLUE ||
45071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ALPHA ||
45081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE ||
45091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
45101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_INTENSITY ||
45111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RG ||
45121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGB ||
45131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGR ||
45141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGBA ||
45151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGRA ||
45161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ABGR_EXT ||
45171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RED_INTEGER_EXT ||
45181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_GREEN_INTEGER_EXT ||
45191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BLUE_INTEGER_EXT ||
45201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_ALPHA_INTEGER_EXT ||
45210e52be58f05eaa5762b9a03ac860da4d9581ceadIan Romanick          srcFormat == GL_RG_INTEGER ||
45221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGB_INTEGER_EXT ||
45231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_RGBA_INTEGER_EXT ||
45241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGR_INTEGER_EXT ||
45251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_BGRA_INTEGER_EXT ||
45261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
45271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
45281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcFormat == GL_COLOR_INDEX);
45291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_BITMAP ||
45311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE ||
45321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
45331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
45341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
45351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
45361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
45371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
45381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_FLOAT ||
45391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
45401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
45411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
45421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
45431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
45441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
45451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
45461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
45471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
45481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
45491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
45509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4551631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4552631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
45531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* general solution, no special cases, yet */
45551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {
45561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint dstComponents;
455790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      GLint rDst, gDst, bDst, aDst, lDst, iDst;
45582addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
45599ad8f431b2a47060bf05517246ab0fa8d249c800Jordan Justen      GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat);
45602addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
45612addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      if (!rgba) {
45622addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
45632addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         return;
45642addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      }
45651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
45671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* source & dest image formats should have been error checked by now */
45681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      assert(dstComponents > 0);
45691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45701ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie      /* EXT_texture_integer specifies no transfer ops on integer
45711ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie       * types in the resolved issues section. Just set them to 0
45721ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie       * for integer surfaces.
45731ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie       */
45741ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie      if (intFormat)
45751ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie         transferOps = 0;
45761ab4e221fddcb0c825e6f51a46a3c908dd58e52aDave Airlie
45771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /*
45781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * Extract image data and convert to RGBA floats
45791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
45801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
458136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
458236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
458336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         if (!indexes) {
458436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
458536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul            free(rgba);
458636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul            return;
458736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         }
458836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
45891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
45901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                              srcPacking);
45911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45923602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 /* Convert indexes to RGBA */
45933602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
45943602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	    _mesa_shift_and_offset_ci(ctx, n, indexes);
45953602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 }
45963602fbb201bdea158590692a3a7a7245e0ff69ceIan Romanick	 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
45971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
45981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
45991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          * with color indexes.
46001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          */
46011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
46022addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
460336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         free(indexes);
46041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
46061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* non-color index data */
46071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
46081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                            srcPacking->SwapBytes);
46091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
46111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (transferOps) {
46121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
46131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
461590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      get_component_indexes(dstFormat,
461690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
46171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
46181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* Now pack results in the requested dstFormat */
461990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (rDst >= 0) {
46201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
46221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
462390c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[rDst] = rgba[i][RCOMP];
46241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
46251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
462890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (gDst >= 0) {
46291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
46311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
463290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[gDst] = rgba[i][GCOMP];
46331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
46341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
463790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (bDst >= 0) {
46381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
46401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
464190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[bDst] = rgba[i][BCOMP];
46421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
46431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
464690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (aDst >= 0) {
46471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
46491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
465090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[aDst] = rgba[i][ACOMP];
46511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
46521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
465590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (iDst >= 0) {
46561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
465890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(iDst == 0);
46591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         assert(dstComponents == 1);
46601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
46611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            /* Intensity comes from red channel */
46621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = rgba[i][RCOMP];
46631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
46651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
466690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (lDst >= 0) {
46671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = dest;
46681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
466990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(lDst == 0);
46701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
46711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            /* Luminance comes from red channel */
46721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[0] = rgba[i][RCOMP];
46731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += dstComponents;
46741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
46751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
467636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
467736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      free(rgba);
46781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
46791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
46801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
4681b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4682b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul/**
4683e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4684e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul * instead of GLubyte.
4685b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul * No pixel transfer ops are applied.
4686b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul */
4687b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paulvoid
4688b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul_mesa_unpack_color_span_uint(struct gl_context *ctx,
4689b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                             GLuint n, GLenum dstFormat, GLuint *dest,
4690b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                             GLenum srcFormat, GLenum srcType,
4691b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                             const GLvoid *source,
4692b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                             const struct gl_pixelstore_attrib *srcPacking)
4693b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul{
46942addcb7b50e6f1e821c06a295038194216ca1869Brian Paul   GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
46952addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
46962addcb7b50e6f1e821c06a295038194216ca1869Brian Paul   if (!rgba) {
46972addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
46982addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      return;
46992addcb7b50e6f1e821c06a295038194216ca1869Brian Paul   }
4700b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4701b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
4702b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_LUMINANCE ||
4703b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
4704b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_INTENSITY ||
4705b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RED ||
4706b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RG ||
4707b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RGB ||
4708b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          dstFormat == GL_RGBA);
4709b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4710b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(srcFormat == GL_RED ||
4711b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_GREEN ||
4712b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BLUE ||
4713b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ALPHA ||
4714b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE ||
4715b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
4716b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_INTENSITY ||
4717b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RG ||
4718b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGB ||
4719b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGR ||
4720b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGBA ||
4721b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGRA ||
4722b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ABGR_EXT ||
4723b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RED_INTEGER_EXT ||
4724b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_GREEN_INTEGER_EXT ||
4725b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BLUE_INTEGER_EXT ||
4726b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_ALPHA_INTEGER_EXT ||
4727f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie          srcFormat == GL_RG_INTEGER ||
4728b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGB_INTEGER_EXT ||
4729b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_RGBA_INTEGER_EXT ||
4730b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGR_INTEGER_EXT ||
4731b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_BGRA_INTEGER_EXT ||
4732b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
4733b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
4734b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4735b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
4736b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_BYTE ||
4737b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT ||
4738b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_SHORT ||
4739b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT ||
4740b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_INT ||
4741b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
4742b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_FLOAT ||
4743b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4744b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4745b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4746b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4747b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4748b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4749b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4750b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4751b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4752b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4753b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
47549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4755631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4756631d23daa91c569bf268a2191bd466df73a64263Marek Olšák          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4757b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4758b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4759b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   /* Extract image data as uint[4] pixels */
4760b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   extract_uint_rgba(n, rgba, srcFormat, srcType, source,
4761b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul                     srcPacking->SwapBytes);
4762b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4763b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   if (dstFormat == GL_RGBA) {
4764b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      /* simple case */
4765b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
4766b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }
4767b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   else {
4768b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      /* general case */
476990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      GLint rDst, gDst, bDst, aDst, lDst, iDst;
4770b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      GLint dstComponents = _mesa_components_in_format( dstFormat );
4771b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4772b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      assert(dstComponents > 0);
4773b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
477490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      get_component_indexes(dstFormat,
477590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4776b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4777b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      /* Now pack values in the requested dest format */
477890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (rDst >= 0) {
4779b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4780b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
4781b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
478290c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[rDst] = rgba[i][RCOMP];
4783b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst += dstComponents;
4784b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4785b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4786b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
478790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (gDst >= 0) {
4788b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4789b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
4790b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
479190c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[gDst] = rgba[i][GCOMP];
4792b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst += dstComponents;
4793b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4794b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4795b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
479690c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (bDst >= 0) {
4797b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4798b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
4799b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
480090c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[bDst] = rgba[i][BCOMP];
4801b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst += dstComponents;
4802b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4803b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4804b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
480590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (aDst >= 0) {
4806b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4807b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
4808b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
480990c52c26d8345cf9854b2f0e444966acc1642253Brian Paul            dst[aDst] = rgba[i][ACOMP];
4810b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst += dstComponents;
4811b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4812b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4813b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
481490c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (iDst >= 0) {
4815b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4816b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
481790c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(iDst == 0);
4818b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         assert(dstComponents == 1);
4819b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
4820b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            /* Intensity comes from red channel */
4821b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst[i] = rgba[i][RCOMP];
4822b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4823b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4824b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
482590c52c26d8345cf9854b2f0e444966acc1642253Brian Paul      if (lDst >= 0) {
4826b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint *dst = dest;
4827b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         GLuint i;
482890c52c26d8345cf9854b2f0e444966acc1642253Brian Paul         assert(lDst == 0);
4829b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         for (i = 0; i < n; i++) {
4830b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            /* Luminance comes from red channel */
4831b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst[0] = rgba[i][RCOMP];
4832b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul            dst += dstComponents;
4833b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul         }
4834b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul      }
4835b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul   }
48362addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
48372addcb7b50e6f1e821c06a295038194216ca1869Brian Paul   free(rgba);
4838b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul}
4839b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4840b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
4841b29ca2a561621425991727f8dc2145ae21f0f3b2Brian Paul
48421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
48431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
48441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * directly return GLbyte data, no transfer ops apply.
48451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
48461c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
48471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_dudv_span_byte( struct gl_context *ctx,
48481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                             GLuint n, GLenum dstFormat, GLbyte dest[],
48491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                             GLenum srcFormat, GLenum srcType,
48501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                             const GLvoid *source,
48511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                             const struct gl_pixelstore_attrib *srcPacking,
48521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                             GLbitfield transferOps )
48531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
48541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(dstFormat == GL_DUDV_ATI);
485514eedf3028422e98ac05713a3e3c37e6c9b4cf37Eric Anholt   ASSERT(srcFormat == GL_DUDV_ATI ||
485614eedf3028422e98ac05713a3e3c37e6c9b4cf37Eric Anholt	  srcFormat == GL_DU8DV8_ATI);
48571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
48591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
48601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
48611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
48621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
48631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
48641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
48651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_FLOAT);
48661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* general solution */
48681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {
48691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint dstComponents;
48701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLbyte *dst = dest;
48711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;
48722addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
48732addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
48742addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      if (!rgba) {
48752addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
48762addcb7b50e6f1e821c06a295038194216ca1869Brian Paul         return;
48772addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      }
48781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
48801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* source & dest image formats should have been error checked by now */
48811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      assert(dstComponents > 0);
48821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /*
48841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * Extract image data and convert to RGBA floats
48851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
48861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      extract_float_rgba(n, rgba, srcFormat, srcType, source,
48871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         srcPacking->SwapBytes);
48881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* Now determine which color channels we need to produce.
48911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * And determine the dest index (offset) within each color tuple.
48921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
48931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
48941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* Now pack results in the requested dstFormat */
48951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (i = 0; i < n; i++) {
48961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* not sure - need clamp[-1,1] here? */
48971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
48981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
48991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         dst += dstComponents;
49001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
49012addcb7b50e6f1e821c06a295038194216ca1869Brian Paul
49022addcb7b50e6f1e821c06a295038194216ca1869Brian Paul      free(rgba);
49031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
49041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
49051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
49071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of color index data from a client buffer according to
49081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the pixel unpacking parameters.
49091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
49101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
49111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args:  ctx - the context
49121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        n - number of pixels
49131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        dstType - destination data type
49141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        dest - destination array
49151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcType - source pixel type
49161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        source - source data pointer
49171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcPacking - pixel unpacking parameters
49181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        transferOps - the pixel transfer operations to apply
49191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
49201c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
492136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
49221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         GLenum dstType, GLvoid *dest,
49231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         GLenum srcType, const GLvoid *source,
49241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         const struct gl_pixelstore_attrib *srcPacking,
49251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         GLbitfield transferOps )
49261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
49271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_BITMAP ||
49281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE ||
49291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
49301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
49311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
49321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
49331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
49341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
49351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_FLOAT);
49361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
49381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstType == GL_UNSIGNED_SHORT ||
49391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstType == GL_UNSIGNED_INT);
49401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
49431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /*
49451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * Try simple cases first
49461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
49471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
49481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       && dstType == GL_UNSIGNED_BYTE) {
49491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(dest, source, n * sizeof(GLubyte));
49501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
49511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
49521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
49531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(dest, source, n * sizeof(GLuint));
49541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
49551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {
49561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /*
49571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * general solution
49581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
495936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
496036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
496136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      if (!indexes) {
496236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
496336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         return;
496436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      }
49651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
49671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           srcPacking);
49681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (transferOps)
49701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
49711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
49721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* convert to dest type */
49731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      switch (dstType) {
49741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_BYTE:
49751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            {
49761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte *dst = (GLubyte *) dest;
49771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
49781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
49791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
49801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
49811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
49821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
49831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_SHORT:
49841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            {
49851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint *dst = (GLuint *) dest;
49861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
49871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
49881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
49891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
49901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
49911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
49921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_INT:
49931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            memcpy(dest, indexes, n * sizeof(GLuint));
49941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
49951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         default:
49961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
49971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
499836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
499936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      free(indexes);
50001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
50011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
50021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
50031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
50041c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
500536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_index_span( struct gl_context *ctx, GLuint n,
50061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       GLenum dstType, GLvoid *dest, const GLuint *source,
50071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       const struct gl_pixelstore_attrib *dstPacking,
50081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       GLbitfield transferOps )
50091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
501036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
50111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
501236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   if (!indexes) {
501336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
501436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      return;
501536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
50161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
50171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
50181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
50191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
50201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* make a copy of input */
50211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(indexes, source, n * sizeof(GLuint));
50221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
50231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      source = indexes;
50241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
50251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
50261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (dstType) {
50271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_BYTE:
50281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLubyte *dst = (GLubyte *) dest;
50301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *dst++ = (GLubyte) source[i];
50331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_BYTE:
50371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLbyte *dst = (GLbyte *) dest;
50391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLbyte) source[i];
50421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_SHORT:
50461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLushort *dst = (GLushort *) dest;
50481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLushort) source[i];
50511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
50531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
50541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_SHORT:
50581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLshort *dst = (GLshort *) dest;
50601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLshort) source[i];
50631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
50651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
50661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_INT:
50701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint *dst = (GLuint *) dest;
50721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLuint) source[i];
50751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
50771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
50781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_INT:
50821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint *dst = (GLint *) dest;
50841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLint) source[i];
50871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
50891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
50901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
50911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
50921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
50931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_FLOAT:
50941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
50951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = (GLfloat *) dest;
50961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
50971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
50981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLfloat) source[i];
50991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
51001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
51011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
51021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
51031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
51041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
51051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_HALF_FLOAT_ARB:
51061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
51071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
51081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
51091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
51101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
51111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
51121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
51131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
51141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
51151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
51161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
51171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   default:
51181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
51191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
512036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
512136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(indexes);
51221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
51231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
51261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of stencil data from a client buffer according to
51271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * the pixel unpacking parameters.
51281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * This is (or will be) used by glDrawPixels
51291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
51301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Args:  ctx - the context
51311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        n - number of pixels
51321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        dstType - destination data type
51331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        dest - destination array
51341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcType - source pixel type
51351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        source - source data pointer
51361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        srcPacking - pixel unpacking parameters
51371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *        transferOps - apply offset/bias/lookup ops?
51381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
51391c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
514036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
51411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLenum dstType, GLvoid *dest,
51421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLenum srcType, const GLvoid *source,
51431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           const struct gl_pixelstore_attrib *srcPacking,
51441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           GLbitfield transferOps )
51451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
51461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(srcType == GL_BITMAP ||
51471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_BYTE ||
51481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_BYTE ||
51491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_SHORT ||
51501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_SHORT ||
51511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT ||
51521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_INT ||
51531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_UNSIGNED_INT_24_8_EXT ||
51541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
5155ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          srcType == GL_FLOAT ||
5156ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
51571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
51591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          dstType == GL_UNSIGNED_SHORT ||
5160ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          dstType == GL_UNSIGNED_INT ||
5161ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák          dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
51621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* only shift and offset apply to stencil */
51641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
51651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /*
51671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * Try simple cases first
51681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
51691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (transferOps == 0 &&
51701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       !ctx->Pixel.MapStencilFlag &&
51711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       srcType == GL_UNSIGNED_BYTE &&
51721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       dstType == GL_UNSIGNED_BYTE) {
51731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(dest, source, n * sizeof(GLubyte));
51741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
51751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else if (transferOps == 0 &&
51761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            !ctx->Pixel.MapStencilFlag &&
51771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            srcType == GL_UNSIGNED_INT &&
51781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dstType == GL_UNSIGNED_INT &&
51791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            !srcPacking->SwapBytes) {
51801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(dest, source, n * sizeof(GLuint));
51811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
51821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {
51831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /*
51841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       * general solution
51851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       */
518636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
518736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
518836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      if (!indexes) {
518936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
519036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         return;
519136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      }
51921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
51941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                           srcPacking);
51951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
51961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
51971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* shift and offset indexes */
51981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
51991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
52001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (ctx->Pixel.MapStencilFlag) {
52021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* Apply stencil lookup table */
52031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
52041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
52051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
52061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
52071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
52081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
52091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* convert to dest type */
52111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      switch (dstType) {
52121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_BYTE:
52131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            {
52141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLubyte *dst = (GLubyte *) dest;
52151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
52161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
52171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
52181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
52191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
52201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
52211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_SHORT:
52221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            {
52231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint *dst = (GLuint *) dest;
52241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLuint i;
52251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               for (i = 0; i < n; i++) {
52261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
52271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
52281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
52291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
52301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         case GL_UNSIGNED_INT:
52311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            memcpy(dest, indexes, n * sizeof(GLuint));
52321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            break;
5233ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák         case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5234ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            {
5235ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               GLuint *dst = (GLuint *) dest;
5236ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               GLuint i;
5237ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               for (i = 0; i < n; i++) {
5238ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák                  dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */
5239ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák               }
5240ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            }
5241ec6fbbe36ee198d00db6a1ae297970531186ae3cMarek Olšák            break;
52421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         default:
52431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
52441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
524536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
524636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      free(indexes);
52471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
52481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
52491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52511c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
525236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
52536d68855df133bdd4891e8aa428787b520739e0feBrian Paul                         GLenum dstType, GLvoid *dest, const GLubyte *source,
52541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         const struct gl_pixelstore_attrib *dstPacking )
52551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
52566d68855df133bdd4891e8aa428787b520739e0feBrian Paul   GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte));
52571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
525836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   if (!stencil) {
525936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
526036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      return;
526136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
52621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
52641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       ctx->Pixel.MapStencilFlag) {
52651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* make a copy of input */
52666d68855df133bdd4891e8aa428787b520739e0feBrian Paul      memcpy(stencil, source, n * sizeof(GLubyte));
52671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
52681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      source = stencil;
52691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
52701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
52711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (dstType) {
52721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_BYTE:
52736d68855df133bdd4891e8aa428787b520739e0feBrian Paul      memcpy(dest, source, n);
52741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
52751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_BYTE:
52761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
52771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLbyte *dst = (GLbyte *) dest;
52781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
52791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
52801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLbyte) (source[i] & 0x7f);
52811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
52821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
52831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
52841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_SHORT:
52851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
52861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLushort *dst = (GLushort *) dest;
52871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
52881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
52891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLushort) source[i];
52901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
52911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
52921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
52931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
52941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
52951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
52961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_SHORT:
52971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
52981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLshort *dst = (GLshort *) dest;
52991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
53011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLshort) source[i];
53021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
53041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
53051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_INT:
53091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
53101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint *dst = (GLuint *) dest;
53111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
53131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLuint) source[i];
53141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
53161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
53171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_INT:
53211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
53221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint *dst = (GLint *) dest;
53231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
53251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLint) source[i];
53261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
53281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
53291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_FLOAT:
53331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
53341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = (GLfloat *) dest;
53351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
53371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = (GLfloat) source[i];
53381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
53401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
53411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_HALF_FLOAT_ARB:
53451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
53461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
53471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i=0;i<n;i++) {
53491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = _mesa_float_to_half( (float) source[i] );
53501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
53521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
53531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_BITMAP:
53571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (dstPacking->LsbFirst) {
53581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLubyte *dst = (GLubyte *) dest;
53591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint shift = 0;
53601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
53621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (shift == 0)
53631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               *dst = 0;
53641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *dst |= ((source[i] != 0) << shift);
53651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            shift++;
53661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (shift == 8) {
53671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               shift = 0;
53681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               dst++;
53691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
53701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
53731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLubyte *dst = (GLubyte *) dest;
53741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint shift = 7;
53751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
53761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
53771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (shift == 7)
53781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               *dst = 0;
53791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            *dst |= ((source[i] != 0) << shift);
53801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            shift--;
53811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (shift < 0) {
53821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               shift = 7;
53831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               dst++;
53841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
53851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
53861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
53871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
53881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   default:
53891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
53901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
539136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
539236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(stencil);
53931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
53941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
53951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
53961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    do {                                                                \
53971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul        GLuint i;                                                       \
53981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul        const GLTYPE *src = (const GLTYPE *)source;                     \
53991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul        for (i = 0; i < n; i++) {                                       \
54001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLTYPE value = src[i];                                      \
54011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (srcPacking->SwapBytes) {                                \
54021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                if (sizeof(GLTYPE) == 2) {                              \
54031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    SWAP2BYTE(value);                                   \
54041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                } else if (sizeof(GLTYPE) == 4) {                       \
54051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    SWAP4BYTE(value);                                   \
54061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                }                                                       \
54071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }                                                           \
54081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            depthValues[i] = GLTYPE2FLOAT(value);                       \
54091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul        }                                                               \
54101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    } while (0)
54111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
54141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack a row of depth/z values from memory, returning GLushort, GLuint
54151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * or GLfloat values.
54161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * The glPixelTransfer (scale/bias) params will be applied.
54171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *
54181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param dstType  one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
54191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * \param depthMax  max value for returned GLushort or GLuint values
54201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul *                  (ignored for GLfloat).
54211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
54221c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
542336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
54241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         GLenum dstType, GLvoid *dest, GLuint depthMax,
54251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         GLenum srcType, const GLvoid *source,
54261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                         const struct gl_pixelstore_attrib *srcPacking )
54271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
5428100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák   GLfloat *depthTemp = NULL, *depthValues;
54291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLboolean needClamp = GL_FALSE;
54301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* Look for special cases first.
54321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * Not only are these faster, they're less prone to numeric conversion
54331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * problems.  Otherwise, converting from an int type to a float then
54341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * back to an int type can introduce errors that will show up as
54351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * artifacts in things like depth peeling which uses glCopyTexImage.
54361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
54371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
54381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
54391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         const GLuint *src = (const GLuint *) source;
54401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLushort *dst = (GLushort *) dest;
54411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
54421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
54431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = src[i] >> 16;
54441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
54451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
54461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
54471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (srcType == GL_UNSIGNED_SHORT
54481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          && dstType == GL_UNSIGNED_INT
54491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          && depthMax == 0xffffffff) {
54501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         const GLushort *src = (const GLushort *) source;
54511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint *dst = (GLuint *) dest;
54521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
54531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
54541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = src[i] | (src[i] << 16);
54551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
54561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
54571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
54581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (srcType == GL_UNSIGNED_INT_24_8
54591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          && dstType == GL_UNSIGNED_INT
54601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          && depthMax == 0xffffff) {
54611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         const GLuint *src = (const GLuint *) source;
54621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint *dst = (GLuint *) dest;
54631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
54641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
54651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = src[i] >> 8;
54661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
54671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
54681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
54691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      /* XXX may want to add additional cases here someday */
54701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
54711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* general case path follows */
54731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (dstType == GL_FLOAT) {
54751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      depthValues = (GLfloat *) dest;
54761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
54771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {
5478100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák      depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
5479100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák      if (!depthTemp) {
5480100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
5481100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák         return;
5482100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák      }
5483100a37587f9919d986e6af6f7e2ddecdc5bcfd09Marek Olšák
54841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      depthValues = depthTemp;
54851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
54861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
54871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* Convert incoming values to GLfloat.  Some conversions will require
54881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * clamping, below.
54891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
54901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (srcType) {
54911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_BYTE:
5492546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ);
54931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         needClamp = GL_TRUE;
54941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
54951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_BYTE:
54961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
54971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
54981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_SHORT:
5499546f76d58f619e3d7e016b3eb04254d5c5c3f39fBrian Paul         DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ);
55001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         needClamp = GL_TRUE;
55011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_SHORT:
55031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
55041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_INT:
55061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         DEPTH_VALUES(GLint, INT_TO_FLOAT);
55071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         needClamp = GL_TRUE;
55081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT:
55101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
55111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
55131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
55141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul             depthMax == 0xffffff &&
55151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul             ctx->Pixel.DepthScale == 1.0 &&
55161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul             ctx->Pixel.DepthBias == 0.0) {
55171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *src = (const GLuint *) source;
55181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint *zValues = (GLuint *) dest;
55191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
55201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i++) {
55211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                GLuint value = src[i];
55221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                if (srcPacking->SwapBytes) {
55231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    SWAP4BYTE(value);
55241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                }
55251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                zValues[i] = value & 0xffffff00;
55261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
552712c105b5de7dfb0e1c1f1fbe4ee71ddd54b020a7Marek Olšák            free(depthTemp);
55281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            return;
55291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
55301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         else {
55311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLuint *src = (const GLuint *) source;
55321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLfloat scale = 1.0f / 0xffffff;
55331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
55341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i++) {
55351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                GLuint value = src[i];
55361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                if (srcPacking->SwapBytes) {
55371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    SWAP4BYTE(value);
55381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                }
55391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                depthValues[i] = (value >> 8) * scale;
55401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
55411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
55421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
5543bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5544bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák         {
5545bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák            GLuint i;
5546bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák            const GLfloat *src = (const GLfloat *)source;
5547bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák            for (i = 0; i < n; i++) {
5548bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák               GLfloat value = src[i * 2];
5549bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák               if (srcPacking->SwapBytes) {
5550bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák                  SWAP4BYTE(value);
5551bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák               }
5552bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák               depthValues[i] = value;
5553bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák            }
5554bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák            needClamp = GL_TRUE;
5555bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák         }
5556bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák         break;
55571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_FLOAT:
55581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         DEPTH_VALUES(GLfloat, 1*);
55591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         needClamp = GL_TRUE;
55601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      case GL_HALF_FLOAT_ARB:
55621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         {
55631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            GLuint i;
55641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLhalfARB *src = (const GLhalfARB *) source;
55651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            for (i = 0; i < n; i++) {
55661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLhalfARB value = src[i];
55671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (srcPacking->SwapBytes) {
55681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  SWAP2BYTE(value);
55691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
55701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               depthValues[i] = _mesa_half_to_float(value);
55711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
55721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            needClamp = GL_TRUE;
55731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
55741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         break;
55751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      default:
55761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
557736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul         free(depthTemp);
55781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return;
55791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
55801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
55811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* apply depth scale and bias */
55821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {
55831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const GLfloat scale = ctx->Pixel.DepthScale;
55841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const GLfloat bias = ctx->Pixel.DepthBias;
55851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (scale != 1.0 || bias != 0.0) {
55861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
55871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
55881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            depthValues[i] = depthValues[i] * scale + bias;
55891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
55901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         needClamp = GL_TRUE;
55911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
55921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
55931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
55941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /* clamp to [0, 1] */
55951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (needClamp) {
55961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;
55971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (i = 0; i < n; i++) {
55981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
55991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
56011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
56021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   /*
56031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    * Convert values to dstType
56041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul    */
56051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (dstType == GL_UNSIGNED_INT) {
56061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint *zValues = (GLuint *) dest;
56071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;
56081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (depthMax <= 0xffffff) {
56091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* no overflow worries */
56101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
56111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
56121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
56131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      else {
56151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         /* need to use double precision to prevent overflow problems */
56161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
5617605f964d5cc7016fc74e0563829fa794da845c20Kenneth Graunke            GLdouble z = depthValues[i] * (GLdouble) depthMax;
56181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (z >= (GLdouble) 0xffffffff)
56191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               zValues[i] = 0xffffffff;
56201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else
56211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               zValues[i] = (GLuint) z;
56221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
56231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
56251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else if (dstType == GL_UNSIGNED_SHORT) {
56261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLushort *zValues = (GLushort *) dest;
56271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLuint i;
56281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      ASSERT(depthMax <= 0xffff);
56291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (i = 0; i < n; i++) {
56301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
56311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
5633bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák   else if (dstType == GL_FLOAT) {
5634bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      /* Nothing to do. depthValues is pointing to dest. */
5635bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák   }
5636bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák   else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
5637bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      GLfloat *zValues = (GLfloat*) dest;
5638bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      GLuint i;
5639bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      for (i = 0; i < n; i++) {
5640bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák         zValues[i*2] = depthValues[i];
5641bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      }
5642bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák   }
56431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {
5644bfb63b7d62ccd9618a110f9f5297f87574384058Marek Olšák      ASSERT(0);
56451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
564636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
564736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(depthTemp);
56481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
56491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
56501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
56511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/*
56521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Pack an array of depth values.  The values are floats in [0,1].
56531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
56541c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
565536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
56561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       GLenum dstType, const GLfloat *depthSpan,
56571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                       const struct gl_pixelstore_attrib *dstPacking )
56581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
565936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
566036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   if (!depthCopy) {
566136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
566236b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      return;
566336b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
56641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
56651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
56661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
56671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
56681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      depthSpan = depthCopy;
56691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
56701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
56711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   switch (dstType) {
56721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_BYTE:
56731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
56741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLubyte *dst = (GLubyte *) dest;
56751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
56761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
56771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
56781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
56791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
56811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_BYTE:
56821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
56831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLbyte *dst = (GLbyte *) dest;
56841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
56851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
56861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
56871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
56881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
56891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
56901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_SHORT:
56911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
56921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLushort *dst = (GLushort *) dest;
56931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
56941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
56951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
56961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
56971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
56981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
56991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_SHORT:
57031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
57041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLshort *dst = (GLshort *) dest;
57051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
57061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
57071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
57081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
57101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
57111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_UNSIGNED_INT:
57151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
57161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint *dst = (GLuint *) dest;
57171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
57181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
57191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
57201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
57221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
57231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_INT:
57271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
57281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLint *dst = (GLint *) dest;
57291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
57301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
57311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = FLOAT_TO_INT( depthSpan[i] );
57321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
57341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
57351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_FLOAT:
57391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
57401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLfloat *dst = (GLfloat *) dest;
57411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
57421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
57431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = depthSpan[i];
57441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
57461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap4( (GLuint *) dst, n );
57471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   case GL_HALF_FLOAT_ARB:
57511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      {
57521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
57531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         GLuint i;
57541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (i = 0; i < n; i++) {
57551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst[i] = _mesa_float_to_half(depthSpan[i]);
57561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         if (dstPacking->SwapBytes) {
57581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            _mesa_swap2( (GLushort *) dst, n );
57591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
57601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
57611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      break;
57621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   default:
57631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
57641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
576536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
576636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(depthCopy);
57671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
57681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
57691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
57701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
57711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
577201f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
57731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
57741c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid
577501f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák_mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n,
577601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák                              GLenum dstType, GLuint *dest,
57771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                              const GLfloat *depthVals,
57786d68855df133bdd4891e8aa428787b520739e0feBrian Paul                              const GLubyte *stencilVals,
57791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                              const struct gl_pixelstore_attrib *dstPacking)
57801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
578136b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
57826d68855df133bdd4891e8aa428787b520739e0feBrian Paul   GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte));
57831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLuint i;
57841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
578536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   if (!depthCopy || !stencilCopy) {
578636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
578736b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      free(depthCopy);
578836b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      free(stencilCopy);
578936b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul      return;
579036b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   }
57911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
57921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
57931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
57941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
57951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      depthVals = depthCopy;
57961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
57971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
57981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (ctx->Pixel.IndexShift ||
57991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       ctx->Pixel.IndexOffset ||
58001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul       ctx->Pixel.MapStencilFlag) {
58016d68855df133bdd4891e8aa428787b520739e0feBrian Paul      memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte));
58021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
58031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      stencilVals = stencilCopy;
58041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
58051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
580601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák   switch (dstType) {
580701f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák   case GL_UNSIGNED_INT_24_8:
580801f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      for (i = 0; i < n; i++) {
580901f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák         GLuint z = (GLuint) (depthVals[i] * 0xffffff);
581001f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák         dest[i] = (z << 8) | (stencilVals[i] & 0xff);
581101f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      }
581201f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      break;
581301f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
581401f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      for (i = 0; i < n; i++) {
581501f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák         ((GLfloat*)dest)[i*2] = depthVals[i];
581601f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák         dest[i*2+1] = stencilVals[i] & 0xff;
581701f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      }
581801f48a979d85525acd060c8055ec835a1b56ea87Marek Olšák      break;
58191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
58201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (dstPacking->SwapBytes) {
58221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      _mesa_swap4(dest, n);
58231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
582436b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul
582536b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(depthCopy);
582636b09b5ded84a03622a746bd6e963cec5d70c5c3Brian Paul   free(stencilCopy);
58271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
58281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul/**
58331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
58341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * Return all image data in a contiguous block.  This is used when we
58351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * compile glDrawPixels, glTexImage, etc into a display list.  We
58361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul * need a copy of the data in a standard format.
58371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul */
58381c131752c3e07ef91f49d4970dafca6d26585334Brian Paulvoid *
58391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul_mesa_unpack_image( GLuint dimensions,
58401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    GLsizei width, GLsizei height, GLsizei depth,
58411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
58421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                    const struct gl_pixelstore_attrib *unpack )
58431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul{
58441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLint bytesPerRow, compsPerRow;
58451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   GLboolean flipBytes, swap2, swap4;
58461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (!pixels)
58481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return NULL;  /* not necessarily an error */
58491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (width <= 0 || height <= 0 || depth <= 0)
58511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return NULL;  /* generate error later */
58521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   if (type == GL_BITMAP) {
58541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytesPerRow = (width + 7) >> 3;
58551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      flipBytes = unpack->LsbFirst;
58561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      swap2 = swap4 = GL_FALSE;
58571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      compsPerRow = 0;
58581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
58591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   else {
58601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
58611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint components = _mesa_components_in_format(format);
58621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint bytesPerComp;
58631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (_mesa_type_is_packed(type))
58651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul          components = 1;
58661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (bytesPerPixel <= 0 || components <= 0)
58681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return NULL;   /* bad format or type.  generate error later */
58691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytesPerRow = bytesPerPixel * width;
58701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      bytesPerComp = bytesPerPixel / components;
58711c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      flipBytes = GL_FALSE;
58721c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
58731c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
58741c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      compsPerRow = components * width;
58751c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      assert(compsPerRow >= width);
58761c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
58771c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58781c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   {
58791c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *destBuffer
58801c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         = (GLubyte *) malloc(bytesPerRow * height * depth);
58811c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLubyte *dst;
58821c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      GLint img, row;
58831c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      if (!destBuffer)
58841c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
58851c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58861c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      dst = destBuffer;
58871c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      for (img = 0; img < depth; img++) {
58881c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         for (row = 0; row < height; row++) {
58891c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
58901c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                               width, height, format, type, img, row, 0);
58911c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
58921c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
58931c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               GLint i;
58941c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               flipBytes = GL_FALSE;
58951c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               if (unpack->LsbFirst) {
58961c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
58971c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte dstMask = 128;
58981c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  const GLubyte *s = src;
58991c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte *d = dst;
59001c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
59011c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i = 0; i < width; i++) {
59021c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (*s & srcMask) {
59031c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        *d |= dstMask;
59041c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59051c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (srcMask == 128) {
59061c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        srcMask = 1;
59071c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        s++;
59081c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59091c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     else {
59101c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        srcMask = srcMask << 1;
59111c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59121c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (dstMask == 1) {
59131c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        dstMask = 128;
59141c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        d++;
59151c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        *d = 0;
59161c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59171c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     else {
59181c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        dstMask = dstMask >> 1;
59191c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59201c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
59211c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
59221c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               else {
59231c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
59241c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte dstMask = 128;
59251c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  const GLubyte *s = src;
59261c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  GLubyte *d = dst;
59271c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  *d = 0;
59281c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  for (i = 0; i < width; i++) {
59291c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (*s & srcMask) {
59301c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        *d |= dstMask;
59311c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59321c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (srcMask == 1) {
59331c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        srcMask = 128;
59341c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        s++;
59351c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59361c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     else {
59371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        srcMask = srcMask >> 1;
59381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     if (dstMask == 1) {
59401c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        dstMask = 128;
59411c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        d++;
59421c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        *d = 0;
59431c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59441c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     else {
59451c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                        dstMask = dstMask >> 1;
59461c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                     }
59471c131752c3e07ef91f49d4970dafca6d26585334Brian Paul                  }
59481c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               }
59491c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
59501c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else {
59511c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               memcpy(dst, src, bytesPerRow);
59521c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
59531c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
59541c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            /* byte flipping/swapping */
59551c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            if (flipBytes) {
59561c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
59571c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
59581c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else if (swap2) {
59591c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
59601c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
59611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            else if (swap4) {
59621c131752c3e07ef91f49d4970dafca6d26585334Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
59631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            }
59641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul            dst += bytesPerRow;
59651c131752c3e07ef91f49d4970dafca6d26585334Brian Paul         }
59661c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      }
59671c131752c3e07ef91f49d4970dafca6d26585334Brian Paul      return destBuffer;
59681c131752c3e07ef91f49d4970dafca6d26585334Brian Paul   }
59691c131752c3e07ef91f49d4970dafca6d26585334Brian Paul}
59701c131752c3e07ef91f49d4970dafca6d26585334Brian Paul
5971774c4027651436451b3486f62b9a8903f29a715bBrian Paul
5972774c4027651436451b3486f62b9a8903f29a715bBrian Paul
5973774c4027651436451b3486f62b9a8903f29a715bBrian Paul/**
5974774c4027651436451b3486f62b9a8903f29a715bBrian Paul * If we unpack colors from a luminance surface, we'll get pixel colors
5975774c4027651436451b3486f62b9a8903f29a715bBrian Paul * such as (l, l, l, a).
5976774c4027651436451b3486f62b9a8903f29a715bBrian Paul * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5977774c4027651436451b3486f62b9a8903f29a715bBrian Paul * function will compute L=R+G+B before packing.  The net effect is we'll
5978774c4027651436451b3486f62b9a8903f29a715bBrian Paul * accidentally store luminance values = 3*l.
5979774c4027651436451b3486f62b9a8903f29a715bBrian Paul * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5980774c4027651436451b3486f62b9a8903f29a715bBrian Paul * to be (l,0,0,a).
5981774c4027651436451b3486f62b9a8903f29a715bBrian Paul * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5982774c4027651436451b3486f62b9a8903f29a715bBrian Paul * and INTENSITY.
5983774c4027651436451b3486f62b9a8903f29a715bBrian Paul *
5984774c4027651436451b3486f62b9a8903f29a715bBrian Paul * Finally, we also need to do this when the actual surface format does
5985774c4027651436451b3486f62b9a8903f29a715bBrian Paul * not match the logical surface format.  For example, suppose the user
5986774c4027651436451b3486f62b9a8903f29a715bBrian Paul * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5987774c4027651436451b3486f62b9a8903f29a715bBrian Paul * Again, we'll get pixel values like (l,l,l,a).
5988774c4027651436451b3486f62b9a8903f29a715bBrian Paul */
5989774c4027651436451b3486f62b9a8903f29a715bBrian Paulvoid
5990774c4027651436451b3486f62b9a8903f29a715bBrian Paul_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat)
5991774c4027651436451b3486f62b9a8903f29a715bBrian Paul{
5992774c4027651436451b3486f62b9a8903f29a715bBrian Paul   GLuint i;
5993774c4027651436451b3486f62b9a8903f29a715bBrian Paul
5994774c4027651436451b3486f62b9a8903f29a715bBrian Paul   switch (baseFormat) {
5995774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_ALPHA:
5996774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
5997774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][RCOMP] = 0.0F;
5998774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0.0F;
5999774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0.0F;
6000774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6001774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6002774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_INTENSITY:
6003774c4027651436451b3486f62b9a8903f29a715bBrian Paul      /* fall-through */
6004774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_LUMINANCE:
6005774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
6006774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0.0F;
6007774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0.0F;
6008774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][ACOMP] = 1.0F;
6009774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6010774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6011774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_LUMINANCE_ALPHA:
6012774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
6013774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0.0F;
6014774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0.0F;
6015774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6016774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6017774c4027651436451b3486f62b9a8903f29a715bBrian Paul   default:
6018774c4027651436451b3486f62b9a8903f29a715bBrian Paul      /* no-op */
6019774c4027651436451b3486f62b9a8903f29a715bBrian Paul      ;
6020774c4027651436451b3486f62b9a8903f29a715bBrian Paul   }
6021774c4027651436451b3486f62b9a8903f29a715bBrian Paul}
6022774c4027651436451b3486f62b9a8903f29a715bBrian Paul
6023774c4027651436451b3486f62b9a8903f29a715bBrian Paul
6024774c4027651436451b3486f62b9a8903f29a715bBrian Paul/**
6025774c4027651436451b3486f62b9a8903f29a715bBrian Paul * As above, but GLuint components.
6026774c4027651436451b3486f62b9a8903f29a715bBrian Paul */
6027774c4027651436451b3486f62b9a8903f29a715bBrian Paulvoid
6028774c4027651436451b3486f62b9a8903f29a715bBrian Paul_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat)
6029774c4027651436451b3486f62b9a8903f29a715bBrian Paul{
6030774c4027651436451b3486f62b9a8903f29a715bBrian Paul   GLuint i;
6031774c4027651436451b3486f62b9a8903f29a715bBrian Paul
6032774c4027651436451b3486f62b9a8903f29a715bBrian Paul   switch (baseFormat) {
6033774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_ALPHA:
6034774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
6035774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][RCOMP] = 0;
6036774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0;
6037774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0;
6038774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6039774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6040774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_INTENSITY:
6041774c4027651436451b3486f62b9a8903f29a715bBrian Paul      /* fall-through */
6042774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_LUMINANCE:
6043774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
6044774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0;
6045774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0;
6046774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][ACOMP] = 1;
6047774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6048774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6049774c4027651436451b3486f62b9a8903f29a715bBrian Paul   case GL_LUMINANCE_ALPHA:
6050774c4027651436451b3486f62b9a8903f29a715bBrian Paul      for (i = 0; i < n; i++) {
6051774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][GCOMP] = 0;
6052774c4027651436451b3486f62b9a8903f29a715bBrian Paul         rgba[i][BCOMP] = 0;
6053774c4027651436451b3486f62b9a8903f29a715bBrian Paul      }
6054774c4027651436451b3486f62b9a8903f29a715bBrian Paul      break;
6055774c4027651436451b3486f62b9a8903f29a715bBrian Paul   default:
6056774c4027651436451b3486f62b9a8903f29a715bBrian Paul      /* no-op */
6057774c4027651436451b3486f62b9a8903f29a715bBrian Paul      ;
6058774c4027651436451b3486f62b9a8903f29a715bBrian Paul   }
6059774c4027651436451b3486f62b9a8903f29a715bBrian Paul}
6060774c4027651436451b3486f62b9a8903f29a715bBrian Paul
6061774c4027651436451b3486f62b9a8903f29a715bBrian Paul
6062