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