pack.c revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5848b8605Smrg * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
6848b8605Smrg *
7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
8848b8605Smrg * copy of this software and associated documentation files (the "Software"),
9848b8605Smrg * to deal in the Software without restriction, including without limitation
10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
12848b8605Smrg * Software is furnished to do so, subject to the following conditions:
13848b8605Smrg *
14848b8605Smrg * The above copyright notice and this permission notice shall be included
15848b8605Smrg * in all copies or substantial portions of the Software.
16848b8605Smrg *
17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20848b8605Smrg * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21848b8605Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22848b8605Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg
26848b8605Smrg/**
27848b8605Smrg * \file pack.c
28848b8605Smrg * Image and pixel span packing and unpacking.
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg
32848b8605Smrg/*
33848b8605Smrg * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34848b8605Smrg * this global optimization.
35848b8605Smrg *
36848b8605Smrg * See also:
37848b8605Smrg * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38848b8605Smrg * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
39848b8605Smrg */
40848b8605Smrg#if defined(_MSC_VER) && defined(_M_X64)
41848b8605Smrg#  pragma optimize( "g", off )
42848b8605Smrg#endif
43848b8605Smrg
44848b8605Smrg
45848b8605Smrg#include "glheader.h"
46848b8605Smrg#include "colormac.h"
47848b8605Smrg#include "enums.h"
48848b8605Smrg#include "image.h"
49848b8605Smrg#include "imports.h"
50848b8605Smrg#include "macros.h"
51848b8605Smrg#include "mtypes.h"
52848b8605Smrg#include "pack.h"
53848b8605Smrg#include "pixeltransfer.h"
54848b8605Smrg#include "imports.h"
55848b8605Smrg#include "glformats.h"
56848b8605Smrg#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57848b8605Smrg#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
58848b8605Smrg
59848b8605Smrg
60848b8605Smrg/**
61848b8605Smrg * Flip the 8 bits in each byte of the given array.
62848b8605Smrg *
63848b8605Smrg * \param p array.
64848b8605Smrg * \param n number of bytes.
65848b8605Smrg *
66848b8605Smrg * \todo try this trick to flip bytes someday:
67848b8605Smrg * \code
68848b8605Smrg *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69848b8605Smrg *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70848b8605Smrg *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
71848b8605Smrg * \endcode
72848b8605Smrg */
73848b8605Smrgstatic void
74848b8605Smrgflip_bytes( GLubyte *p, GLuint n )
75848b8605Smrg{
76848b8605Smrg   GLuint i, a, b;
77848b8605Smrg   for (i = 0; i < n; i++) {
78848b8605Smrg      b = (GLuint) p[i];        /* words are often faster than bytes */
79848b8605Smrg      a = ((b & 0x01) << 7) |
80848b8605Smrg	  ((b & 0x02) << 5) |
81848b8605Smrg	  ((b & 0x04) << 3) |
82848b8605Smrg	  ((b & 0x08) << 1) |
83848b8605Smrg	  ((b & 0x10) >> 1) |
84848b8605Smrg	  ((b & 0x20) >> 3) |
85848b8605Smrg	  ((b & 0x40) >> 5) |
86848b8605Smrg	  ((b & 0x80) >> 7);
87848b8605Smrg      p[i] = (GLubyte) a;
88848b8605Smrg   }
89848b8605Smrg}
90848b8605Smrg
91848b8605Smrg
92848b8605Smrg
93848b8605Smrg/*
94848b8605Smrg * Unpack a 32x32 pixel polygon stipple from user memory using the
95848b8605Smrg * current pixel unpack settings.
96848b8605Smrg */
97848b8605Smrgvoid
98848b8605Smrg_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
99848b8605Smrg                              const struct gl_pixelstore_attrib *unpacking )
100848b8605Smrg{
101848b8605Smrg   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
102848b8605Smrg   if (ptrn) {
103848b8605Smrg      /* Convert pattern from GLubytes to GLuints and handle big/little
104848b8605Smrg       * endian differences
105848b8605Smrg       */
106848b8605Smrg      GLubyte *p = ptrn;
107848b8605Smrg      GLint i;
108848b8605Smrg      for (i = 0; i < 32; i++) {
109848b8605Smrg         dest[i] = (p[0] << 24)
110848b8605Smrg                 | (p[1] << 16)
111848b8605Smrg                 | (p[2] <<  8)
112848b8605Smrg                 | (p[3]      );
113848b8605Smrg         p += 4;
114848b8605Smrg      }
115848b8605Smrg      free(ptrn);
116848b8605Smrg   }
117848b8605Smrg}
118848b8605Smrg
119848b8605Smrg
120848b8605Smrg/*
121848b8605Smrg * Pack polygon stipple into user memory given current pixel packing
122848b8605Smrg * settings.
123848b8605Smrg */
124848b8605Smrgvoid
125848b8605Smrg_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
126848b8605Smrg                            const struct gl_pixelstore_attrib *packing )
127848b8605Smrg{
128848b8605Smrg   /* Convert pattern from GLuints to GLubytes to handle big/little
129848b8605Smrg    * endian differences.
130848b8605Smrg    */
131848b8605Smrg   GLubyte ptrn[32*4];
132848b8605Smrg   GLint i;
133848b8605Smrg   for (i = 0; i < 32; i++) {
134848b8605Smrg      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
135848b8605Smrg      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
136848b8605Smrg      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
137848b8605Smrg      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
138848b8605Smrg   }
139848b8605Smrg
140848b8605Smrg   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
141848b8605Smrg}
142848b8605Smrg
143848b8605Smrg
144848b8605Smrg/*
145848b8605Smrg * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
146848b8605Smrg * order with row alignment = 1 byte.
147848b8605Smrg */
148848b8605SmrgGLvoid *
149848b8605Smrg_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
150848b8605Smrg                     const struct gl_pixelstore_attrib *packing )
151848b8605Smrg{
152848b8605Smrg   GLint bytes, row, width_in_bytes;
153848b8605Smrg   GLubyte *buffer, *dst;
154848b8605Smrg
155848b8605Smrg   if (!pixels)
156848b8605Smrg      return NULL;
157848b8605Smrg
158848b8605Smrg   /* Alloc dest storage */
159848b8605Smrg   bytes = ((width + 7) / 8 * height);
160848b8605Smrg   buffer = malloc( bytes );
161848b8605Smrg   if (!buffer)
162848b8605Smrg      return NULL;
163848b8605Smrg
164848b8605Smrg   width_in_bytes = CEILING( width, 8 );
165848b8605Smrg   dst = buffer;
166848b8605Smrg   for (row = 0; row < height; row++) {
167848b8605Smrg      const GLubyte *src = (const GLubyte *)
168848b8605Smrg         _mesa_image_address2d(packing, pixels, width, height,
169848b8605Smrg                               GL_COLOR_INDEX, GL_BITMAP, row, 0);
170848b8605Smrg      if (!src) {
171848b8605Smrg         free(buffer);
172848b8605Smrg         return NULL;
173848b8605Smrg      }
174848b8605Smrg
175848b8605Smrg      if ((packing->SkipPixels & 7) == 0) {
176848b8605Smrg         memcpy( dst, src, width_in_bytes );
177848b8605Smrg         if (packing->LsbFirst) {
178848b8605Smrg            flip_bytes( dst, width_in_bytes );
179848b8605Smrg         }
180848b8605Smrg      }
181848b8605Smrg      else {
182848b8605Smrg         /* handling SkipPixels is a bit tricky (no pun intended!) */
183848b8605Smrg         GLint i;
184848b8605Smrg         if (packing->LsbFirst) {
185848b8605Smrg            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
186848b8605Smrg            GLubyte dstMask = 128;
187848b8605Smrg            const GLubyte *s = src;
188848b8605Smrg            GLubyte *d = dst;
189848b8605Smrg            *d = 0;
190848b8605Smrg            for (i = 0; i < width; i++) {
191848b8605Smrg               if (*s & srcMask) {
192848b8605Smrg                  *d |= dstMask;
193848b8605Smrg               }
194848b8605Smrg               if (srcMask == 128) {
195848b8605Smrg                  srcMask = 1;
196848b8605Smrg                  s++;
197848b8605Smrg               }
198848b8605Smrg               else {
199848b8605Smrg                  srcMask = srcMask << 1;
200848b8605Smrg               }
201848b8605Smrg               if (dstMask == 1) {
202848b8605Smrg                  dstMask = 128;
203848b8605Smrg                  d++;
204848b8605Smrg                  *d = 0;
205848b8605Smrg               }
206848b8605Smrg               else {
207848b8605Smrg                  dstMask = dstMask >> 1;
208848b8605Smrg               }
209848b8605Smrg            }
210848b8605Smrg         }
211848b8605Smrg         else {
212848b8605Smrg            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
213848b8605Smrg            GLubyte dstMask = 128;
214848b8605Smrg            const GLubyte *s = src;
215848b8605Smrg            GLubyte *d = dst;
216848b8605Smrg            *d = 0;
217848b8605Smrg            for (i = 0; i < width; i++) {
218848b8605Smrg               if (*s & srcMask) {
219848b8605Smrg                  *d |= dstMask;
220848b8605Smrg               }
221848b8605Smrg               if (srcMask == 1) {
222848b8605Smrg                  srcMask = 128;
223848b8605Smrg                  s++;
224848b8605Smrg               }
225848b8605Smrg               else {
226848b8605Smrg                  srcMask = srcMask >> 1;
227848b8605Smrg               }
228848b8605Smrg               if (dstMask == 1) {
229848b8605Smrg                  dstMask = 128;
230848b8605Smrg                  d++;
231848b8605Smrg                  *d = 0;
232848b8605Smrg               }
233848b8605Smrg               else {
234848b8605Smrg                  dstMask = dstMask >> 1;
235848b8605Smrg               }
236848b8605Smrg            }
237848b8605Smrg         }
238848b8605Smrg      }
239848b8605Smrg      dst += width_in_bytes;
240848b8605Smrg   }
241848b8605Smrg
242848b8605Smrg   return buffer;
243848b8605Smrg}
244848b8605Smrg
245848b8605Smrg
246848b8605Smrg/*
247848b8605Smrg * Pack bitmap data.
248848b8605Smrg */
249848b8605Smrgvoid
250848b8605Smrg_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
251848b8605Smrg                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
252848b8605Smrg{
253848b8605Smrg   GLint row, width_in_bytes;
254848b8605Smrg   const GLubyte *src;
255848b8605Smrg
256848b8605Smrg   if (!source)
257848b8605Smrg      return;
258848b8605Smrg
259848b8605Smrg   width_in_bytes = CEILING( width, 8 );
260848b8605Smrg   src = source;
261848b8605Smrg   for (row = 0; row < height; row++) {
262848b8605Smrg      GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
263848b8605Smrg                       width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
264848b8605Smrg      if (!dst)
265848b8605Smrg         return;
266848b8605Smrg
267848b8605Smrg      if ((packing->SkipPixels & 7) == 0) {
268848b8605Smrg         memcpy( dst, src, width_in_bytes );
269848b8605Smrg         if (packing->LsbFirst) {
270848b8605Smrg            flip_bytes( dst, width_in_bytes );
271848b8605Smrg         }
272848b8605Smrg      }
273848b8605Smrg      else {
274848b8605Smrg         /* handling SkipPixels is a bit tricky (no pun intended!) */
275848b8605Smrg         GLint i;
276848b8605Smrg         if (packing->LsbFirst) {
277848b8605Smrg            GLubyte srcMask = 128;
278848b8605Smrg            GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
279848b8605Smrg            const GLubyte *s = src;
280848b8605Smrg            GLubyte *d = dst;
281848b8605Smrg            *d = 0;
282848b8605Smrg            for (i = 0; i < width; i++) {
283848b8605Smrg               if (*s & srcMask) {
284848b8605Smrg                  *d |= dstMask;
285848b8605Smrg               }
286848b8605Smrg               if (srcMask == 1) {
287848b8605Smrg                  srcMask = 128;
288848b8605Smrg                  s++;
289848b8605Smrg               }
290848b8605Smrg               else {
291848b8605Smrg                  srcMask = srcMask >> 1;
292848b8605Smrg               }
293848b8605Smrg               if (dstMask == 128) {
294848b8605Smrg                  dstMask = 1;
295848b8605Smrg                  d++;
296848b8605Smrg                  *d = 0;
297848b8605Smrg               }
298848b8605Smrg               else {
299848b8605Smrg                  dstMask = dstMask << 1;
300848b8605Smrg               }
301848b8605Smrg            }
302848b8605Smrg         }
303848b8605Smrg         else {
304848b8605Smrg            GLubyte srcMask = 128;
305848b8605Smrg            GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
306848b8605Smrg            const GLubyte *s = src;
307848b8605Smrg            GLubyte *d = dst;
308848b8605Smrg            *d = 0;
309848b8605Smrg            for (i = 0; i < width; i++) {
310848b8605Smrg               if (*s & srcMask) {
311848b8605Smrg                  *d |= dstMask;
312848b8605Smrg               }
313848b8605Smrg               if (srcMask == 1) {
314848b8605Smrg                  srcMask = 128;
315848b8605Smrg                  s++;
316848b8605Smrg               }
317848b8605Smrg               else {
318848b8605Smrg                  srcMask = srcMask >> 1;
319848b8605Smrg               }
320848b8605Smrg               if (dstMask == 1) {
321848b8605Smrg                  dstMask = 128;
322848b8605Smrg                  d++;
323848b8605Smrg                  *d = 0;
324848b8605Smrg               }
325848b8605Smrg               else {
326848b8605Smrg                  dstMask = dstMask >> 1;
327848b8605Smrg               }
328848b8605Smrg            }
329848b8605Smrg         }
330848b8605Smrg      }
331848b8605Smrg      src += width_in_bytes;
332848b8605Smrg   }
333848b8605Smrg}
334848b8605Smrg
335848b8605Smrg
336848b8605Smrg/**
337848b8605Smrg * Get indexes of color components for a basic color format, such as
338848b8605Smrg * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc.  Return -1 for indexes
339848b8605Smrg * that do not apply.
340848b8605Smrg */
341848b8605Smrgstatic void
342848b8605Smrgget_component_indexes(GLenum format,
343848b8605Smrg                      GLint *redIndex,
344848b8605Smrg                      GLint *greenIndex,
345848b8605Smrg                      GLint *blueIndex,
346848b8605Smrg                      GLint *alphaIndex,
347848b8605Smrg                      GLint *luminanceIndex,
348848b8605Smrg                      GLint *intensityIndex)
349848b8605Smrg{
350848b8605Smrg   *redIndex = -1;
351848b8605Smrg   *greenIndex = -1;
352848b8605Smrg   *blueIndex = -1;
353848b8605Smrg   *alphaIndex = -1;
354848b8605Smrg   *luminanceIndex = -1;
355848b8605Smrg   *intensityIndex = -1;
356848b8605Smrg
357848b8605Smrg   switch (format) {
358848b8605Smrg   case GL_LUMINANCE:
359848b8605Smrg   case GL_LUMINANCE_INTEGER_EXT:
360848b8605Smrg      *luminanceIndex = 0;
361848b8605Smrg      break;
362848b8605Smrg   case GL_LUMINANCE_ALPHA:
363848b8605Smrg   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
364848b8605Smrg      *luminanceIndex = 0;
365848b8605Smrg      *alphaIndex = 1;
366848b8605Smrg      break;
367848b8605Smrg   case GL_INTENSITY:
368848b8605Smrg      *intensityIndex = 0;
369848b8605Smrg      break;
370848b8605Smrg   case GL_RED:
371848b8605Smrg   case GL_RED_INTEGER_EXT:
372848b8605Smrg      *redIndex = 0;
373848b8605Smrg      break;
374848b8605Smrg   case GL_GREEN:
375848b8605Smrg   case GL_GREEN_INTEGER_EXT:
376848b8605Smrg      *greenIndex = 0;
377848b8605Smrg      break;
378848b8605Smrg   case GL_BLUE:
379848b8605Smrg   case GL_BLUE_INTEGER_EXT:
380848b8605Smrg      *blueIndex = 0;
381848b8605Smrg      break;
382848b8605Smrg   case GL_ALPHA:
383848b8605Smrg   case GL_ALPHA_INTEGER_EXT:
384848b8605Smrg      *alphaIndex = 0;
385848b8605Smrg      break;
386848b8605Smrg   case GL_RG:
387848b8605Smrg   case GL_RG_INTEGER:
388848b8605Smrg      *redIndex = 0;
389848b8605Smrg      *greenIndex = 1;
390848b8605Smrg      break;
391848b8605Smrg   case GL_RGB:
392848b8605Smrg   case GL_RGB_INTEGER_EXT:
393848b8605Smrg      *redIndex = 0;
394848b8605Smrg      *greenIndex = 1;
395848b8605Smrg      *blueIndex = 2;
396848b8605Smrg      break;
397848b8605Smrg   case GL_BGR:
398848b8605Smrg   case GL_BGR_INTEGER_EXT:
399848b8605Smrg      *blueIndex = 0;
400848b8605Smrg      *greenIndex = 1;
401848b8605Smrg      *redIndex = 2;
402848b8605Smrg      break;
403848b8605Smrg   case GL_RGBA:
404848b8605Smrg   case GL_RGBA_INTEGER_EXT:
405848b8605Smrg      *redIndex = 0;
406848b8605Smrg      *greenIndex = 1;
407848b8605Smrg      *blueIndex = 2;
408848b8605Smrg      *alphaIndex = 3;
409848b8605Smrg      break;
410848b8605Smrg   case GL_BGRA:
411848b8605Smrg   case GL_BGRA_INTEGER:
412848b8605Smrg      *redIndex = 2;
413848b8605Smrg      *greenIndex = 1;
414848b8605Smrg      *blueIndex = 0;
415848b8605Smrg      *alphaIndex = 3;
416848b8605Smrg      break;
417848b8605Smrg   case GL_ABGR_EXT:
418848b8605Smrg      *redIndex = 3;
419848b8605Smrg      *greenIndex = 2;
420848b8605Smrg      *blueIndex = 1;
421848b8605Smrg      *alphaIndex = 0;
422848b8605Smrg      break;
423848b8605Smrg   default:
424848b8605Smrg      assert(0 && "bad format in get_component_indexes()");
425848b8605Smrg   }
426848b8605Smrg}
427848b8605Smrg
428848b8605Smrg
429848b8605Smrg
430848b8605Smrg/**
431848b8605Smrg * For small integer types, return the min and max possible values.
432848b8605Smrg * Used for clamping floats to unscaled integer types.
433848b8605Smrg * \return GL_TRUE if type is handled, GL_FALSE otherwise.
434848b8605Smrg */
435848b8605Smrgstatic GLboolean
436848b8605Smrgget_type_min_max(GLenum type, GLfloat *min, GLfloat *max)
437848b8605Smrg{
438848b8605Smrg   switch (type) {
439848b8605Smrg   case GL_BYTE:
440848b8605Smrg      *min = -128.0;
441848b8605Smrg      *max = 127.0;
442848b8605Smrg      return GL_TRUE;
443848b8605Smrg   case GL_UNSIGNED_BYTE:
444848b8605Smrg      *min = 0.0;
445848b8605Smrg      *max = 255.0;
446848b8605Smrg      return GL_TRUE;
447848b8605Smrg   case GL_SHORT:
448848b8605Smrg      *min = -32768.0;
449848b8605Smrg      *max = 32767.0;
450848b8605Smrg      return GL_TRUE;
451848b8605Smrg   case GL_UNSIGNED_SHORT:
452848b8605Smrg      *min = 0.0;
453848b8605Smrg      *max = 65535.0;
454848b8605Smrg      return GL_TRUE;
455848b8605Smrg   default:
456848b8605Smrg      return GL_FALSE;
457848b8605Smrg   }
458848b8605Smrg}
459848b8605Smrg
460848b8605Smrg/* Customization of unsigned integer packing.
461848b8605Smrg */
462848b8605Smrg#define SRC_TYPE GLuint
463848b8605Smrg
464848b8605Smrg#define DST_TYPE GLuint
465848b8605Smrg#define SRC_CONVERT(x) (x)
466848b8605Smrg#define FN_NAME pack_uint_from_uint_rgba
467848b8605Smrg#include "pack_tmp.h"
468848b8605Smrg#undef DST_TYPE
469848b8605Smrg#undef SRC_CONVERT
470848b8605Smrg#undef FN_NAME
471848b8605Smrg
472848b8605Smrg#define DST_TYPE GLint
473848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0x7fffffff)
474848b8605Smrg#define FN_NAME pack_int_from_uint_rgba
475848b8605Smrg#include "pack_tmp.h"
476848b8605Smrg#undef DST_TYPE
477848b8605Smrg#undef SRC_CONVERT
478848b8605Smrg#undef FN_NAME
479848b8605Smrg
480848b8605Smrg#define DST_TYPE GLushort
481848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0xffff)
482848b8605Smrg#define FN_NAME pack_ushort_from_uint_rgba
483848b8605Smrg#include "pack_tmp.h"
484848b8605Smrg#undef DST_TYPE
485848b8605Smrg#undef SRC_CONVERT
486848b8605Smrg#undef FN_NAME
487848b8605Smrg
488848b8605Smrg#define DST_TYPE GLshort
489848b8605Smrg#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
490848b8605Smrg#define FN_NAME pack_short_from_uint_rgba
491848b8605Smrg#include "pack_tmp.h"
492848b8605Smrg#undef DST_TYPE
493848b8605Smrg#undef SRC_CONVERT
494848b8605Smrg#undef FN_NAME
495848b8605Smrg
496848b8605Smrg#define DST_TYPE GLubyte
497848b8605Smrg#define SRC_CONVERT(x) MIN2(x, 0xff)
498848b8605Smrg#define FN_NAME pack_ubyte_from_uint_rgba
499848b8605Smrg#include "pack_tmp.h"
500848b8605Smrg#undef DST_TYPE
501848b8605Smrg#undef SRC_CONVERT
502848b8605Smrg#undef FN_NAME
503848b8605Smrg
504848b8605Smrg#define DST_TYPE GLbyte
505848b8605Smrg#define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
506848b8605Smrg#define FN_NAME pack_byte_from_uint_rgba
507848b8605Smrg#include "pack_tmp.h"
508848b8605Smrg#undef DST_TYPE
509848b8605Smrg#undef SRC_CONVERT
510848b8605Smrg#undef FN_NAME
511848b8605Smrg
512848b8605Smrg#undef SRC_TYPE
513848b8605Smrg
514848b8605Smrgstatic void
515848b8605Smrg_pack_rgba_span_from_uints_problem(struct gl_context *ctx,
516848b8605Smrg                                   GLenum dstFormat, GLenum dstType)
517848b8605Smrg{
518848b8605Smrg   _mesa_problem(ctx,
519848b8605Smrg                 "Unsupported type (%s) / format (%s) "
520848b8605Smrg                 "in _mesa_pack_rgba_span_from_uints",
521848b8605Smrg                 _mesa_lookup_enum_by_nr(dstType),
522848b8605Smrg                 _mesa_lookup_enum_by_nr(dstFormat));
523848b8605Smrg}
524848b8605Smrg
525848b8605Smrgvoid
526848b8605Smrg_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4],
527848b8605Smrg                                GLenum dstFormat, GLenum dstType,
528848b8605Smrg                                GLvoid *dstAddr)
529848b8605Smrg{
530848b8605Smrg   GLuint i;
531848b8605Smrg
532848b8605Smrg   switch(dstType) {
533848b8605Smrg   case GL_UNSIGNED_INT:
534848b8605Smrg      pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
535848b8605Smrg      break;
536848b8605Smrg   case GL_INT:
537848b8605Smrg      pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
538848b8605Smrg      break;
539848b8605Smrg   case GL_UNSIGNED_SHORT:
540848b8605Smrg      pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
541848b8605Smrg      break;
542848b8605Smrg   case GL_SHORT:
543848b8605Smrg      pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
544848b8605Smrg      break;
545848b8605Smrg   case GL_UNSIGNED_BYTE:
546848b8605Smrg      pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
547848b8605Smrg      break;
548848b8605Smrg   case GL_BYTE:
549848b8605Smrg      pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n);
550848b8605Smrg      break;
551848b8605Smrg   case GL_UNSIGNED_BYTE_3_3_2:
552848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
553848b8605Smrg         GLubyte *dst = (GLubyte *) dstAddr;
554848b8605Smrg         for (i=0;i<n;i++) {
555848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 7) << 5)
556848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 7) << 2)
557848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 3)     );
558848b8605Smrg         }
559848b8605Smrg      } else {
560848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
561848b8605Smrg      }
562848b8605Smrg      break;
563848b8605Smrg   case GL_UNSIGNED_BYTE_2_3_3_REV:
564848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
565848b8605Smrg         GLubyte *dst = (GLubyte *) dstAddr;
566848b8605Smrg         for (i=0;i<n;i++) {
567848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 7)     )
568848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 7) << 3)
569848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 3) << 6);
570848b8605Smrg         }
571848b8605Smrg      } else {
572848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
573848b8605Smrg      }
574848b8605Smrg      break;
575848b8605Smrg   case GL_UNSIGNED_SHORT_5_6_5:
576848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
577848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
578848b8605Smrg         for (i=0;i<n;i++) {
579848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 31) << 11)
580848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 63) <<  5)
581848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31)      );
582848b8605Smrg         }
583848b8605Smrg      } else {
584848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
585848b8605Smrg      }
586848b8605Smrg      break;
587848b8605Smrg   case GL_UNSIGNED_SHORT_5_6_5_REV:
588848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
589848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
590848b8605Smrg         for (i=0;i<n;i++) {
591848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 31)      )
592848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 63) <<  5)
593848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31) << 11);
594848b8605Smrg         }
595848b8605Smrg      } else {
596848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
597848b8605Smrg      }
598848b8605Smrg      break;
599848b8605Smrg   case GL_UNSIGNED_SHORT_4_4_4_4:
600848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
601848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
602848b8605Smrg         for (i=0;i<n;i++) {
603848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 15) << 12)
604848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  8)
605848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 15) <<  4)
606848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 15)      );
607848b8605Smrg         }
608848b8605Smrg      }
609848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
610848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
611848b8605Smrg         for (i=0;i<n;i++) {
612848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 15) << 12)
613848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  8)
614848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 15) <<  4)
615848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 15)      );
616848b8605Smrg         }
617848b8605Smrg      }
618848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
619848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
620848b8605Smrg         for (i=0;i<n;i++) {
621848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 15) << 12)
622848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 15) <<  8)
623848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  4)
624848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 15)      );
625848b8605Smrg         }
626848b8605Smrg      } else {
627848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
628848b8605Smrg      }
629848b8605Smrg      break;
630848b8605Smrg   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
631848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
632848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
633848b8605Smrg         for (i=0;i<n;i++) {
634848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 15)      )
635848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  4)
636848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 15) <<  8)
637848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 15) << 12);
638848b8605Smrg         }
639848b8605Smrg      }
640848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
641848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
642848b8605Smrg         for (i=0;i<n;i++) {
643848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 15)      )
644848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  4)
645848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 15) <<  8)
646848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 15) << 12);
647848b8605Smrg         }
648848b8605Smrg      }
649848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
650848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
651848b8605Smrg         for (i=0;i<n;i++) {
652848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 15)      )
653848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 15) <<  4)
654848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 15) <<  8)
655848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 15) << 12);
656848b8605Smrg         }
657848b8605Smrg      } else {
658848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
659848b8605Smrg      }
660848b8605Smrg      break;
661848b8605Smrg   case GL_UNSIGNED_SHORT_5_5_5_1:
662848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
663848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
664848b8605Smrg         for (i=0;i<n;i++) {
665848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 31) << 11)
666848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) <<  6)
667848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31) <<  1)
668848b8605Smrg                   | (MIN2(rgba[i][ACOMP],  1)      );
669848b8605Smrg         }
670848b8605Smrg      }
671848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
672848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
673848b8605Smrg         for (i=0;i<n;i++) {
674848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 31) << 11)
675848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) <<  6)
676848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 31) <<  1)
677848b8605Smrg                   | (MIN2(rgba[i][ACOMP],  1)      );
678848b8605Smrg         }
679848b8605Smrg      }
680848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
681848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
682848b8605Smrg         for (i=0;i<n;i++) {
683848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 31) << 11)
684848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31) <<  6)
685848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) <<  1)
686848b8605Smrg                   | (MIN2(rgba[i][RCOMP],  1)      );
687848b8605Smrg         }
688848b8605Smrg      } else {
689848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
690848b8605Smrg      }
691848b8605Smrg      break;
692848b8605Smrg   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
693848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
694848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
695848b8605Smrg         for (i=0;i<n;i++) {
696848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 31)      )
697848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) <<  5)
698848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31) << 10)
699848b8605Smrg                   | (MIN2(rgba[i][ACOMP],  1) << 15);
700848b8605Smrg         }
701848b8605Smrg      }
702848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
703848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
704848b8605Smrg         for (i=0;i<n;i++) {
705848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 31)      )
706848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) <<  5)
707848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 31) << 10)
708848b8605Smrg                   | (MIN2(rgba[i][ACOMP],  1) << 15);
709848b8605Smrg         }
710848b8605Smrg      }
711848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
712848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
713848b8605Smrg         for (i=0;i<n;i++) {
714848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 31)      )
715848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 31) <<  5)
716848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 31) << 10)
717848b8605Smrg                   | (MIN2(rgba[i][RCOMP],  1) << 15);
718848b8605Smrg         }
719848b8605Smrg      } else {
720848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
721848b8605Smrg      }
722848b8605Smrg      break;
723848b8605Smrg   case GL_UNSIGNED_INT_8_8_8_8:
724848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
725848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
726848b8605Smrg         for (i=0;i<n;i++) {
727848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 255) << 24)
728848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) << 16)
729848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 255) <<  8)
730848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 255)      );
731848b8605Smrg         }
732848b8605Smrg      }
733848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
734848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
735848b8605Smrg         for (i=0;i<n;i++) {
736848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 255) << 24)
737848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) << 16)
738848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 255) <<  8)
739848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 255)      );
740848b8605Smrg         }
741848b8605Smrg      }
742848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
743848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
744848b8605Smrg         for (i=0;i<n;i++) {
745848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 255) << 24)
746848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 255) << 16)
747848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) <<  8)
748848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 255)      );
749848b8605Smrg         }
750848b8605Smrg      } else {
751848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
752848b8605Smrg      }
753848b8605Smrg      break;
754848b8605Smrg   case GL_UNSIGNED_INT_8_8_8_8_REV:
755848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
756848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
757848b8605Smrg         for (i=0;i<n;i++) {
758848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 255)      )
759848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) <<  8)
760848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 255) << 16)
761848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 255) << 24);
762848b8605Smrg         }
763848b8605Smrg      }
764848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
765848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
766848b8605Smrg         for (i=0;i<n;i++) {
767848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 255)      )
768848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) <<  8)
769848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 255) << 16)
770848b8605Smrg                   | (MIN2(rgba[i][ACOMP], 255) << 24);
771848b8605Smrg         }
772848b8605Smrg      }
773848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
774848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
775848b8605Smrg         for (i=0;i<n;i++) {
776848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 255)      )
777848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 255) <<  8)
778848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 255) << 16)
779848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 255) << 24);
780848b8605Smrg         }
781848b8605Smrg      } else {
782848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
783848b8605Smrg      }
784848b8605Smrg      break;
785848b8605Smrg   case GL_UNSIGNED_INT_10_10_10_2:
786848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
787848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
788848b8605Smrg         for (i=0;i<n;i++) {
789848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 1023) << 22)
790848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) << 12)
791848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 1023) <<  2)
792848b8605Smrg                   | (MIN2(rgba[i][ACOMP],    3)      );
793848b8605Smrg         }
794848b8605Smrg      }
795848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
796848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
797848b8605Smrg         for (i=0;i<n;i++) {
798848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 1023) << 22)
799848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) << 12)
800848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 1023) <<  2)
801848b8605Smrg                   | (MIN2(rgba[i][ACOMP],    3)      );
802848b8605Smrg         }
803848b8605Smrg      }
804848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
805848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
806848b8605Smrg         for (i=0;i<n;i++) {
807848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 1023) << 22)
808848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 1023) << 12)
809848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) <<  2)
810848b8605Smrg                   | (MIN2(rgba[i][RCOMP],    3)      );
811848b8605Smrg         }
812848b8605Smrg      } else {
813848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
814848b8605Smrg      }
815848b8605Smrg      break;
816848b8605Smrg   case GL_UNSIGNED_INT_2_10_10_10_REV:
817848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
818848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
819848b8605Smrg         for (i=0;i<n;i++) {
820848b8605Smrg            dst[i] = (MIN2(rgba[i][RCOMP], 1023)      )
821848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) << 10)
822848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 1023) << 20)
823848b8605Smrg                   | (MIN2(rgba[i][ACOMP],    3) << 30);
824848b8605Smrg         }
825848b8605Smrg      }
826848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
827848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
828848b8605Smrg         for (i=0;i<n;i++) {
829848b8605Smrg            dst[i] = (MIN2(rgba[i][BCOMP], 1023)      )
830848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) << 10)
831848b8605Smrg                   | (MIN2(rgba[i][RCOMP], 1023) << 20)
832848b8605Smrg                   | (MIN2(rgba[i][ACOMP],    3) << 30);
833848b8605Smrg         }
834848b8605Smrg      }
835848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
836848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
837848b8605Smrg         for (i=0;i<n;i++) {
838848b8605Smrg            dst[i] = (MIN2(rgba[i][ACOMP], 1023)      )
839848b8605Smrg                   | (MIN2(rgba[i][BCOMP], 1023) << 10)
840848b8605Smrg                   | (MIN2(rgba[i][GCOMP], 1023) << 20)
841848b8605Smrg                   | (MIN2(rgba[i][RCOMP],    3) << 30);
842848b8605Smrg         }
843848b8605Smrg      } else {
844848b8605Smrg         _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
845848b8605Smrg      }
846848b8605Smrg      break;
847848b8605Smrg   default:
848848b8605Smrg      _pack_rgba_span_from_uints_problem(ctx, dstFormat, dstType);
849848b8605Smrg      return;
850848b8605Smrg   }
851848b8605Smrg}
852848b8605Smrg
853848b8605Smrg
854848b8605Smrg/* Customization of signed integer packing.
855848b8605Smrg */
856848b8605Smrg#define SRC_TYPE GLint
857848b8605Smrg
858848b8605Smrg#define DST_TYPE GLuint
859848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0)
860848b8605Smrg#define FN_NAME pack_uint_from_int_rgba
861848b8605Smrg#include "pack_tmp.h"
862848b8605Smrg#undef DST_TYPE
863848b8605Smrg#undef SRC_CONVERT
864848b8605Smrg#undef FN_NAME
865848b8605Smrg
866848b8605Smrg#define DST_TYPE GLushort
867848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0)
868848b8605Smrg#define FN_NAME pack_ushort_from_int_rgba
869848b8605Smrg#include "pack_tmp.h"
870848b8605Smrg#undef DST_TYPE
871848b8605Smrg#undef SRC_CONVERT
872848b8605Smrg#undef FN_NAME
873848b8605Smrg
874848b8605Smrg#define DST_TYPE GLshort
875848b8605Smrg#define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff)
876848b8605Smrg#define FN_NAME pack_short_from_int_rgba
877848b8605Smrg#include "pack_tmp.h"
878848b8605Smrg#undef DST_TYPE
879848b8605Smrg#undef SRC_CONVERT
880848b8605Smrg#undef FN_NAME
881848b8605Smrg
882848b8605Smrg#define DST_TYPE GLubyte
883848b8605Smrg#define SRC_CONVERT(x) MAX2(x, 0)
884848b8605Smrg#define FN_NAME pack_ubyte_from_int_rgba
885848b8605Smrg#include "pack_tmp.h"
886848b8605Smrg#undef DST_TYPE
887848b8605Smrg#undef SRC_CONVERT
888848b8605Smrg#undef FN_NAME
889848b8605Smrg
890848b8605Smrg#define DST_TYPE GLbyte
891848b8605Smrg#define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f)
892848b8605Smrg#define FN_NAME pack_byte_from_int_rgba
893848b8605Smrg#include "pack_tmp.h"
894848b8605Smrg#undef DST_TYPE
895848b8605Smrg#undef SRC_CONVERT
896848b8605Smrg#undef FN_NAME
897848b8605Smrg
898848b8605Smrg#undef SRC_TYPE
899848b8605Smrg
900848b8605Smrgstatic void
901848b8605Smrg_pack_rgba_span_from_ints_problem(struct gl_context *ctx,
902848b8605Smrg                                   GLenum dstFormat, GLenum dstType)
903848b8605Smrg{
904848b8605Smrg   _mesa_problem(ctx,
905848b8605Smrg                 "Unsupported type (%s) / format (%s) "
906848b8605Smrg                 "in _mesa_pack_rgba_span_from_ints",
907848b8605Smrg                 _mesa_lookup_enum_by_nr(dstType),
908848b8605Smrg                 _mesa_lookup_enum_by_nr(dstFormat));
909848b8605Smrg}
910848b8605Smrg
911848b8605Smrgvoid
912848b8605Smrg_mesa_pack_rgba_span_from_ints(struct gl_context *ctx, GLuint n, GLint rgba[][4],
913848b8605Smrg                               GLenum dstFormat, GLenum dstType,
914848b8605Smrg                               GLvoid *dstAddr)
915848b8605Smrg{
916848b8605Smrg   GLuint i;
917848b8605Smrg
918848b8605Smrg   switch(dstType) {
919848b8605Smrg   case GL_UNSIGNED_INT:
920848b8605Smrg      pack_uint_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
921848b8605Smrg      break;
922848b8605Smrg   case GL_INT:
923848b8605Smrg      /* No conversion necessary. */
924848b8605Smrg      pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, (GLuint (*)[4]) rgba, n);
925848b8605Smrg      break;
926848b8605Smrg   case GL_UNSIGNED_SHORT:
927848b8605Smrg      pack_ushort_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
928848b8605Smrg      break;
929848b8605Smrg   case GL_SHORT:
930848b8605Smrg      pack_short_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
931848b8605Smrg      break;
932848b8605Smrg   case GL_UNSIGNED_BYTE:
933848b8605Smrg      pack_ubyte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
934848b8605Smrg      break;
935848b8605Smrg   case GL_BYTE:
936848b8605Smrg      pack_byte_from_int_rgba(ctx, dstAddr, dstFormat, rgba, n);
937848b8605Smrg      break;
938848b8605Smrg   case GL_UNSIGNED_BYTE_3_3_2:
939848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
940848b8605Smrg         GLubyte *dst = (GLubyte *) dstAddr;
941848b8605Smrg         for (i=0;i<n;i++) {
942848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7) << 5)
943848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 2)
944848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 3)     );
945848b8605Smrg         }
946848b8605Smrg      } else {
947848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
948848b8605Smrg      }
949848b8605Smrg      break;
950848b8605Smrg   case GL_UNSIGNED_BYTE_2_3_3_REV:
951848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
952848b8605Smrg         GLubyte *dst = (GLubyte *) dstAddr;
953848b8605Smrg         for (i=0;i<n;i++) {
954848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 7)     )
955848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 7) << 3)
956848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 3) << 6);
957848b8605Smrg         }
958848b8605Smrg      } else {
959848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
960848b8605Smrg      }
961848b8605Smrg      break;
962848b8605Smrg   case GL_UNSIGNED_SHORT_5_6_5:
963848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
964848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
965848b8605Smrg         for (i=0;i<n;i++) {
966848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
967848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
968848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31)      );
969848b8605Smrg         }
970848b8605Smrg      } else {
971848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
972848b8605Smrg      }
973848b8605Smrg      break;
974848b8605Smrg   case GL_UNSIGNED_SHORT_5_6_5_REV:
975848b8605Smrg      if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) {
976848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
977848b8605Smrg         for (i=0;i<n;i++) {
978848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
979848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 63) <<  5)
980848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 11);
981848b8605Smrg         }
982848b8605Smrg      } else {
983848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
984848b8605Smrg      }
985848b8605Smrg      break;
986848b8605Smrg   case GL_UNSIGNED_SHORT_4_4_4_4:
987848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
988848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
989848b8605Smrg         for (i=0;i<n;i++) {
990848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15) << 12)
991848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
992848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
993848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
994848b8605Smrg         }
995848b8605Smrg      }
996848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
997848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
998848b8605Smrg         for (i=0;i<n;i++) {
999848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15) << 12)
1000848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
1001848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  4)
1002848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 15)      );
1003848b8605Smrg         }
1004848b8605Smrg      }
1005848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1006848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1007848b8605Smrg         for (i=0;i<n;i++) {
1008848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15) << 12)
1009848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
1010848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1011848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 15)      );
1012848b8605Smrg         }
1013848b8605Smrg      } else {
1014848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1015848b8605Smrg      }
1016848b8605Smrg      break;
1017848b8605Smrg   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1018848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1019848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1020848b8605Smrg         for (i=0;i<n;i++) {
1021848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 15)      )
1022848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1023848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  8)
1024848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
1025848b8605Smrg         }
1026848b8605Smrg      }
1027848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1028848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1029848b8605Smrg         for (i=0;i<n;i++) {
1030848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 15)      )
1031848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  4)
1032848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 15) <<  8)
1033848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 15) << 12);
1034848b8605Smrg         }
1035848b8605Smrg      }
1036848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1037848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1038848b8605Smrg         for (i=0;i<n;i++) {
1039848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 15)      )
1040848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 15) <<  4)
1041848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 15) <<  8)
1042848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 15) << 12);
1043848b8605Smrg         }
1044848b8605Smrg      } else {
1045848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1046848b8605Smrg      }
1047848b8605Smrg      break;
1048848b8605Smrg   case GL_UNSIGNED_SHORT_5_5_5_1:
1049848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1050848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1051848b8605Smrg         for (i=0;i<n;i++) {
1052848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31) << 11)
1053848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
1054848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  1)
1055848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
1056848b8605Smrg         }
1057848b8605Smrg      }
1058848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1059848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1060848b8605Smrg         for (i=0;i<n;i++) {
1061848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31) << 11)
1062848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  6)
1063848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 31) <<  1)
1064848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,  1)      );
1065848b8605Smrg         }
1066848b8605Smrg      }
1067848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1068848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1069848b8605Smrg         for (i=0;i<n;i++) {
1070848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31) << 11)
1071848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  6)
1072848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  1)
1073848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0,  1)      );
1074848b8605Smrg         }
1075848b8605Smrg      } else {
1076848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1077848b8605Smrg      }
1078848b8605Smrg      break;
1079848b8605Smrg   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1080848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1081848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1082848b8605Smrg         for (i=0;i<n;i++) {
1083848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 31)      )
1084848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
1085848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31) << 10)
1086848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
1087848b8605Smrg         }
1088848b8605Smrg      }
1089848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1090848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1091848b8605Smrg         for (i=0;i<n;i++) {
1092848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 31)      )
1093848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) <<  5)
1094848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 31) << 10)
1095848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,  1) << 15);
1096848b8605Smrg         }
1097848b8605Smrg      }
1098848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1099848b8605Smrg         GLushort *dst = (GLushort *) dstAddr;
1100848b8605Smrg         for (i=0;i<n;i++) {
1101848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 31)      )
1102848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 31) <<  5)
1103848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 31) << 10)
1104848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0,  1) << 15);
1105848b8605Smrg         }
1106848b8605Smrg      } else {
1107848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1108848b8605Smrg      }
1109848b8605Smrg      break;
1110848b8605Smrg   case GL_UNSIGNED_INT_8_8_8_8:
1111848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1112848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1113848b8605Smrg         for (i=0;i<n;i++) {
1114848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255) << 24)
1115848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1116848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
1117848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
1118848b8605Smrg         }
1119848b8605Smrg      }
1120848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1121848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1122848b8605Smrg         for (i=0;i<n;i++) {
1123848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255) << 24)
1124848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1125848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 255) <<  8)
1126848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 255)      );
1127848b8605Smrg         }
1128848b8605Smrg      }
1129848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1130848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1131848b8605Smrg         for (i=0;i<n;i++) {
1132848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255) << 24)
1133848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
1134848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1135848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 255)      );
1136848b8605Smrg         }
1137848b8605Smrg      } else {
1138848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1139848b8605Smrg      }
1140848b8605Smrg      break;
1141848b8605Smrg   case GL_UNSIGNED_INT_8_8_8_8_REV:
1142848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1143848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1144848b8605Smrg         for (i=0;i<n;i++) {
1145848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 255)      )
1146848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1147848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 255) << 16)
1148848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
1149848b8605Smrg         }
1150848b8605Smrg      }
1151848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1152848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1153848b8605Smrg         for (i=0;i<n;i++) {
1154848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 255)      )
1155848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) <<  8)
1156848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 16)
1157848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0, 255) << 24);
1158848b8605Smrg         }
1159848b8605Smrg      }
1160848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1161848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1162848b8605Smrg         for (i=0;i<n;i++) {
1163848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 255)      )
1164848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 255) <<  8)
1165848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 255) << 16)
1166848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 255) << 24);
1167848b8605Smrg         }
1168848b8605Smrg      } else {
1169848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1170848b8605Smrg      }
1171848b8605Smrg      break;
1172848b8605Smrg   case GL_UNSIGNED_INT_10_10_10_2:
1173848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1174848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1175848b8605Smrg         for (i=0;i<n;i++) {
1176848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023) << 22)
1177848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
1178848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 1023) <<  2)
1179848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
1180848b8605Smrg         }
1181848b8605Smrg      }
1182848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1183848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1184848b8605Smrg         for (i=0;i<n;i++) {
1185848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023) << 22)
1186848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 12)
1187848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 1023) <<  2)
1188848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,    3)      );
1189848b8605Smrg         }
1190848b8605Smrg      }
1191848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1192848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1193848b8605Smrg         for (i=0;i<n;i++) {
1194848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023) << 22)
1195848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 12)
1196848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) <<  2)
1197848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0,    3)      );
1198848b8605Smrg         }
1199848b8605Smrg      } else {
1200848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1201848b8605Smrg      }
1202848b8605Smrg      break;
1203848b8605Smrg   case GL_UNSIGNED_INT_2_10_10_10_REV:
1204848b8605Smrg      if ((dstFormat == GL_RGBA) || (dstFormat == GL_RGBA_INTEGER_EXT)) {
1205848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1206848b8605Smrg         for (i=0;i<n;i++) {
1207848b8605Smrg            dst[i] = (CLAMP(rgba[i][RCOMP], 0, 1023)      )
1208848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
1209848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 20)
1210848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
1211848b8605Smrg         }
1212848b8605Smrg      }
1213848b8605Smrg      else if ((dstFormat == GL_BGRA) || (dstFormat == GL_BGRA_INTEGER)) {
1214848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1215848b8605Smrg         for (i=0;i<n;i++) {
1216848b8605Smrg            dst[i] = (CLAMP(rgba[i][BCOMP], 0, 1023)      )
1217848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 10)
1218848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0, 1023) << 20)
1219848b8605Smrg                   | (CLAMP(rgba[i][ACOMP], 0,    3) << 30);
1220848b8605Smrg         }
1221848b8605Smrg      }
1222848b8605Smrg      else if (dstFormat == GL_ABGR_EXT) {
1223848b8605Smrg         GLuint *dst = (GLuint *) dstAddr;
1224848b8605Smrg         for (i=0;i<n;i++) {
1225848b8605Smrg            dst[i] = (CLAMP(rgba[i][ACOMP], 0, 1023)      )
1226848b8605Smrg                   | (CLAMP(rgba[i][BCOMP], 0, 1023) << 10)
1227848b8605Smrg                   | (CLAMP(rgba[i][GCOMP], 0, 1023) << 20)
1228848b8605Smrg                   | (CLAMP(rgba[i][RCOMP], 0,    3) << 30);
1229848b8605Smrg         }
1230848b8605Smrg      } else {
1231848b8605Smrg         _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1232848b8605Smrg      }
1233848b8605Smrg      break;
1234848b8605Smrg   default:
1235848b8605Smrg      _pack_rgba_span_from_ints_problem(ctx, dstFormat, dstType);
1236848b8605Smrg      return;
1237848b8605Smrg   }
1238848b8605Smrg}
1239848b8605Smrg
1240848b8605Smrg
1241848b8605Smrg/**
1242848b8605Smrg * Used to pack an array [][4] of RGBA float colors as specified
1243848b8605Smrg * by the dstFormat, dstType and dstPacking.  Used by glReadPixels.
1244848b8605Smrg * Historically, the RGBA values were in [0,1] and rescaled to fit
1245848b8605Smrg * into GLubytes, etc.  But with new integer formats, the RGBA values
1246848b8605Smrg * may have any value and we don't always rescale when converting to
1247848b8605Smrg * integers.
1248848b8605Smrg *
1249848b8605Smrg * Note: the rgba values will be modified by this function when any pixel
1250848b8605Smrg * transfer ops are enabled.
1251848b8605Smrg */
1252848b8605Smrgvoid
1253848b8605Smrg_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
1254848b8605Smrg                           GLenum dstFormat, GLenum dstType,
1255848b8605Smrg                           GLvoid *dstAddr,
1256848b8605Smrg                           const struct gl_pixelstore_attrib *dstPacking,
1257848b8605Smrg                           GLbitfield transferOps)
1258848b8605Smrg{
1259848b8605Smrg   GLfloat *luminance;
1260848b8605Smrg   const GLint comps = _mesa_components_in_format(dstFormat);
1261848b8605Smrg   const GLboolean intDstFormat = _mesa_is_enum_format_integer(dstFormat);
1262848b8605Smrg   GLuint i;
1263848b8605Smrg
1264848b8605Smrg   if (dstFormat == GL_LUMINANCE ||
1265848b8605Smrg       dstFormat == GL_LUMINANCE_ALPHA ||
1266848b8605Smrg       dstFormat == GL_LUMINANCE_INTEGER_EXT ||
1267848b8605Smrg       dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) {
1268848b8605Smrg      luminance = malloc(n * sizeof(GLfloat));
1269848b8605Smrg      if (!luminance) {
1270848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
1271848b8605Smrg         return;
1272848b8605Smrg      }
1273848b8605Smrg   }
1274848b8605Smrg   else {
1275848b8605Smrg      luminance = NULL;
1276848b8605Smrg   }
1277848b8605Smrg
1278848b8605Smrg   /* EXT_texture_integer specifies no transfer ops on integer
1279848b8605Smrg    * types in the resolved issues section. Just set them to 0
1280848b8605Smrg    * for integer surfaces.
1281848b8605Smrg    */
1282848b8605Smrg   if (intDstFormat)
1283848b8605Smrg      transferOps = 0;
1284848b8605Smrg
1285848b8605Smrg   if (transferOps) {
1286848b8605Smrg      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
1287848b8605Smrg   }
1288848b8605Smrg
1289848b8605Smrg   /*
1290848b8605Smrg    * Component clamping (besides clamping to [0,1] in
1291848b8605Smrg    * _mesa_apply_rgba_transfer_ops()).
1292848b8605Smrg    */
1293848b8605Smrg   if (intDstFormat) {
1294848b8605Smrg      /* clamping to dest type's min/max values */
1295848b8605Smrg      GLfloat min, max;
1296848b8605Smrg      if (get_type_min_max(dstType, &min, &max)) {
1297848b8605Smrg         for (i = 0; i < n; i++) {
1298848b8605Smrg            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
1299848b8605Smrg            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
1300848b8605Smrg            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
1301848b8605Smrg            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
1302848b8605Smrg         }
1303848b8605Smrg      }
1304848b8605Smrg   }
1305848b8605Smrg   else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
1306848b8605Smrg      /* compute luminance values */
1307848b8605Smrg      if (transferOps & IMAGE_CLAMP_BIT) {
1308848b8605Smrg         for (i = 0; i < n; i++) {
1309848b8605Smrg            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
1310848b8605Smrg            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
1311848b8605Smrg         }
1312848b8605Smrg      }
1313848b8605Smrg      else {
1314848b8605Smrg         for (i = 0; i < n; i++) {
1315848b8605Smrg            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
1316848b8605Smrg         }
1317848b8605Smrg      }
1318848b8605Smrg   }
1319848b8605Smrg
1320848b8605Smrg   /*
1321848b8605Smrg    * Pack/store the pixels.  Ugh!  Lots of cases!!!
1322848b8605Smrg    */
1323848b8605Smrg   switch (dstType) {
1324848b8605Smrg      case GL_UNSIGNED_BYTE:
1325848b8605Smrg         {
1326848b8605Smrg            GLubyte *dst = (GLubyte *) dstAddr;
1327848b8605Smrg            switch (dstFormat) {
1328848b8605Smrg               case GL_RED:
1329848b8605Smrg                  for (i=0;i<n;i++)
1330848b8605Smrg                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1331848b8605Smrg                  break;
1332848b8605Smrg               case GL_GREEN:
1333848b8605Smrg                  for (i=0;i<n;i++)
1334848b8605Smrg                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1335848b8605Smrg                  break;
1336848b8605Smrg               case GL_BLUE:
1337848b8605Smrg                  for (i=0;i<n;i++)
1338848b8605Smrg                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1339848b8605Smrg                  break;
1340848b8605Smrg               case GL_ALPHA:
1341848b8605Smrg                  for (i=0;i<n;i++)
1342848b8605Smrg                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1343848b8605Smrg                  break;
1344848b8605Smrg               case GL_LUMINANCE:
1345848b8605Smrg                  for (i=0;i<n;i++)
1346848b8605Smrg                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
1347848b8605Smrg                  break;
1348848b8605Smrg               case GL_LUMINANCE_ALPHA:
1349848b8605Smrg                  for (i=0;i<n;i++) {
1350848b8605Smrg                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
1351848b8605Smrg                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1352848b8605Smrg                  }
1353848b8605Smrg                  break;
1354848b8605Smrg               case GL_RG:
1355848b8605Smrg                  for (i=0;i<n;i++) {
1356848b8605Smrg                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1357848b8605Smrg                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1358848b8605Smrg                  }
1359848b8605Smrg                  break;
1360848b8605Smrg               case GL_RGB:
1361848b8605Smrg                  for (i=0;i<n;i++) {
1362848b8605Smrg                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1363848b8605Smrg                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1364848b8605Smrg                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1365848b8605Smrg                  }
1366848b8605Smrg                  break;
1367848b8605Smrg               case GL_RGBA:
1368848b8605Smrg                  for (i=0;i<n;i++) {
1369848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1370848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1371848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1372848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1373848b8605Smrg                  }
1374848b8605Smrg                  break;
1375848b8605Smrg               case GL_BGR:
1376848b8605Smrg                  for (i=0;i<n;i++) {
1377848b8605Smrg                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1378848b8605Smrg                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1379848b8605Smrg                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1380848b8605Smrg                  }
1381848b8605Smrg                  break;
1382848b8605Smrg               case GL_BGRA:
1383848b8605Smrg                  for (i=0;i<n;i++) {
1384848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1385848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1386848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1387848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1388848b8605Smrg                  }
1389848b8605Smrg                  break;
1390848b8605Smrg               case GL_ABGR_EXT:
1391848b8605Smrg                  for (i=0;i<n;i++) {
1392848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1393848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1394848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1395848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1396848b8605Smrg                  }
1397848b8605Smrg                  break;
1398848b8605Smrg               case GL_RED_INTEGER_EXT:
1399848b8605Smrg                  for (i=0;i<n;i++) {
1400848b8605Smrg                     dst[i] = (GLubyte) rgba[i][RCOMP];
1401848b8605Smrg                  }
1402848b8605Smrg                  break;
1403848b8605Smrg               case GL_GREEN_INTEGER_EXT:
1404848b8605Smrg                  for (i=0;i<n;i++) {
1405848b8605Smrg                     dst[i] = (GLubyte) rgba[i][GCOMP];
1406848b8605Smrg                  }
1407848b8605Smrg                  break;
1408848b8605Smrg               case GL_BLUE_INTEGER_EXT:
1409848b8605Smrg                  for (i=0;i<n;i++) {
1410848b8605Smrg                     dst[i] = (GLubyte) rgba[i][BCOMP];
1411848b8605Smrg                  }
1412848b8605Smrg                  break;
1413848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
1414848b8605Smrg                  for (i=0;i<n;i++) {
1415848b8605Smrg                     dst[i] = (GLubyte) rgba[i][ACOMP];
1416848b8605Smrg                  }
1417848b8605Smrg                  break;
1418848b8605Smrg               case GL_RG_INTEGER:
1419848b8605Smrg                  for (i=0;i<n;i++) {
1420848b8605Smrg                     dst[i*2+0] = (GLubyte) rgba[i][RCOMP];
1421848b8605Smrg                     dst[i*2+1] = (GLubyte) rgba[i][GCOMP];
1422848b8605Smrg                  }
1423848b8605Smrg                  break;
1424848b8605Smrg               case GL_RGB_INTEGER_EXT:
1425848b8605Smrg                  for (i=0;i<n;i++) {
1426848b8605Smrg                     dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
1427848b8605Smrg                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
1428848b8605Smrg                     dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
1429848b8605Smrg                  }
1430848b8605Smrg                  break;
1431848b8605Smrg               case GL_RGBA_INTEGER_EXT:
1432848b8605Smrg                  for (i=0;i<n;i++) {
1433848b8605Smrg                     dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
1434848b8605Smrg                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
1435848b8605Smrg                     dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
1436848b8605Smrg                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
1437848b8605Smrg                  }
1438848b8605Smrg                  break;
1439848b8605Smrg               case GL_BGR_INTEGER_EXT:
1440848b8605Smrg                  for (i=0;i<n;i++) {
1441848b8605Smrg                     dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
1442848b8605Smrg                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
1443848b8605Smrg                     dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
1444848b8605Smrg                  }
1445848b8605Smrg                  break;
1446848b8605Smrg               case GL_BGRA_INTEGER_EXT:
1447848b8605Smrg                  for (i=0;i<n;i++) {
1448848b8605Smrg                     dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
1449848b8605Smrg                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
1450848b8605Smrg                     dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
1451848b8605Smrg                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
1452848b8605Smrg                  }
1453848b8605Smrg                  break;
1454848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
1455848b8605Smrg                  for (i=0;i<n;i++) {
1456848b8605Smrg                     dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
1457848b8605Smrg                                             rgba[i][GCOMP] +
1458848b8605Smrg                                             rgba[i][BCOMP]);
1459848b8605Smrg                     dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
1460848b8605Smrg                  }
1461848b8605Smrg                  break;
1462848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1463848b8605Smrg                  for (i=0;i<n;i++) {
1464848b8605Smrg                     dst[i] = (GLubyte) (rgba[i][RCOMP] +
1465848b8605Smrg                                         rgba[i][GCOMP] +
1466848b8605Smrg                                         rgba[i][BCOMP]);
1467848b8605Smrg                  }
1468848b8605Smrg                  break;
1469848b8605Smrg               default:
1470848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1471848b8605Smrg            }
1472848b8605Smrg         }
1473848b8605Smrg         break;
1474848b8605Smrg      case GL_BYTE:
1475848b8605Smrg         {
1476848b8605Smrg            GLbyte *dst = (GLbyte *) dstAddr;
1477848b8605Smrg            switch (dstFormat) {
1478848b8605Smrg               case GL_RED:
1479848b8605Smrg                  for (i=0;i<n;i++)
1480848b8605Smrg                     dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1481848b8605Smrg                  break;
1482848b8605Smrg               case GL_GREEN:
1483848b8605Smrg                  for (i=0;i<n;i++)
1484848b8605Smrg                     dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1485848b8605Smrg                  break;
1486848b8605Smrg               case GL_BLUE:
1487848b8605Smrg                  for (i=0;i<n;i++)
1488848b8605Smrg                     dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1489848b8605Smrg                  break;
1490848b8605Smrg               case GL_ALPHA:
1491848b8605Smrg                  for (i=0;i<n;i++)
1492848b8605Smrg                     dst[i] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]);
1493848b8605Smrg                  break;
1494848b8605Smrg               case GL_LUMINANCE:
1495848b8605Smrg                  for (i=0;i<n;i++)
1496848b8605Smrg                     dst[i] = FLOAT_TO_BYTE_TEX(luminance[i]);
1497848b8605Smrg                  break;
1498848b8605Smrg               case GL_LUMINANCE_ALPHA:
1499848b8605Smrg                  for (i=0;i<n;i++) {
1500848b8605Smrg                     dst[i*2+0] = FLOAT_TO_BYTE_TEX(luminance[i]);
1501848b8605Smrg                     dst[i*2+1] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]);
1502848b8605Smrg                  }
1503848b8605Smrg                  break;
1504848b8605Smrg               case GL_RG:
1505848b8605Smrg                  for (i=0;i<n;i++) {
1506848b8605Smrg                     dst[i*2+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1507848b8605Smrg                     dst[i*2+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1508848b8605Smrg                  }
1509848b8605Smrg                  break;
1510848b8605Smrg               case GL_RGB:
1511848b8605Smrg                  for (i=0;i<n;i++) {
1512848b8605Smrg                     dst[i*3+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1513848b8605Smrg                     dst[i*3+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1514848b8605Smrg                     dst[i*3+2] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1515848b8605Smrg                  }
1516848b8605Smrg                  break;
1517848b8605Smrg               case GL_RGBA:
1518848b8605Smrg                  for (i=0;i<n;i++) {
1519848b8605Smrg                     dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1520848b8605Smrg                     dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1521848b8605Smrg                     dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1522848b8605Smrg                     dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]);
1523848b8605Smrg                  }
1524848b8605Smrg                  break;
1525848b8605Smrg               case GL_BGR:
1526848b8605Smrg                  for (i=0;i<n;i++) {
1527848b8605Smrg                     dst[i*3+0] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1528848b8605Smrg                     dst[i*3+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1529848b8605Smrg                     dst[i*3+2] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1530848b8605Smrg                  }
1531848b8605Smrg                  break;
1532848b8605Smrg               case GL_BGRA:
1533848b8605Smrg                  for (i=0;i<n;i++) {
1534848b8605Smrg                     dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1535848b8605Smrg                     dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1536848b8605Smrg                     dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1537848b8605Smrg                     dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]);
1538848b8605Smrg                  }
1539848b8605Smrg		  break;
1540848b8605Smrg               case GL_ABGR_EXT:
1541848b8605Smrg                  for (i=0;i<n;i++) {
1542848b8605Smrg                     dst[i*4+0] = FLOAT_TO_BYTE_TEX(rgba[i][ACOMP]);
1543848b8605Smrg                     dst[i*4+1] = FLOAT_TO_BYTE_TEX(rgba[i][BCOMP]);
1544848b8605Smrg                     dst[i*4+2] = FLOAT_TO_BYTE_TEX(rgba[i][GCOMP]);
1545848b8605Smrg                     dst[i*4+3] = FLOAT_TO_BYTE_TEX(rgba[i][RCOMP]);
1546848b8605Smrg                  }
1547848b8605Smrg                  break;
1548848b8605Smrg               case GL_RED_INTEGER_EXT:
1549848b8605Smrg                  for (i=0;i<n;i++) {
1550848b8605Smrg                     dst[i] = (GLbyte) rgba[i][RCOMP];
1551848b8605Smrg                  }
1552848b8605Smrg                  break;
1553848b8605Smrg               case GL_GREEN_INTEGER_EXT:
1554848b8605Smrg                  for (i=0;i<n;i++) {
1555848b8605Smrg                     dst[i] = (GLbyte) rgba[i][GCOMP];
1556848b8605Smrg                  }
1557848b8605Smrg                  break;
1558848b8605Smrg               case GL_BLUE_INTEGER_EXT:
1559848b8605Smrg                  for (i=0;i<n;i++) {
1560848b8605Smrg                     dst[i] = (GLbyte) rgba[i][BCOMP];
1561848b8605Smrg                  }
1562848b8605Smrg                  break;
1563848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
1564848b8605Smrg                  for (i=0;i<n;i++) {
1565848b8605Smrg                     dst[i] = (GLbyte) rgba[i][ACOMP];
1566848b8605Smrg                  }
1567848b8605Smrg                  break;
1568848b8605Smrg               case GL_RG_INTEGER:
1569848b8605Smrg                  for (i=0;i<n;i++) {
1570848b8605Smrg                     dst[i*2+0] = (GLbyte) rgba[i][RCOMP];
1571848b8605Smrg                     dst[i*2+1] = (GLbyte) rgba[i][GCOMP];
1572848b8605Smrg                  }
1573848b8605Smrg                  break;
1574848b8605Smrg               case GL_RGB_INTEGER_EXT:
1575848b8605Smrg                  for (i=0;i<n;i++) {
1576848b8605Smrg                     dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
1577848b8605Smrg                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
1578848b8605Smrg                     dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
1579848b8605Smrg                  }
1580848b8605Smrg                  break;
1581848b8605Smrg               case GL_RGBA_INTEGER_EXT:
1582848b8605Smrg                  for (i=0;i<n;i++) {
1583848b8605Smrg                     dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
1584848b8605Smrg                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
1585848b8605Smrg                     dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
1586848b8605Smrg                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
1587848b8605Smrg                  }
1588848b8605Smrg                  break;
1589848b8605Smrg               case GL_BGR_INTEGER_EXT:
1590848b8605Smrg                  for (i=0;i<n;i++) {
1591848b8605Smrg                     dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
1592848b8605Smrg                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
1593848b8605Smrg                     dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
1594848b8605Smrg                  }
1595848b8605Smrg                  break;
1596848b8605Smrg               case GL_BGRA_INTEGER_EXT:
1597848b8605Smrg                  for (i=0;i<n;i++) {
1598848b8605Smrg                     dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
1599848b8605Smrg                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
1600848b8605Smrg                     dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
1601848b8605Smrg                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
1602848b8605Smrg                  }
1603848b8605Smrg                  break;
1604848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
1605848b8605Smrg                  for (i=0;i<n;i++) {
1606848b8605Smrg                     dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
1607848b8605Smrg                                            rgba[i][GCOMP] +
1608848b8605Smrg                                            rgba[i][BCOMP]);
1609848b8605Smrg                     dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
1610848b8605Smrg                  }
1611848b8605Smrg                  break;
1612848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1613848b8605Smrg                  for (i=0;i<n;i++) {
1614848b8605Smrg                     dst[i] = (GLbyte) (rgba[i][RCOMP] +
1615848b8605Smrg                                        rgba[i][GCOMP] +
1616848b8605Smrg                                        rgba[i][BCOMP]);
1617848b8605Smrg                  }
1618848b8605Smrg                  break;
1619848b8605Smrg               default:
1620848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1621848b8605Smrg            }
1622848b8605Smrg         }
1623848b8605Smrg         break;
1624848b8605Smrg      case GL_UNSIGNED_SHORT:
1625848b8605Smrg         {
1626848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
1627848b8605Smrg            switch (dstFormat) {
1628848b8605Smrg               case GL_RED:
1629848b8605Smrg                  for (i=0;i<n;i++)
1630848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
1631848b8605Smrg                  break;
1632848b8605Smrg               case GL_GREEN:
1633848b8605Smrg                  for (i=0;i<n;i++)
1634848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
1635848b8605Smrg                  break;
1636848b8605Smrg               case GL_BLUE:
1637848b8605Smrg                  for (i=0;i<n;i++)
1638848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
1639848b8605Smrg                  break;
1640848b8605Smrg               case GL_ALPHA:
1641848b8605Smrg                  for (i=0;i<n;i++)
1642848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
1643848b8605Smrg                  break;
1644848b8605Smrg               case GL_LUMINANCE:
1645848b8605Smrg                  for (i=0;i<n;i++)
1646848b8605Smrg                     UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
1647848b8605Smrg                  break;
1648848b8605Smrg               case GL_LUMINANCE_ALPHA:
1649848b8605Smrg                  for (i=0;i<n;i++) {
1650848b8605Smrg                     UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
1651848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
1652848b8605Smrg                  }
1653848b8605Smrg                  break;
1654848b8605Smrg               case GL_RG:
1655848b8605Smrg                  for (i=0;i<n;i++) {
1656848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
1657848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
1658848b8605Smrg                  }
1659848b8605Smrg                  break;
1660848b8605Smrg               case GL_RGB:
1661848b8605Smrg                  for (i=0;i<n;i++) {
1662848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
1663848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
1664848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
1665848b8605Smrg                  }
1666848b8605Smrg                  break;
1667848b8605Smrg               case GL_RGBA:
1668848b8605Smrg                  for (i=0;i<n;i++) {
1669848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
1670848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
1671848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
1672848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
1673848b8605Smrg                  }
1674848b8605Smrg                  break;
1675848b8605Smrg               case GL_BGR:
1676848b8605Smrg                  for (i=0;i<n;i++) {
1677848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
1678848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
1679848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
1680848b8605Smrg                  }
1681848b8605Smrg                  break;
1682848b8605Smrg               case GL_BGRA:
1683848b8605Smrg                  for (i=0;i<n;i++) {
1684848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
1685848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
1686848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
1687848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
1688848b8605Smrg                  }
1689848b8605Smrg                  break;
1690848b8605Smrg               case GL_ABGR_EXT:
1691848b8605Smrg                  for (i=0;i<n;i++) {
1692848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
1693848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
1694848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
1695848b8605Smrg                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
1696848b8605Smrg                  }
1697848b8605Smrg                  break;
1698848b8605Smrg               case GL_RED_INTEGER_EXT:
1699848b8605Smrg                  for (i=0;i<n;i++) {
1700848b8605Smrg                     dst[i] = (GLushort) rgba[i][RCOMP];
1701848b8605Smrg                  }
1702848b8605Smrg                  break;
1703848b8605Smrg               case GL_GREEN_INTEGER_EXT:
1704848b8605Smrg                  for (i=0;i<n;i++) {
1705848b8605Smrg                     dst[i] = (GLushort) rgba[i][GCOMP];
1706848b8605Smrg                  }
1707848b8605Smrg                  break;
1708848b8605Smrg               case GL_BLUE_INTEGER_EXT:
1709848b8605Smrg                  for (i=0;i<n;i++) {
1710848b8605Smrg                     dst[i] = (GLushort) rgba[i][BCOMP];
1711848b8605Smrg                  }
1712848b8605Smrg                  break;
1713848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
1714848b8605Smrg                  for (i=0;i<n;i++) {
1715848b8605Smrg                     dst[i] = (GLushort) rgba[i][ACOMP];
1716848b8605Smrg                  }
1717848b8605Smrg                  break;
1718848b8605Smrg               case GL_RG_INTEGER:
1719848b8605Smrg                  for (i=0;i<n;i++) {
1720848b8605Smrg                     dst[i*2+0] = (GLushort) rgba[i][RCOMP];
1721848b8605Smrg                     dst[i*2+1] = (GLushort) rgba[i][GCOMP];
1722848b8605Smrg                  }
1723848b8605Smrg                  break;
1724848b8605Smrg               case GL_RGB_INTEGER_EXT:
1725848b8605Smrg                  for (i=0;i<n;i++) {
1726848b8605Smrg                     dst[i*3+0] = (GLushort) rgba[i][RCOMP];
1727848b8605Smrg                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1728848b8605Smrg                     dst[i*3+2] = (GLushort) rgba[i][BCOMP];
1729848b8605Smrg                  }
1730848b8605Smrg                  break;
1731848b8605Smrg               case GL_RGBA_INTEGER_EXT:
1732848b8605Smrg                  for (i=0;i<n;i++) {
1733848b8605Smrg                     dst[i*4+0] = (GLushort) rgba[i][RCOMP];
1734848b8605Smrg                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1735848b8605Smrg                     dst[i*4+2] = (GLushort) rgba[i][BCOMP];
1736848b8605Smrg                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1737848b8605Smrg                  }
1738848b8605Smrg                  break;
1739848b8605Smrg               case GL_BGR_INTEGER_EXT:
1740848b8605Smrg                  for (i=0;i<n;i++) {
1741848b8605Smrg                     dst[i*3+0] = (GLushort) rgba[i][BCOMP];
1742848b8605Smrg                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1743848b8605Smrg                     dst[i*3+2] = (GLushort) rgba[i][RCOMP];
1744848b8605Smrg                  }
1745848b8605Smrg                  break;
1746848b8605Smrg               case GL_BGRA_INTEGER_EXT:
1747848b8605Smrg                  for (i=0;i<n;i++) {
1748848b8605Smrg                     dst[i*4+0] = (GLushort) rgba[i][BCOMP];
1749848b8605Smrg                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1750848b8605Smrg                     dst[i*4+2] = (GLushort) rgba[i][RCOMP];
1751848b8605Smrg                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1752848b8605Smrg                  }
1753848b8605Smrg                  break;
1754848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
1755848b8605Smrg                  for (i=0;i<n;i++) {
1756848b8605Smrg                     dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
1757848b8605Smrg                                              rgba[i][GCOMP] +
1758848b8605Smrg                                              rgba[i][BCOMP]);
1759848b8605Smrg                     dst[i*2+1] = (GLushort) rgba[i][ACOMP];
1760848b8605Smrg                  }
1761848b8605Smrg                  break;
1762848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1763848b8605Smrg                  for (i=0;i<n;i++) {
1764848b8605Smrg                     dst[i] = (GLushort) (rgba[i][RCOMP] +
1765848b8605Smrg                                          rgba[i][GCOMP] +
1766848b8605Smrg                                          rgba[i][BCOMP]);
1767848b8605Smrg                  }
1768848b8605Smrg                  break;
1769848b8605Smrg               default:
1770848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1771848b8605Smrg            }
1772848b8605Smrg         }
1773848b8605Smrg         break;
1774848b8605Smrg      case GL_SHORT:
1775848b8605Smrg         {
1776848b8605Smrg            GLshort *dst = (GLshort *) dstAddr;
1777848b8605Smrg            switch (dstFormat) {
1778848b8605Smrg               case GL_RED:
1779848b8605Smrg                  for (i=0;i<n;i++)
1780848b8605Smrg                     dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1781848b8605Smrg                  break;
1782848b8605Smrg               case GL_GREEN:
1783848b8605Smrg                  for (i=0;i<n;i++)
1784848b8605Smrg                     dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1785848b8605Smrg                  break;
1786848b8605Smrg               case GL_BLUE:
1787848b8605Smrg                  for (i=0;i<n;i++)
1788848b8605Smrg                     dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1789848b8605Smrg                  break;
1790848b8605Smrg               case GL_ALPHA:
1791848b8605Smrg                  for (i=0;i<n;i++)
1792848b8605Smrg                     dst[i] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]);
1793848b8605Smrg                  break;
1794848b8605Smrg               case GL_LUMINANCE:
1795848b8605Smrg                  for (i=0;i<n;i++)
1796848b8605Smrg                     dst[i] = FLOAT_TO_SHORT_TEX(luminance[i]);
1797848b8605Smrg                  break;
1798848b8605Smrg               case GL_LUMINANCE_ALPHA:
1799848b8605Smrg                  for (i=0;i<n;i++) {
1800848b8605Smrg                     dst[i*2+0] = FLOAT_TO_SHORT_TEX(luminance[i]);
1801848b8605Smrg                     dst[i*2+1] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]);
1802848b8605Smrg                  }
1803848b8605Smrg                  break;
1804848b8605Smrg               case GL_RG:
1805848b8605Smrg                  for (i=0;i<n;i++) {
1806848b8605Smrg                     dst[i*2+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1807848b8605Smrg                     dst[i*2+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1808848b8605Smrg                  }
1809848b8605Smrg                  break;
1810848b8605Smrg               case GL_RGB:
1811848b8605Smrg                  for (i=0;i<n;i++) {
1812848b8605Smrg                     dst[i*3+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1813848b8605Smrg                     dst[i*3+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1814848b8605Smrg                     dst[i*3+2] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1815848b8605Smrg                  }
1816848b8605Smrg                  break;
1817848b8605Smrg               case GL_RGBA:
1818848b8605Smrg                  for (i=0;i<n;i++) {
1819848b8605Smrg                     dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1820848b8605Smrg                     dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1821848b8605Smrg                     dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1822848b8605Smrg                     dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]);
1823848b8605Smrg                  }
1824848b8605Smrg                  break;
1825848b8605Smrg               case GL_BGR:
1826848b8605Smrg                  for (i=0;i<n;i++) {
1827848b8605Smrg                     dst[i*3+0] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1828848b8605Smrg                     dst[i*3+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1829848b8605Smrg                     dst[i*3+2] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1830848b8605Smrg                  }
1831848b8605Smrg                  break;
1832848b8605Smrg               case GL_BGRA:
1833848b8605Smrg                  for (i=0;i<n;i++) {
1834848b8605Smrg                     dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1835848b8605Smrg                     dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1836848b8605Smrg                     dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1837848b8605Smrg                     dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]);
1838848b8605Smrg                  }
1839848b8605Smrg		  break;
1840848b8605Smrg               case GL_ABGR_EXT:
1841848b8605Smrg                  for (i=0;i<n;i++) {
1842848b8605Smrg                     dst[i*4+0] = FLOAT_TO_SHORT_TEX(rgba[i][ACOMP]);
1843848b8605Smrg                     dst[i*4+1] = FLOAT_TO_SHORT_TEX(rgba[i][BCOMP]);
1844848b8605Smrg                     dst[i*4+2] = FLOAT_TO_SHORT_TEX(rgba[i][GCOMP]);
1845848b8605Smrg                     dst[i*4+3] = FLOAT_TO_SHORT_TEX(rgba[i][RCOMP]);
1846848b8605Smrg                  }
1847848b8605Smrg                  break;
1848848b8605Smrg               case GL_RED_INTEGER_EXT:
1849848b8605Smrg                  for (i=0;i<n;i++) {
1850848b8605Smrg                     dst[i] = (GLshort) rgba[i][RCOMP];
1851848b8605Smrg                  }
1852848b8605Smrg                  break;
1853848b8605Smrg               case GL_GREEN_INTEGER_EXT:
1854848b8605Smrg                  for (i=0;i<n;i++) {
1855848b8605Smrg                     dst[i] = (GLshort) rgba[i][GCOMP];
1856848b8605Smrg                  }
1857848b8605Smrg                  break;
1858848b8605Smrg               case GL_BLUE_INTEGER_EXT:
1859848b8605Smrg                  for (i=0;i<n;i++) {
1860848b8605Smrg                     dst[i] = (GLshort) rgba[i][BCOMP];
1861848b8605Smrg                  }
1862848b8605Smrg                  break;
1863848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
1864848b8605Smrg                  for (i=0;i<n;i++) {
1865848b8605Smrg                     dst[i] = (GLshort) rgba[i][ACOMP];
1866848b8605Smrg                  }
1867848b8605Smrg                  break;
1868848b8605Smrg               case GL_RG_INTEGER:
1869848b8605Smrg                  for (i=0;i<n;i++) {
1870848b8605Smrg                     dst[i*2+0] = (GLshort) rgba[i][RCOMP];
1871848b8605Smrg                     dst[i*2+1] = (GLshort) rgba[i][GCOMP];
1872848b8605Smrg                  }
1873848b8605Smrg                  break;
1874848b8605Smrg               case GL_RGB_INTEGER_EXT:
1875848b8605Smrg                  for (i=0;i<n;i++) {
1876848b8605Smrg                     dst[i*3+0] = (GLshort) rgba[i][RCOMP];
1877848b8605Smrg                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1878848b8605Smrg                     dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1879848b8605Smrg                  }
1880848b8605Smrg                  break;
1881848b8605Smrg               case GL_RGBA_INTEGER_EXT:
1882848b8605Smrg                  for (i=0;i<n;i++) {
1883848b8605Smrg                     dst[i*4+0] = (GLshort) rgba[i][RCOMP];
1884848b8605Smrg                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1885848b8605Smrg                     dst[i*4+2] = (GLshort) rgba[i][BCOMP];
1886848b8605Smrg                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1887848b8605Smrg                  }
1888848b8605Smrg                  break;
1889848b8605Smrg               case GL_BGR_INTEGER_EXT:
1890848b8605Smrg                  for (i=0;i<n;i++) {
1891848b8605Smrg                     dst[i*3+0] = (GLshort) rgba[i][BCOMP];
1892848b8605Smrg                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1893848b8605Smrg                     dst[i*3+2] = (GLshort) rgba[i][RCOMP];
1894848b8605Smrg                  }
1895848b8605Smrg                  break;
1896848b8605Smrg               case GL_BGRA_INTEGER_EXT:
1897848b8605Smrg                  for (i=0;i<n;i++) {
1898848b8605Smrg                     dst[i*4+0] = (GLshort) rgba[i][BCOMP];
1899848b8605Smrg                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1900848b8605Smrg                     dst[i*4+2] = (GLshort) rgba[i][RCOMP];
1901848b8605Smrg                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1902848b8605Smrg                  }
1903848b8605Smrg                  break;
1904848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
1905848b8605Smrg                  for (i=0;i<n;i++) {
1906848b8605Smrg                     dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
1907848b8605Smrg                                             rgba[i][GCOMP] +
1908848b8605Smrg                                             rgba[i][BCOMP]);
1909848b8605Smrg                     dst[i*2+1] = (GLshort) rgba[i][ACOMP];
1910848b8605Smrg                  }
1911848b8605Smrg                  break;
1912848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1913848b8605Smrg                  for (i=0;i<n;i++) {
1914848b8605Smrg                     dst[i] = (GLshort) (rgba[i][RCOMP] +
1915848b8605Smrg                                         rgba[i][GCOMP] +
1916848b8605Smrg                                         rgba[i][BCOMP]);
1917848b8605Smrg                  }
1918848b8605Smrg                  break;
1919848b8605Smrg               default:
1920848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1921848b8605Smrg            }
1922848b8605Smrg         }
1923848b8605Smrg         break;
1924848b8605Smrg      case GL_UNSIGNED_INT:
1925848b8605Smrg         {
1926848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
1927848b8605Smrg            switch (dstFormat) {
1928848b8605Smrg               case GL_RED:
1929848b8605Smrg                  for (i=0;i<n;i++)
1930848b8605Smrg                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1931848b8605Smrg                  break;
1932848b8605Smrg               case GL_GREEN:
1933848b8605Smrg                  for (i=0;i<n;i++)
1934848b8605Smrg                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1935848b8605Smrg                  break;
1936848b8605Smrg               case GL_BLUE:
1937848b8605Smrg                  for (i=0;i<n;i++)
1938848b8605Smrg                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1939848b8605Smrg                  break;
1940848b8605Smrg               case GL_ALPHA:
1941848b8605Smrg                  for (i=0;i<n;i++)
1942848b8605Smrg                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1943848b8605Smrg                  break;
1944848b8605Smrg               case GL_LUMINANCE:
1945848b8605Smrg                  for (i=0;i<n;i++)
1946848b8605Smrg                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1947848b8605Smrg                  break;
1948848b8605Smrg               case GL_LUMINANCE_ALPHA:
1949848b8605Smrg                  for (i=0;i<n;i++) {
1950848b8605Smrg                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1951848b8605Smrg                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1952848b8605Smrg                  }
1953848b8605Smrg                  break;
1954848b8605Smrg               case GL_RG:
1955848b8605Smrg                  for (i=0;i<n;i++) {
1956848b8605Smrg                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1957848b8605Smrg                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1958848b8605Smrg                  }
1959848b8605Smrg                  break;
1960848b8605Smrg               case GL_RGB:
1961848b8605Smrg                  for (i=0;i<n;i++) {
1962848b8605Smrg                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1963848b8605Smrg                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1964848b8605Smrg                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1965848b8605Smrg                  }
1966848b8605Smrg                  break;
1967848b8605Smrg               case GL_RGBA:
1968848b8605Smrg                  for (i=0;i<n;i++) {
1969848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1970848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1971848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1972848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1973848b8605Smrg                  }
1974848b8605Smrg                  break;
1975848b8605Smrg               case GL_BGR:
1976848b8605Smrg                  for (i=0;i<n;i++) {
1977848b8605Smrg                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1978848b8605Smrg                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1979848b8605Smrg                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1980848b8605Smrg                  }
1981848b8605Smrg                  break;
1982848b8605Smrg               case GL_BGRA:
1983848b8605Smrg                  for (i=0;i<n;i++) {
1984848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1985848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1986848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1987848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1988848b8605Smrg                  }
1989848b8605Smrg                  break;
1990848b8605Smrg               case GL_ABGR_EXT:
1991848b8605Smrg                  for (i=0;i<n;i++) {
1992848b8605Smrg                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1993848b8605Smrg                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1994848b8605Smrg                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1995848b8605Smrg                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1996848b8605Smrg                  }
1997848b8605Smrg                  break;
1998848b8605Smrg               case GL_RED_INTEGER_EXT:
1999848b8605Smrg                  for (i=0;i<n;i++) {
2000848b8605Smrg                     dst[i] = (GLuint) rgba[i][RCOMP];
2001848b8605Smrg                  }
2002848b8605Smrg                  break;
2003848b8605Smrg               case GL_GREEN_INTEGER_EXT:
2004848b8605Smrg                  for (i=0;i<n;i++) {
2005848b8605Smrg                     dst[i] = (GLuint) rgba[i][GCOMP];
2006848b8605Smrg                  }
2007848b8605Smrg                  break;
2008848b8605Smrg               case GL_BLUE_INTEGER_EXT:
2009848b8605Smrg                  for (i=0;i<n;i++) {
2010848b8605Smrg                     dst[i] = (GLuint) rgba[i][BCOMP];
2011848b8605Smrg                  }
2012848b8605Smrg                  break;
2013848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
2014848b8605Smrg                  for (i=0;i<n;i++) {
2015848b8605Smrg                     dst[i] = (GLuint) rgba[i][ACOMP];
2016848b8605Smrg                  }
2017848b8605Smrg                  break;
2018848b8605Smrg               case GL_RG_INTEGER:
2019848b8605Smrg                  for (i=0;i<n;i++) {
2020848b8605Smrg                     dst[i*2+0] = (GLuint) rgba[i][RCOMP];
2021848b8605Smrg                     dst[i*2+1] = (GLuint) rgba[i][GCOMP];
2022848b8605Smrg                  }
2023848b8605Smrg                  break;
2024848b8605Smrg               case GL_RGB_INTEGER_EXT:
2025848b8605Smrg                  for (i=0;i<n;i++) {
2026848b8605Smrg                     dst[i*3+0] = (GLuint) rgba[i][RCOMP];
2027848b8605Smrg                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
2028848b8605Smrg                     dst[i*3+2] = (GLuint) rgba[i][BCOMP];
2029848b8605Smrg                  }
2030848b8605Smrg                  break;
2031848b8605Smrg               case GL_RGBA_INTEGER_EXT:
2032848b8605Smrg                  for (i=0;i<n;i++) {
2033848b8605Smrg                     dst[i*4+0] = (GLuint) rgba[i][RCOMP];
2034848b8605Smrg                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
2035848b8605Smrg                     dst[i*4+2] = (GLuint) rgba[i][BCOMP];
2036848b8605Smrg                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
2037848b8605Smrg                  }
2038848b8605Smrg                  break;
2039848b8605Smrg               case GL_BGR_INTEGER_EXT:
2040848b8605Smrg                  for (i=0;i<n;i++) {
2041848b8605Smrg                     dst[i*3+0] = (GLuint) rgba[i][BCOMP];
2042848b8605Smrg                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
2043848b8605Smrg                     dst[i*3+2] = (GLuint) rgba[i][RCOMP];
2044848b8605Smrg                  }
2045848b8605Smrg                  break;
2046848b8605Smrg               case GL_BGRA_INTEGER_EXT:
2047848b8605Smrg                  for (i=0;i<n;i++) {
2048848b8605Smrg                     dst[i*4+0] = (GLuint) rgba[i][BCOMP];
2049848b8605Smrg                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
2050848b8605Smrg                     dst[i*4+2] = (GLuint) rgba[i][RCOMP];
2051848b8605Smrg                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
2052848b8605Smrg                  }
2053848b8605Smrg                  break;
2054848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
2055848b8605Smrg                  for (i=0;i<n;i++) {
2056848b8605Smrg                     dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
2057848b8605Smrg                                            rgba[i][GCOMP] +
2058848b8605Smrg                                            rgba[i][BCOMP]);
2059848b8605Smrg                     dst[i*2+1] = (GLuint) rgba[i][ACOMP];
2060848b8605Smrg                  }
2061848b8605Smrg                  break;
2062848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2063848b8605Smrg                  for (i=0;i<n;i++) {
2064848b8605Smrg                     dst[i] = (GLuint) (rgba[i][RCOMP] +
2065848b8605Smrg                                        rgba[i][GCOMP] +
2066848b8605Smrg                                        rgba[i][BCOMP]);
2067848b8605Smrg                  }
2068848b8605Smrg                  break;
2069848b8605Smrg               default:
2070848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2071848b8605Smrg            }
2072848b8605Smrg         }
2073848b8605Smrg         break;
2074848b8605Smrg      case GL_INT:
2075848b8605Smrg         {
2076848b8605Smrg            GLint *dst = (GLint *) dstAddr;
2077848b8605Smrg            switch (dstFormat) {
2078848b8605Smrg               case GL_RED:
2079848b8605Smrg                  for (i=0;i<n;i++)
2080848b8605Smrg                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
2081848b8605Smrg                  break;
2082848b8605Smrg               case GL_GREEN:
2083848b8605Smrg                  for (i=0;i<n;i++)
2084848b8605Smrg                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
2085848b8605Smrg                  break;
2086848b8605Smrg               case GL_BLUE:
2087848b8605Smrg                  for (i=0;i<n;i++)
2088848b8605Smrg                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
2089848b8605Smrg                  break;
2090848b8605Smrg               case GL_ALPHA:
2091848b8605Smrg                  for (i=0;i<n;i++)
2092848b8605Smrg                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
2093848b8605Smrg                  break;
2094848b8605Smrg               case GL_LUMINANCE:
2095848b8605Smrg                  for (i=0;i<n;i++)
2096848b8605Smrg                     dst[i] = FLOAT_TO_INT(luminance[i]);
2097848b8605Smrg                  break;
2098848b8605Smrg               case GL_LUMINANCE_ALPHA:
2099848b8605Smrg                  for (i=0;i<n;i++) {
2100848b8605Smrg                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
2101848b8605Smrg                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
2102848b8605Smrg                  }
2103848b8605Smrg                  break;
2104848b8605Smrg               case GL_RG:
2105848b8605Smrg                  for (i=0;i<n;i++) {
2106848b8605Smrg                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2107848b8605Smrg                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2108848b8605Smrg                  }
2109848b8605Smrg                  break;
2110848b8605Smrg               case GL_RGB:
2111848b8605Smrg                  for (i=0;i<n;i++) {
2112848b8605Smrg                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2113848b8605Smrg                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2114848b8605Smrg                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
2115848b8605Smrg                  }
2116848b8605Smrg                  break;
2117848b8605Smrg               case GL_RGBA:
2118848b8605Smrg                  for (i=0;i<n;i++) {
2119848b8605Smrg                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
2120848b8605Smrg                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2121848b8605Smrg                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
2122848b8605Smrg                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
2123848b8605Smrg                  }
2124848b8605Smrg                  break;
2125848b8605Smrg               case GL_BGR:
2126848b8605Smrg                  for (i=0;i<n;i++) {
2127848b8605Smrg                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
2128848b8605Smrg                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2129848b8605Smrg                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
2130848b8605Smrg                  }
2131848b8605Smrg                  break;
2132848b8605Smrg               case GL_BGRA:
2133848b8605Smrg                  for (i=0;i<n;i++) {
2134848b8605Smrg                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
2135848b8605Smrg                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
2136848b8605Smrg                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
2137848b8605Smrg                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
2138848b8605Smrg                  }
2139848b8605Smrg                  break;
2140848b8605Smrg               case GL_ABGR_EXT:
2141848b8605Smrg                  for (i=0;i<n;i++) {
2142848b8605Smrg                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
2143848b8605Smrg                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
2144848b8605Smrg                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
2145848b8605Smrg                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
2146848b8605Smrg                  }
2147848b8605Smrg                  break;
2148848b8605Smrg               case GL_RED_INTEGER_EXT:
2149848b8605Smrg                  for (i=0;i<n;i++) {
2150848b8605Smrg                     dst[i] = (GLint) rgba[i][RCOMP];
2151848b8605Smrg                  }
2152848b8605Smrg                  break;
2153848b8605Smrg               case GL_GREEN_INTEGER_EXT:
2154848b8605Smrg                  for (i=0;i<n;i++) {
2155848b8605Smrg                     dst[i] = (GLint) rgba[i][GCOMP];
2156848b8605Smrg                  }
2157848b8605Smrg                  break;
2158848b8605Smrg               case GL_BLUE_INTEGER_EXT:
2159848b8605Smrg                  for (i=0;i<n;i++) {
2160848b8605Smrg                     dst[i] = (GLint) rgba[i][BCOMP];
2161848b8605Smrg                  }
2162848b8605Smrg                  break;
2163848b8605Smrg               case GL_ALPHA_INTEGER_EXT:
2164848b8605Smrg                  for (i=0;i<n;i++) {
2165848b8605Smrg                     dst[i] = (GLint) rgba[i][ACOMP];
2166848b8605Smrg                  }
2167848b8605Smrg                  break;
2168848b8605Smrg               case GL_RG_INTEGER:
2169848b8605Smrg                  for (i=0;i<n;i++) {
2170848b8605Smrg                     dst[i*2+0] = (GLint) rgba[i][RCOMP];
2171848b8605Smrg                     dst[i*2+1] = (GLint) rgba[i][GCOMP];
2172848b8605Smrg                  }
2173848b8605Smrg                  break;
2174848b8605Smrg               case GL_RGB_INTEGER_EXT:
2175848b8605Smrg                  for (i=0;i<n;i++) {
2176848b8605Smrg                     dst[i*3+0] = (GLint) rgba[i][RCOMP];
2177848b8605Smrg                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
2178848b8605Smrg                     dst[i*3+2] = (GLint) rgba[i][BCOMP];
2179848b8605Smrg                  }
2180848b8605Smrg                  break;
2181848b8605Smrg               case GL_RGBA_INTEGER_EXT:
2182848b8605Smrg                  for (i=0;i<n;i++) {
2183848b8605Smrg                     dst[i*4+0] = (GLint) rgba[i][RCOMP];
2184848b8605Smrg                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
2185848b8605Smrg                     dst[i*4+2] = (GLint) rgba[i][BCOMP];
2186848b8605Smrg                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
2187848b8605Smrg                  }
2188848b8605Smrg                  break;
2189848b8605Smrg               case GL_BGR_INTEGER_EXT:
2190848b8605Smrg                  for (i=0;i<n;i++) {
2191848b8605Smrg                     dst[i*3+0] = (GLint) rgba[i][BCOMP];
2192848b8605Smrg                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
2193848b8605Smrg                     dst[i*3+2] = (GLint) rgba[i][RCOMP];
2194848b8605Smrg                  }
2195848b8605Smrg                  break;
2196848b8605Smrg               case GL_BGRA_INTEGER_EXT:
2197848b8605Smrg                  for (i=0;i<n;i++) {
2198848b8605Smrg                     dst[i*4+0] = (GLint) rgba[i][BCOMP];
2199848b8605Smrg                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
2200848b8605Smrg                     dst[i*4+2] = (GLint) rgba[i][RCOMP];
2201848b8605Smrg                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
2202848b8605Smrg                  }
2203848b8605Smrg                  break;
2204848b8605Smrg               case GL_LUMINANCE_INTEGER_EXT:
2205848b8605Smrg                  for (i=0;i<n;i++) {
2206848b8605Smrg                     dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
2207848b8605Smrg                                           rgba[i][GCOMP] +
2208848b8605Smrg                                           rgba[i][BCOMP]);
2209848b8605Smrg                     dst[i*2+1] = (GLint) rgba[i][ACOMP];
2210848b8605Smrg                  }
2211848b8605Smrg                  break;
2212848b8605Smrg               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2213848b8605Smrg                  for (i=0;i<n;i++) {
2214848b8605Smrg                     dst[i] = (GLint) (rgba[i][RCOMP] +
2215848b8605Smrg                                       rgba[i][GCOMP] +
2216848b8605Smrg                                       rgba[i][BCOMP]);
2217848b8605Smrg                  }
2218848b8605Smrg                  break;
2219848b8605Smrg               default:
2220848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2221848b8605Smrg            }
2222848b8605Smrg         }
2223848b8605Smrg         break;
2224848b8605Smrg      case GL_FLOAT:
2225848b8605Smrg         {
2226848b8605Smrg            GLfloat *dst = (GLfloat *) dstAddr;
2227848b8605Smrg            switch (dstFormat) {
2228848b8605Smrg               case GL_RED:
2229848b8605Smrg                  for (i=0;i<n;i++)
2230848b8605Smrg                     dst[i] = rgba[i][RCOMP];
2231848b8605Smrg                  break;
2232848b8605Smrg               case GL_GREEN:
2233848b8605Smrg                  for (i=0;i<n;i++)
2234848b8605Smrg                     dst[i] = rgba[i][GCOMP];
2235848b8605Smrg                  break;
2236848b8605Smrg               case GL_BLUE:
2237848b8605Smrg                  for (i=0;i<n;i++)
2238848b8605Smrg                     dst[i] = rgba[i][BCOMP];
2239848b8605Smrg                  break;
2240848b8605Smrg               case GL_ALPHA:
2241848b8605Smrg                  for (i=0;i<n;i++)
2242848b8605Smrg                     dst[i] = rgba[i][ACOMP];
2243848b8605Smrg                  break;
2244848b8605Smrg               case GL_LUMINANCE:
2245848b8605Smrg                  for (i=0;i<n;i++)
2246848b8605Smrg                     dst[i] = luminance[i];
2247848b8605Smrg                  break;
2248848b8605Smrg               case GL_LUMINANCE_ALPHA:
2249848b8605Smrg                  for (i=0;i<n;i++) {
2250848b8605Smrg                     dst[i*2+0] = luminance[i];
2251848b8605Smrg                     dst[i*2+1] = rgba[i][ACOMP];
2252848b8605Smrg                  }
2253848b8605Smrg                  break;
2254848b8605Smrg               case GL_RG:
2255848b8605Smrg                  for (i=0;i<n;i++) {
2256848b8605Smrg                     dst[i*2+0] = rgba[i][RCOMP];
2257848b8605Smrg                     dst[i*2+1] = rgba[i][GCOMP];
2258848b8605Smrg                  }
2259848b8605Smrg                  break;
2260848b8605Smrg               case GL_RGB:
2261848b8605Smrg                  for (i=0;i<n;i++) {
2262848b8605Smrg                     dst[i*3+0] = rgba[i][RCOMP];
2263848b8605Smrg                     dst[i*3+1] = rgba[i][GCOMP];
2264848b8605Smrg                     dst[i*3+2] = rgba[i][BCOMP];
2265848b8605Smrg                  }
2266848b8605Smrg                  break;
2267848b8605Smrg               case GL_RGBA:
2268848b8605Smrg                  for (i=0;i<n;i++) {
2269848b8605Smrg                     dst[i*4+0] = rgba[i][RCOMP];
2270848b8605Smrg                     dst[i*4+1] = rgba[i][GCOMP];
2271848b8605Smrg                     dst[i*4+2] = rgba[i][BCOMP];
2272848b8605Smrg                     dst[i*4+3] = rgba[i][ACOMP];
2273848b8605Smrg                  }
2274848b8605Smrg                  break;
2275848b8605Smrg               case GL_BGR:
2276848b8605Smrg                  for (i=0;i<n;i++) {
2277848b8605Smrg                     dst[i*3+0] = rgba[i][BCOMP];
2278848b8605Smrg                     dst[i*3+1] = rgba[i][GCOMP];
2279848b8605Smrg                     dst[i*3+2] = rgba[i][RCOMP];
2280848b8605Smrg                  }
2281848b8605Smrg                  break;
2282848b8605Smrg               case GL_BGRA:
2283848b8605Smrg                  for (i=0;i<n;i++) {
2284848b8605Smrg                     dst[i*4+0] = rgba[i][BCOMP];
2285848b8605Smrg                     dst[i*4+1] = rgba[i][GCOMP];
2286848b8605Smrg                     dst[i*4+2] = rgba[i][RCOMP];
2287848b8605Smrg                     dst[i*4+3] = rgba[i][ACOMP];
2288848b8605Smrg                  }
2289848b8605Smrg                  break;
2290848b8605Smrg               case GL_ABGR_EXT:
2291848b8605Smrg                  for (i=0;i<n;i++) {
2292848b8605Smrg                     dst[i*4+0] = rgba[i][ACOMP];
2293848b8605Smrg                     dst[i*4+1] = rgba[i][BCOMP];
2294848b8605Smrg                     dst[i*4+2] = rgba[i][GCOMP];
2295848b8605Smrg                     dst[i*4+3] = rgba[i][RCOMP];
2296848b8605Smrg                  }
2297848b8605Smrg                  break;
2298848b8605Smrg               default:
2299848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2300848b8605Smrg            }
2301848b8605Smrg         }
2302848b8605Smrg         break;
2303848b8605Smrg      case GL_HALF_FLOAT_ARB:
2304848b8605Smrg         {
2305848b8605Smrg            GLhalfARB *dst = (GLhalfARB *) dstAddr;
2306848b8605Smrg            switch (dstFormat) {
2307848b8605Smrg               case GL_RED:
2308848b8605Smrg                  for (i=0;i<n;i++)
2309848b8605Smrg                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
2310848b8605Smrg                  break;
2311848b8605Smrg               case GL_GREEN:
2312848b8605Smrg                  for (i=0;i<n;i++)
2313848b8605Smrg                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
2314848b8605Smrg                  break;
2315848b8605Smrg               case GL_BLUE:
2316848b8605Smrg                  for (i=0;i<n;i++)
2317848b8605Smrg                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
2318848b8605Smrg                  break;
2319848b8605Smrg               case GL_ALPHA:
2320848b8605Smrg                  for (i=0;i<n;i++)
2321848b8605Smrg                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
2322848b8605Smrg                  break;
2323848b8605Smrg               case GL_LUMINANCE:
2324848b8605Smrg                  for (i=0;i<n;i++)
2325848b8605Smrg                     dst[i] = _mesa_float_to_half(luminance[i]);
2326848b8605Smrg                  break;
2327848b8605Smrg               case GL_LUMINANCE_ALPHA:
2328848b8605Smrg                  for (i=0;i<n;i++) {
2329848b8605Smrg                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
2330848b8605Smrg                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
2331848b8605Smrg                  }
2332848b8605Smrg                  break;
2333848b8605Smrg               case GL_RG:
2334848b8605Smrg                  for (i=0;i<n;i++) {
2335848b8605Smrg                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2336848b8605Smrg                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2337848b8605Smrg                  }
2338848b8605Smrg                  break;
2339848b8605Smrg               case GL_RGB:
2340848b8605Smrg                  for (i=0;i<n;i++) {
2341848b8605Smrg                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2342848b8605Smrg                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2343848b8605Smrg                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
2344848b8605Smrg                  }
2345848b8605Smrg                  break;
2346848b8605Smrg               case GL_RGBA:
2347848b8605Smrg                  for (i=0;i<n;i++) {
2348848b8605Smrg                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
2349848b8605Smrg                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2350848b8605Smrg                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
2351848b8605Smrg                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
2352848b8605Smrg                  }
2353848b8605Smrg                  break;
2354848b8605Smrg               case GL_BGR:
2355848b8605Smrg                  for (i=0;i<n;i++) {
2356848b8605Smrg                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
2357848b8605Smrg                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2358848b8605Smrg                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
2359848b8605Smrg                  }
2360848b8605Smrg                  break;
2361848b8605Smrg               case GL_BGRA:
2362848b8605Smrg                  for (i=0;i<n;i++) {
2363848b8605Smrg                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
2364848b8605Smrg                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
2365848b8605Smrg                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
2366848b8605Smrg                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
2367848b8605Smrg                  }
2368848b8605Smrg                  break;
2369848b8605Smrg               case GL_ABGR_EXT:
2370848b8605Smrg                  for (i=0;i<n;i++) {
2371848b8605Smrg                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
2372848b8605Smrg                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
2373848b8605Smrg                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
2374848b8605Smrg                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
2375848b8605Smrg                  }
2376848b8605Smrg                  break;
2377848b8605Smrg               default:
2378848b8605Smrg                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
2379848b8605Smrg            }
2380848b8605Smrg         }
2381848b8605Smrg         break;
2382848b8605Smrg      case GL_UNSIGNED_BYTE_3_3_2:
2383848b8605Smrg         if (dstFormat == GL_RGB) {
2384848b8605Smrg            GLubyte *dst = (GLubyte *) dstAddr;
2385848b8605Smrg            for (i=0;i<n;i++) {
2386848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F) << 5)
2387848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 2)
2388848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 3.0F)     );
2389848b8605Smrg            }
2390848b8605Smrg         }
2391848b8605Smrg         break;
2392848b8605Smrg      case GL_UNSIGNED_BYTE_2_3_3_REV:
2393848b8605Smrg         if (dstFormat == GL_RGB) {
2394848b8605Smrg            GLubyte *dst = (GLubyte *) dstAddr;
2395848b8605Smrg            for (i=0;i<n;i++) {
2396848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 7.0F)     )
2397848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 7.0F) << 3)
2398848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 3.0F) << 6);
2399848b8605Smrg            }
2400848b8605Smrg         }
2401848b8605Smrg         break;
2402848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5:
2403848b8605Smrg         if (dstFormat == GL_RGB) {
2404848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2405848b8605Smrg            for (i=0;i<n;i++) {
2406848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11)
2407848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 63.0F) <<  5)
2408848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F)      );
2409848b8605Smrg            }
2410848b8605Smrg         }
2411848b8605Smrg         break;
2412848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5_REV:
2413848b8605Smrg         if (dstFormat == GL_RGB) {
2414848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2415848b8605Smrg            for (i=0;i<n;i++) {
2416848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F)      )
2417848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 63.0F) <<  5)
2418848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11);
2419848b8605Smrg            }
2420848b8605Smrg         }
2421848b8605Smrg         break;
2422848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4:
2423848b8605Smrg         if (dstFormat == GL_RGBA) {
2424848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2425848b8605Smrg            for (i=0;i<n;i++) {
2426848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12)
2427848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2428848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  4)
2429848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 15.0F)      );
2430848b8605Smrg            }
2431848b8605Smrg         }
2432848b8605Smrg         else if (dstFormat == GL_BGRA) {
2433848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2434848b8605Smrg            for (i=0;i<n;i++) {
2435848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F) << 12)
2436848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2437848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) <<  4)
2438848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 15.0F)      );
2439848b8605Smrg            }
2440848b8605Smrg         }
2441848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2442848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2443848b8605Smrg            for (i=0;i<n;i++) {
2444848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12)
2445848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  8)
2446848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2447848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 15.0F)      );
2448848b8605Smrg            }
2449848b8605Smrg         }
2450848b8605Smrg         break;
2451848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2452848b8605Smrg         if (dstFormat == GL_RGBA) {
2453848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2454848b8605Smrg            for (i=0;i<n;i++) {
2455848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 15.0F)      )
2456848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2457848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  8)
2458848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12);
2459848b8605Smrg            }
2460848b8605Smrg         }
2461848b8605Smrg         else if (dstFormat == GL_BGRA) {
2462848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2463848b8605Smrg            for (i=0;i<n;i++) {
2464848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 15.0F)      )
2465848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  4)
2466848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) <<  8)
2467848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 15.0F) << 12);
2468848b8605Smrg            }
2469848b8605Smrg         }
2470848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2471848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2472848b8605Smrg            for (i=0;i<n;i++) {
2473848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 15.0F)      )
2474848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 15.0F) <<  4)
2475848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 15.0F) <<  8)
2476848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 15.0F) << 12);
2477848b8605Smrg            }
2478848b8605Smrg         }
2479848b8605Smrg         break;
2480848b8605Smrg      case GL_UNSIGNED_SHORT_5_5_5_1:
2481848b8605Smrg         if (dstFormat == GL_RGBA) {
2482848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2483848b8605Smrg            for (i=0;i<n;i++) {
2484848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F) << 11)
2485848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  6)
2486848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  1)
2487848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *  1.0F)      );
2488848b8605Smrg            }
2489848b8605Smrg         }
2490848b8605Smrg         else if (dstFormat == GL_BGRA) {
2491848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2492848b8605Smrg            for (i=0;i<n;i++) {
2493848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F) << 11)
2494848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  6)
2495848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 31.0F) <<  1)
2496848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *  1.0F)      );
2497848b8605Smrg            }
2498848b8605Smrg         }
2499848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2500848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2501848b8605Smrg            for (i=0;i<n;i++) {
2502848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F) << 11)
2503848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  6)
2504848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  1)
2505848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] *  1.0F)      );
2506848b8605Smrg            }
2507848b8605Smrg         }
2508848b8605Smrg         break;
2509848b8605Smrg      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2510848b8605Smrg         if (dstFormat == GL_RGBA) {
2511848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2512848b8605Smrg            for (i=0;i<n;i++) {
2513848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 31.0F)      )
2514848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  5)
2515848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) << 10)
2516848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *  1.0F) << 15);
2517848b8605Smrg            }
2518848b8605Smrg         }
2519848b8605Smrg         else if (dstFormat == GL_BGRA) {
2520848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2521848b8605Smrg            for (i=0;i<n;i++) {
2522848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 31.0F)      )
2523848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) <<  5)
2524848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 31.0F) << 10)
2525848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *  1.0F) << 15);
2526848b8605Smrg            }
2527848b8605Smrg         }
2528848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2529848b8605Smrg            GLushort *dst = (GLushort *) dstAddr;
2530848b8605Smrg            for (i=0;i<n;i++) {
2531848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 31.0F)      )
2532848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 31.0F) <<  5)
2533848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 31.0F) << 10)
2534848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] *  1.0F) << 15);
2535848b8605Smrg            }
2536848b8605Smrg         }
2537848b8605Smrg         break;
2538848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8:
2539848b8605Smrg         if (dstFormat == GL_RGBA) {
2540848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2541848b8605Smrg            for (i=0;i<n;i++) {
2542848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.F) << 24)
2543848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16)
2544848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 255.F) <<  8)
2545848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 255.F)      );
2546848b8605Smrg            }
2547848b8605Smrg         }
2548848b8605Smrg         else if (dstFormat == GL_BGRA) {
2549848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2550848b8605Smrg            for (i=0;i<n;i++) {
2551848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.F) << 24)
2552848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.F) << 16)
2553848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 255.F) <<  8)
2554848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 255.F)      );
2555848b8605Smrg            }
2556848b8605Smrg         }
2557848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2558848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2559848b8605Smrg            for (i=0;i<n;i++) {
2560848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.F) << 24)
2561848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 255.F) << 16)
2562848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.F) <<  8)
2563848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 255.F)      );
2564848b8605Smrg            }
2565848b8605Smrg         }
2566848b8605Smrg         break;
2567848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8_REV:
2568848b8605Smrg         if (dstFormat == GL_RGBA) {
2569848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2570848b8605Smrg            for (i=0;i<n;i++) {
2571848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 255.0F)      )
2572848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) <<  8)
2573848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 255.0F) << 16)
2574848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24);
2575848b8605Smrg            }
2576848b8605Smrg         }
2577848b8605Smrg         else if (dstFormat == GL_BGRA) {
2578848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2579848b8605Smrg            for (i=0;i<n;i++) {
2580848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 255.0F)      )
2581848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) <<  8)
2582848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 16)
2583848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] * 255.0F) << 24);
2584848b8605Smrg            }
2585848b8605Smrg         }
2586848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2587848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2588848b8605Smrg            for (i=0;i<n;i++) {
2589848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 255.0F)      )
2590848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 255.0F) <<  8)
2591848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 255.0F) << 16)
2592848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 255.0F) << 24);
2593848b8605Smrg            }
2594848b8605Smrg         }
2595848b8605Smrg         break;
2596848b8605Smrg      case GL_UNSIGNED_INT_10_10_10_2:
2597848b8605Smrg         if (dstFormat == GL_RGBA) {
2598848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2599848b8605Smrg            for (i=0;i<n;i++) {
2600848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 22)
2601848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12)
2602848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) <<  2)
2603848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *    3.0F)      );
2604848b8605Smrg            }
2605848b8605Smrg         }
2606848b8605Smrg         else if (dstFormat == GL_BGRA) {
2607848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2608848b8605Smrg            for (i=0;i<n;i++) {
2609848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 22)
2610848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 12)
2611848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 1023.0F) <<  2)
2612848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *    3.0F)      );
2613848b8605Smrg            }
2614848b8605Smrg         }
2615848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2616848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2617848b8605Smrg            for (i=0;i<n;i++) {
2618848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F) << 22)
2619848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 12)
2620848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) <<  2)
2621848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] *    3.0F)      );
2622848b8605Smrg            }
2623848b8605Smrg         }
2624848b8605Smrg         break;
2625848b8605Smrg      case GL_UNSIGNED_INT_2_10_10_10_REV:
2626848b8605Smrg         if (dstFormat == GL_RGBA) {
2627848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2628848b8605Smrg            for (i=0;i<n;i++) {
2629848b8605Smrg               dst[i] = (F_TO_I(rgba[i][RCOMP] * 1023.0F)      )
2630848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10)
2631848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 20)
2632848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *    3.0F) << 30);
2633848b8605Smrg            }
2634848b8605Smrg         }
2635848b8605Smrg         else if (dstFormat == GL_BGRA) {
2636848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2637848b8605Smrg            for (i=0;i<n;i++) {
2638848b8605Smrg               dst[i] = (F_TO_I(rgba[i][BCOMP] * 1023.0F)      )
2639848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 10)
2640848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] * 1023.0F) << 20)
2641848b8605Smrg                      | (F_TO_I(rgba[i][ACOMP] *    3.0F) << 30);
2642848b8605Smrg            }
2643848b8605Smrg         }
2644848b8605Smrg         else if (dstFormat == GL_ABGR_EXT) {
2645848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2646848b8605Smrg            for (i=0;i<n;i++) {
2647848b8605Smrg               dst[i] = (F_TO_I(rgba[i][ACOMP] * 1023.0F)      )
2648848b8605Smrg                      | (F_TO_I(rgba[i][BCOMP] * 1023.0F) << 10)
2649848b8605Smrg                      | (F_TO_I(rgba[i][GCOMP] * 1023.0F) << 20)
2650848b8605Smrg                      | (F_TO_I(rgba[i][RCOMP] *    3.0F) << 30);
2651848b8605Smrg            }
2652848b8605Smrg         }
2653848b8605Smrg         break;
2654848b8605Smrg      case GL_UNSIGNED_INT_5_9_9_9_REV:
2655848b8605Smrg         {
2656848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2657848b8605Smrg            for (i = 0; i < n; i++) {
2658848b8605Smrg               dst[i] = float3_to_rgb9e5(rgba[i]);
2659848b8605Smrg            }
2660848b8605Smrg         }
2661848b8605Smrg         break;
2662848b8605Smrg      case GL_UNSIGNED_INT_10F_11F_11F_REV:
2663848b8605Smrg         {
2664848b8605Smrg            GLuint *dst = (GLuint *) dstAddr;
2665848b8605Smrg            for (i = 0; i < n; i++) {
2666848b8605Smrg               dst[i] = float3_to_r11g11b10f(rgba[i]);
2667848b8605Smrg            }
2668848b8605Smrg         }
2669848b8605Smrg         break;
2670848b8605Smrg      default:
2671848b8605Smrg         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
2672848b8605Smrg         free(luminance);
2673848b8605Smrg         return;
2674848b8605Smrg   }
2675848b8605Smrg
2676848b8605Smrg   if (dstPacking->SwapBytes) {
2677848b8605Smrg      GLint swapSize = _mesa_sizeof_packed_type(dstType);
2678848b8605Smrg      if (swapSize == 2) {
2679848b8605Smrg         _mesa_swap2((GLushort *) dstAddr, n * comps);
2680848b8605Smrg      }
2681848b8605Smrg      else if (swapSize == 4) {
2682848b8605Smrg         _mesa_swap4((GLuint *) dstAddr, n * comps);
2683848b8605Smrg      }
2684848b8605Smrg   }
2685848b8605Smrg
2686848b8605Smrg   free(luminance);
2687848b8605Smrg}
2688848b8605Smrg
2689848b8605Smrg
2690848b8605Smrg
2691848b8605Smrg#define SWAP2BYTE(VALUE)			\
2692848b8605Smrg   {						\
2693848b8605Smrg      GLubyte *bytes = (GLubyte *) &(VALUE);	\
2694848b8605Smrg      GLubyte tmp = bytes[0];			\
2695848b8605Smrg      bytes[0] = bytes[1];			\
2696848b8605Smrg      bytes[1] = tmp;				\
2697848b8605Smrg   }
2698848b8605Smrg
2699848b8605Smrg#define SWAP4BYTE(VALUE)			\
2700848b8605Smrg   {						\
2701848b8605Smrg      GLubyte *bytes = (GLubyte *) &(VALUE);	\
2702848b8605Smrg      GLubyte tmp = bytes[0];			\
2703848b8605Smrg      bytes[0] = bytes[3];			\
2704848b8605Smrg      bytes[3] = tmp;				\
2705848b8605Smrg      tmp = bytes[1];				\
2706848b8605Smrg      bytes[1] = bytes[2];			\
2707848b8605Smrg      bytes[2] = tmp;				\
2708848b8605Smrg   }
2709848b8605Smrg
2710848b8605Smrg
2711848b8605Smrgstatic void
2712848b8605Smrgextract_uint_indexes(GLuint n, GLuint indexes[],
2713848b8605Smrg                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
2714848b8605Smrg                     const struct gl_pixelstore_attrib *unpack )
2715848b8605Smrg{
2716848b8605Smrg   ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
2717848b8605Smrg
2718848b8605Smrg   ASSERT(srcType == GL_BITMAP ||
2719848b8605Smrg          srcType == GL_UNSIGNED_BYTE ||
2720848b8605Smrg          srcType == GL_BYTE ||
2721848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
2722848b8605Smrg          srcType == GL_SHORT ||
2723848b8605Smrg          srcType == GL_UNSIGNED_INT ||
2724848b8605Smrg          srcType == GL_INT ||
2725848b8605Smrg          srcType == GL_UNSIGNED_INT_24_8_EXT ||
2726848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
2727848b8605Smrg          srcType == GL_FLOAT ||
2728848b8605Smrg          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
2729848b8605Smrg
2730848b8605Smrg   switch (srcType) {
2731848b8605Smrg      case GL_BITMAP:
2732848b8605Smrg         {
2733848b8605Smrg            GLubyte *ubsrc = (GLubyte *) src;
2734848b8605Smrg            if (unpack->LsbFirst) {
2735848b8605Smrg               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2736848b8605Smrg               GLuint i;
2737848b8605Smrg               for (i = 0; i < n; i++) {
2738848b8605Smrg                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2739848b8605Smrg                  if (mask == 128) {
2740848b8605Smrg                     mask = 1;
2741848b8605Smrg                     ubsrc++;
2742848b8605Smrg                  }
2743848b8605Smrg                  else {
2744848b8605Smrg                     mask = mask << 1;
2745848b8605Smrg                  }
2746848b8605Smrg               }
2747848b8605Smrg            }
2748848b8605Smrg            else {
2749848b8605Smrg               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2750848b8605Smrg               GLuint i;
2751848b8605Smrg               for (i = 0; i < n; i++) {
2752848b8605Smrg                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2753848b8605Smrg                  if (mask == 1) {
2754848b8605Smrg                     mask = 128;
2755848b8605Smrg                     ubsrc++;
2756848b8605Smrg                  }
2757848b8605Smrg                  else {
2758848b8605Smrg                     mask = mask >> 1;
2759848b8605Smrg                  }
2760848b8605Smrg               }
2761848b8605Smrg            }
2762848b8605Smrg         }
2763848b8605Smrg         break;
2764848b8605Smrg      case GL_UNSIGNED_BYTE:
2765848b8605Smrg         {
2766848b8605Smrg            GLuint i;
2767848b8605Smrg            const GLubyte *s = (const GLubyte *) src;
2768848b8605Smrg            for (i = 0; i < n; i++)
2769848b8605Smrg               indexes[i] = s[i];
2770848b8605Smrg         }
2771848b8605Smrg         break;
2772848b8605Smrg      case GL_BYTE:
2773848b8605Smrg         {
2774848b8605Smrg            GLuint i;
2775848b8605Smrg            const GLbyte *s = (const GLbyte *) src;
2776848b8605Smrg            for (i = 0; i < n; i++)
2777848b8605Smrg               indexes[i] = s[i];
2778848b8605Smrg         }
2779848b8605Smrg         break;
2780848b8605Smrg      case GL_UNSIGNED_SHORT:
2781848b8605Smrg         {
2782848b8605Smrg            GLuint i;
2783848b8605Smrg            const GLushort *s = (const GLushort *) src;
2784848b8605Smrg            if (unpack->SwapBytes) {
2785848b8605Smrg               for (i = 0; i < n; i++) {
2786848b8605Smrg                  GLushort value = s[i];
2787848b8605Smrg                  SWAP2BYTE(value);
2788848b8605Smrg                  indexes[i] = value;
2789848b8605Smrg               }
2790848b8605Smrg            }
2791848b8605Smrg            else {
2792848b8605Smrg               for (i = 0; i < n; i++)
2793848b8605Smrg                  indexes[i] = s[i];
2794848b8605Smrg            }
2795848b8605Smrg         }
2796848b8605Smrg         break;
2797848b8605Smrg      case GL_SHORT:
2798848b8605Smrg         {
2799848b8605Smrg            GLuint i;
2800848b8605Smrg            const GLshort *s = (const GLshort *) src;
2801848b8605Smrg            if (unpack->SwapBytes) {
2802848b8605Smrg               for (i = 0; i < n; i++) {
2803848b8605Smrg                  GLshort value = s[i];
2804848b8605Smrg                  SWAP2BYTE(value);
2805848b8605Smrg                  indexes[i] = value;
2806848b8605Smrg               }
2807848b8605Smrg            }
2808848b8605Smrg            else {
2809848b8605Smrg               for (i = 0; i < n; i++)
2810848b8605Smrg                  indexes[i] = s[i];
2811848b8605Smrg            }
2812848b8605Smrg         }
2813848b8605Smrg         break;
2814848b8605Smrg      case GL_UNSIGNED_INT:
2815848b8605Smrg         {
2816848b8605Smrg            GLuint i;
2817848b8605Smrg            const GLuint *s = (const GLuint *) src;
2818848b8605Smrg            if (unpack->SwapBytes) {
2819848b8605Smrg               for (i = 0; i < n; i++) {
2820848b8605Smrg                  GLuint value = s[i];
2821848b8605Smrg                  SWAP4BYTE(value);
2822848b8605Smrg                  indexes[i] = value;
2823848b8605Smrg               }
2824848b8605Smrg            }
2825848b8605Smrg            else {
2826848b8605Smrg               for (i = 0; i < n; i++)
2827848b8605Smrg                  indexes[i] = s[i];
2828848b8605Smrg            }
2829848b8605Smrg         }
2830848b8605Smrg         break;
2831848b8605Smrg      case GL_INT:
2832848b8605Smrg         {
2833848b8605Smrg            GLuint i;
2834848b8605Smrg            const GLint *s = (const GLint *) src;
2835848b8605Smrg            if (unpack->SwapBytes) {
2836848b8605Smrg               for (i = 0; i < n; i++) {
2837848b8605Smrg                  GLint value = s[i];
2838848b8605Smrg                  SWAP4BYTE(value);
2839848b8605Smrg                  indexes[i] = value;
2840848b8605Smrg               }
2841848b8605Smrg            }
2842848b8605Smrg            else {
2843848b8605Smrg               for (i = 0; i < n; i++)
2844848b8605Smrg                  indexes[i] = s[i];
2845848b8605Smrg            }
2846848b8605Smrg         }
2847848b8605Smrg         break;
2848848b8605Smrg      case GL_FLOAT:
2849848b8605Smrg         {
2850848b8605Smrg            GLuint i;
2851848b8605Smrg            const GLfloat *s = (const GLfloat *) src;
2852848b8605Smrg            if (unpack->SwapBytes) {
2853848b8605Smrg               for (i = 0; i < n; i++) {
2854848b8605Smrg                  GLfloat value = s[i];
2855848b8605Smrg                  SWAP4BYTE(value);
2856848b8605Smrg                  indexes[i] = (GLuint) value;
2857848b8605Smrg               }
2858848b8605Smrg            }
2859848b8605Smrg            else {
2860848b8605Smrg               for (i = 0; i < n; i++)
2861848b8605Smrg                  indexes[i] = (GLuint) s[i];
2862848b8605Smrg            }
2863848b8605Smrg         }
2864848b8605Smrg         break;
2865848b8605Smrg      case GL_HALF_FLOAT_ARB:
2866848b8605Smrg         {
2867848b8605Smrg            GLuint i;
2868848b8605Smrg            const GLhalfARB *s = (const GLhalfARB *) src;
2869848b8605Smrg            if (unpack->SwapBytes) {
2870848b8605Smrg               for (i = 0; i < n; i++) {
2871848b8605Smrg                  GLhalfARB value = s[i];
2872848b8605Smrg                  SWAP2BYTE(value);
2873848b8605Smrg                  indexes[i] = (GLuint) _mesa_half_to_float(value);
2874848b8605Smrg               }
2875848b8605Smrg            }
2876848b8605Smrg            else {
2877848b8605Smrg               for (i = 0; i < n; i++)
2878848b8605Smrg                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
2879848b8605Smrg            }
2880848b8605Smrg         }
2881848b8605Smrg         break;
2882848b8605Smrg      case GL_UNSIGNED_INT_24_8_EXT:
2883848b8605Smrg         {
2884848b8605Smrg            GLuint i;
2885848b8605Smrg            const GLuint *s = (const GLuint *) src;
2886848b8605Smrg            if (unpack->SwapBytes) {
2887848b8605Smrg               for (i = 0; i < n; i++) {
2888848b8605Smrg                  GLuint value = s[i];
2889848b8605Smrg                  SWAP4BYTE(value);
2890848b8605Smrg                  indexes[i] = value & 0xff;  /* lower 8 bits */
2891848b8605Smrg               }
2892848b8605Smrg            }
2893848b8605Smrg            else {
2894848b8605Smrg               for (i = 0; i < n; i++)
2895848b8605Smrg                  indexes[i] = s[i] & 0xff;  /* lower 8 bits */
2896848b8605Smrg            }
2897848b8605Smrg         }
2898848b8605Smrg         break;
2899848b8605Smrg      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2900848b8605Smrg         {
2901848b8605Smrg            GLuint i;
2902848b8605Smrg            const GLuint *s = (const GLuint *) src;
2903848b8605Smrg            if (unpack->SwapBytes) {
2904848b8605Smrg               for (i = 0; i < n; i++) {
2905848b8605Smrg                  GLuint value = s[i*2+1];
2906848b8605Smrg                  SWAP4BYTE(value);
2907848b8605Smrg                  indexes[i] = value & 0xff;  /* lower 8 bits */
2908848b8605Smrg               }
2909848b8605Smrg            }
2910848b8605Smrg            else {
2911848b8605Smrg               for (i = 0; i < n; i++)
2912848b8605Smrg                  indexes[i] = s[i*2+1] & 0xff;  /* lower 8 bits */
2913848b8605Smrg            }
2914848b8605Smrg         }
2915848b8605Smrg         break;
2916848b8605Smrg
2917848b8605Smrg      default:
2918848b8605Smrg         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2919848b8605Smrg         return;
2920848b8605Smrg   }
2921848b8605Smrg}
2922848b8605Smrg
2923848b8605Smrg
2924848b8605Smrg/**
2925848b8605Smrg * Return source/dest RGBA indexes for unpacking pixels.
2926848b8605Smrg */
2927848b8605Smrgstatic void
2928848b8605Smrgget_component_mapping(GLenum format,
2929848b8605Smrg                      GLint *rSrc,
2930848b8605Smrg                      GLint *gSrc,
2931848b8605Smrg                      GLint *bSrc,
2932848b8605Smrg                      GLint *aSrc,
2933848b8605Smrg                      GLint *rDst,
2934848b8605Smrg                      GLint *gDst,
2935848b8605Smrg                      GLint *bDst,
2936848b8605Smrg                      GLint *aDst)
2937848b8605Smrg{
2938848b8605Smrg   switch (format) {
2939848b8605Smrg   case GL_RED:
2940848b8605Smrg   case GL_RED_INTEGER_EXT:
2941848b8605Smrg      *rSrc = 0;
2942848b8605Smrg      *gSrc = *bSrc = *aSrc = -1;
2943848b8605Smrg      break;
2944848b8605Smrg   case GL_GREEN:
2945848b8605Smrg   case GL_GREEN_INTEGER_EXT:
2946848b8605Smrg      *gSrc = 0;
2947848b8605Smrg      *rSrc = *bSrc = *aSrc = -1;
2948848b8605Smrg      break;
2949848b8605Smrg   case GL_BLUE:
2950848b8605Smrg   case GL_BLUE_INTEGER_EXT:
2951848b8605Smrg      *bSrc = 0;
2952848b8605Smrg      *rSrc = *gSrc = *aSrc = -1;
2953848b8605Smrg      break;
2954848b8605Smrg   case GL_ALPHA:
2955848b8605Smrg   case GL_ALPHA_INTEGER_EXT:
2956848b8605Smrg      *rSrc = *gSrc = *bSrc = -1;
2957848b8605Smrg      *aSrc = 0;
2958848b8605Smrg      break;
2959848b8605Smrg   case GL_LUMINANCE:
2960848b8605Smrg   case GL_LUMINANCE_INTEGER_EXT:
2961848b8605Smrg      *rSrc = *gSrc = *bSrc = 0;
2962848b8605Smrg      *aSrc = -1;
2963848b8605Smrg      break;
2964848b8605Smrg   case GL_LUMINANCE_ALPHA:
2965848b8605Smrg   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2966848b8605Smrg      *rSrc = *gSrc = *bSrc = 0;
2967848b8605Smrg      *aSrc = 1;
2968848b8605Smrg      break;
2969848b8605Smrg   case GL_INTENSITY:
2970848b8605Smrg      *rSrc = *gSrc = *bSrc = *aSrc = 0;
2971848b8605Smrg      break;
2972848b8605Smrg   case GL_RG:
2973848b8605Smrg   case GL_RG_INTEGER:
2974848b8605Smrg      *rSrc = 0;
2975848b8605Smrg      *gSrc = 1;
2976848b8605Smrg      *bSrc = -1;
2977848b8605Smrg      *aSrc = -1;
2978848b8605Smrg      *rDst = 0;
2979848b8605Smrg      *gDst = 1;
2980848b8605Smrg      *bDst = 2;
2981848b8605Smrg      *aDst = 3;
2982848b8605Smrg      break;
2983848b8605Smrg   case GL_RGB:
2984848b8605Smrg   case GL_RGB_INTEGER:
2985848b8605Smrg      *rSrc = 0;
2986848b8605Smrg      *gSrc = 1;
2987848b8605Smrg      *bSrc = 2;
2988848b8605Smrg      *aSrc = -1;
2989848b8605Smrg      *rDst = 0;
2990848b8605Smrg      *gDst = 1;
2991848b8605Smrg      *bDst = 2;
2992848b8605Smrg      *aDst = 3;
2993848b8605Smrg      break;
2994848b8605Smrg   case GL_BGR:
2995848b8605Smrg   case GL_BGR_INTEGER:
2996848b8605Smrg      *rSrc = 2;
2997848b8605Smrg      *gSrc = 1;
2998848b8605Smrg      *bSrc = 0;
2999848b8605Smrg      *aSrc = -1;
3000848b8605Smrg      *rDst = 2;
3001848b8605Smrg      *gDst = 1;
3002848b8605Smrg      *bDst = 0;
3003848b8605Smrg      *aDst = 3;
3004848b8605Smrg      break;
3005848b8605Smrg   case GL_RGBA:
3006848b8605Smrg   case GL_RGBA_INTEGER:
3007848b8605Smrg      *rSrc = 0;
3008848b8605Smrg      *gSrc = 1;
3009848b8605Smrg      *bSrc = 2;
3010848b8605Smrg      *aSrc = 3;
3011848b8605Smrg      *rDst = 0;
3012848b8605Smrg      *gDst = 1;
3013848b8605Smrg      *bDst = 2;
3014848b8605Smrg      *aDst = 3;
3015848b8605Smrg      break;
3016848b8605Smrg   case GL_BGRA:
3017848b8605Smrg   case GL_BGRA_INTEGER:
3018848b8605Smrg      *rSrc = 2;
3019848b8605Smrg      *gSrc = 1;
3020848b8605Smrg      *bSrc = 0;
3021848b8605Smrg      *aSrc = 3;
3022848b8605Smrg      *rDst = 2;
3023848b8605Smrg      *gDst = 1;
3024848b8605Smrg      *bDst = 0;
3025848b8605Smrg      *aDst = 3;
3026848b8605Smrg      break;
3027848b8605Smrg   case GL_ABGR_EXT:
3028848b8605Smrg      *rSrc = 3;
3029848b8605Smrg      *gSrc = 2;
3030848b8605Smrg      *bSrc = 1;
3031848b8605Smrg      *aSrc = 0;
3032848b8605Smrg      *rDst = 3;
3033848b8605Smrg      *gDst = 2;
3034848b8605Smrg      *bDst = 1;
3035848b8605Smrg      *aDst = 0;
3036848b8605Smrg      break;
3037848b8605Smrg   default:
3038848b8605Smrg      _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
3039848b8605Smrg                    _mesa_lookup_enum_by_nr(format));
3040848b8605Smrg      return;
3041848b8605Smrg   }
3042848b8605Smrg}
3043848b8605Smrg
3044848b8605Smrg
3045848b8605Smrg
3046848b8605Smrg/*
3047848b8605Smrg * This function extracts floating point RGBA values from arbitrary
3048848b8605Smrg * image data.  srcFormat and srcType are the format and type parameters
3049848b8605Smrg * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3050848b8605Smrg *
3051848b8605Smrg * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3052848b8605Smrg * implements the "Conversion to floating point", "Conversion to RGB",
3053848b8605Smrg * and "Final Expansion to RGBA" operations.
3054848b8605Smrg *
3055848b8605Smrg * Args:  n - number of pixels
3056848b8605Smrg *        rgba - output colors
3057848b8605Smrg *        srcFormat - format of incoming data
3058848b8605Smrg *        srcType - data type of incoming data
3059848b8605Smrg *        src - source data pointer
3060848b8605Smrg *        swapBytes - perform byteswapping of incoming data?
3061848b8605Smrg */
3062848b8605Smrgstatic void
3063848b8605Smrgextract_float_rgba(GLuint n, GLfloat rgba[][4],
3064848b8605Smrg                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
3065848b8605Smrg                   GLboolean swapBytes)
3066848b8605Smrg{
3067848b8605Smrg   GLint rSrc, gSrc, bSrc, aSrc;
3068848b8605Smrg   GLint stride;
3069848b8605Smrg   GLint rDst, bDst, gDst, aDst;
3070848b8605Smrg   GLboolean intFormat;
3071848b8605Smrg   GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
3072848b8605Smrg
3073848b8605Smrg   ASSERT(srcFormat == GL_RED ||
3074848b8605Smrg          srcFormat == GL_GREEN ||
3075848b8605Smrg          srcFormat == GL_BLUE ||
3076848b8605Smrg          srcFormat == GL_ALPHA ||
3077848b8605Smrg          srcFormat == GL_LUMINANCE ||
3078848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA ||
3079848b8605Smrg          srcFormat == GL_INTENSITY ||
3080848b8605Smrg          srcFormat == GL_RG ||
3081848b8605Smrg          srcFormat == GL_RGB ||
3082848b8605Smrg          srcFormat == GL_BGR ||
3083848b8605Smrg          srcFormat == GL_RGBA ||
3084848b8605Smrg          srcFormat == GL_BGRA ||
3085848b8605Smrg          srcFormat == GL_ABGR_EXT ||
3086848b8605Smrg          srcFormat == GL_RED_INTEGER_EXT ||
3087848b8605Smrg          srcFormat == GL_GREEN_INTEGER_EXT ||
3088848b8605Smrg          srcFormat == GL_BLUE_INTEGER_EXT ||
3089848b8605Smrg          srcFormat == GL_ALPHA_INTEGER_EXT ||
3090848b8605Smrg          srcFormat == GL_RG_INTEGER ||
3091848b8605Smrg          srcFormat == GL_RGB_INTEGER_EXT ||
3092848b8605Smrg          srcFormat == GL_RGBA_INTEGER_EXT ||
3093848b8605Smrg          srcFormat == GL_BGR_INTEGER_EXT ||
3094848b8605Smrg          srcFormat == GL_BGRA_INTEGER_EXT ||
3095848b8605Smrg          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3096848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
3097848b8605Smrg
3098848b8605Smrg   ASSERT(srcType == GL_UNSIGNED_BYTE ||
3099848b8605Smrg          srcType == GL_BYTE ||
3100848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
3101848b8605Smrg          srcType == GL_SHORT ||
3102848b8605Smrg          srcType == GL_UNSIGNED_INT ||
3103848b8605Smrg          srcType == GL_INT ||
3104848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
3105848b8605Smrg          srcType == GL_FLOAT ||
3106848b8605Smrg          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3107848b8605Smrg          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3108848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3109848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3110848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3111848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3112848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3113848b8605Smrg          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3114848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3115848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3116848b8605Smrg          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3117848b8605Smrg          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3118848b8605Smrg          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3119848b8605Smrg          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3120848b8605Smrg
3121848b8605Smrg   get_component_mapping(srcFormat,
3122848b8605Smrg                         &rSrc, &gSrc, &bSrc, &aSrc,
3123848b8605Smrg                         &rDst, &gDst, &bDst, &aDst);
3124848b8605Smrg
3125848b8605Smrg   stride = _mesa_components_in_format(srcFormat);
3126848b8605Smrg
3127848b8605Smrg   intFormat = _mesa_is_enum_format_integer(srcFormat);
3128848b8605Smrg
3129848b8605Smrg#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
3130848b8605Smrg   if ((SRC_INDEX) < 0) {						\
3131848b8605Smrg      GLuint i;								\
3132848b8605Smrg      if (intFormat) {							\
3133848b8605Smrg         for (i = 0; i < n; i++) {					\
3134848b8605Smrg            rgba[i][DST_INDEX] = DEFAULT_INT;				\
3135848b8605Smrg         }								\
3136848b8605Smrg      }									\
3137848b8605Smrg      else {								\
3138848b8605Smrg         for (i = 0; i < n; i++) {					\
3139848b8605Smrg            rgba[i][DST_INDEX] = DEFAULT_FLT;				\
3140848b8605Smrg         }								\
3141848b8605Smrg      }									\
3142848b8605Smrg   }									\
3143848b8605Smrg   else if (swapBytes) {						\
3144848b8605Smrg      const TYPE *s = (const TYPE *) src;				\
3145848b8605Smrg      GLuint i;								\
3146848b8605Smrg      for (i = 0; i < n; i++) {						\
3147848b8605Smrg         TYPE value = s[SRC_INDEX];					\
3148848b8605Smrg         if (sizeof(TYPE) == 2) {					\
3149848b8605Smrg            SWAP2BYTE(value);						\
3150848b8605Smrg         }								\
3151848b8605Smrg         else if (sizeof(TYPE) == 4) {					\
3152848b8605Smrg            SWAP4BYTE(value);						\
3153848b8605Smrg         }								\
3154848b8605Smrg         if (intFormat)							\
3155848b8605Smrg            rgba[i][DST_INDEX] = (GLfloat) value;			\
3156848b8605Smrg         else								\
3157848b8605Smrg            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value);		\
3158848b8605Smrg         s += stride;							\
3159848b8605Smrg      }									\
3160848b8605Smrg   }									\
3161848b8605Smrg   else {								\
3162848b8605Smrg      const TYPE *s = (const TYPE *) src;				\
3163848b8605Smrg      GLuint i;								\
3164848b8605Smrg      if (intFormat) {							\
3165848b8605Smrg         for (i = 0; i < n; i++) {					\
3166848b8605Smrg            rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX];		\
3167848b8605Smrg            s += stride;						\
3168848b8605Smrg         }								\
3169848b8605Smrg      }									\
3170848b8605Smrg      else {								\
3171848b8605Smrg         for (i = 0; i < n; i++) {					\
3172848b8605Smrg            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]);	\
3173848b8605Smrg            s += stride;						\
3174848b8605Smrg         }								\
3175848b8605Smrg      }									\
3176848b8605Smrg   }
3177848b8605Smrg
3178848b8605Smrg   switch (srcType) {
3179848b8605Smrg      case GL_UNSIGNED_BYTE:
3180848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
3181848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
3182848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
3183848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
3184848b8605Smrg         break;
3185848b8605Smrg      case GL_BYTE:
3186848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT_TEX);
3187848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT_TEX);
3188848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT_TEX);
3189848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT_TEX);
3190848b8605Smrg         break;
3191848b8605Smrg      case GL_UNSIGNED_SHORT:
3192848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
3193848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
3194848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
3195848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
3196848b8605Smrg         break;
3197848b8605Smrg      case GL_SHORT:
3198848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT_TEX);
3199848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT_TEX);
3200848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT_TEX);
3201848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT_TEX);
3202848b8605Smrg         break;
3203848b8605Smrg      case GL_UNSIGNED_INT:
3204848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
3205848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
3206848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
3207848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
3208848b8605Smrg         break;
3209848b8605Smrg      case GL_INT:
3210848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
3211848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
3212848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
3213848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
3214848b8605Smrg         break;
3215848b8605Smrg      case GL_FLOAT:
3216848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
3217848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
3218848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
3219848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
3220848b8605Smrg         break;
3221848b8605Smrg      case GL_HALF_FLOAT_ARB:
3222848b8605Smrg         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
3223848b8605Smrg         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
3224848b8605Smrg         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
3225848b8605Smrg         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
3226848b8605Smrg         break;
3227848b8605Smrg      case GL_UNSIGNED_BYTE_3_3_2:
3228848b8605Smrg         {
3229848b8605Smrg            const GLubyte *ubsrc = (const GLubyte *) src;
3230848b8605Smrg            GLuint i;
3231848b8605Smrg            if (!intFormat) {
3232848b8605Smrg               rs = 1.0F / 7.0F;
3233848b8605Smrg               gs = 1.0F / 7.0F;
3234848b8605Smrg               bs = 1.0F / 3.0F;
3235848b8605Smrg            }
3236848b8605Smrg            for (i = 0; i < n; i ++) {
3237848b8605Smrg               GLubyte p = ubsrc[i];
3238848b8605Smrg               rgba[i][rDst] = ((p >> 5)      ) * rs;
3239848b8605Smrg               rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
3240848b8605Smrg               rgba[i][bDst] = ((p     ) & 0x3) * bs;
3241848b8605Smrg               rgba[i][aDst] = 1.0F;
3242848b8605Smrg            }
3243848b8605Smrg         }
3244848b8605Smrg         break;
3245848b8605Smrg      case GL_UNSIGNED_BYTE_2_3_3_REV:
3246848b8605Smrg         {
3247848b8605Smrg            const GLubyte *ubsrc = (const GLubyte *) src;
3248848b8605Smrg            GLuint i;
3249848b8605Smrg            if (!intFormat) {
3250848b8605Smrg               rs = 1.0F / 7.0F;
3251848b8605Smrg               gs = 1.0F / 7.0F;
3252848b8605Smrg               bs = 1.0F / 3.0F;
3253848b8605Smrg            }
3254848b8605Smrg            for (i = 0; i < n; i ++) {
3255848b8605Smrg               GLubyte p = ubsrc[i];
3256848b8605Smrg               rgba[i][rDst] = ((p     ) & 0x7) * rs;
3257848b8605Smrg               rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
3258848b8605Smrg               rgba[i][bDst] = ((p >> 6)      ) * bs;
3259848b8605Smrg               rgba[i][aDst] = 1.0F;
3260848b8605Smrg            }
3261848b8605Smrg         }
3262848b8605Smrg         break;
3263848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5:
3264848b8605Smrg         if (!intFormat) {
3265848b8605Smrg            rs = 1.0F / 31.0F;
3266848b8605Smrg            gs = 1.0F / 63.0F;
3267848b8605Smrg            bs = 1.0F / 31.0F;
3268848b8605Smrg         }
3269848b8605Smrg         if (swapBytes) {
3270848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3271848b8605Smrg            GLuint i;
3272848b8605Smrg            for (i = 0; i < n; i ++) {
3273848b8605Smrg               GLushort p = ussrc[i];
3274848b8605Smrg               SWAP2BYTE(p);
3275848b8605Smrg               rgba[i][rDst] = ((p >> 11)       ) * rs;
3276848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
3277848b8605Smrg               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
3278848b8605Smrg               rgba[i][aDst] = 1.0F;
3279848b8605Smrg            }
3280848b8605Smrg         }
3281848b8605Smrg         else {
3282848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3283848b8605Smrg            GLuint i;
3284848b8605Smrg            for (i = 0; i < n; i ++) {
3285848b8605Smrg               GLushort p = ussrc[i];
3286848b8605Smrg               rgba[i][rDst] = ((p >> 11)       ) * rs;
3287848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
3288848b8605Smrg               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
3289848b8605Smrg               rgba[i][aDst] = 1.0F;
3290848b8605Smrg            }
3291848b8605Smrg         }
3292848b8605Smrg         break;
3293848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5_REV:
3294848b8605Smrg         if (!intFormat) {
3295848b8605Smrg            rs = 1.0F / 31.0F;
3296848b8605Smrg            gs = 1.0F / 63.0F;
3297848b8605Smrg            bs = 1.0F / 31.0F;
3298848b8605Smrg         }
3299848b8605Smrg         if (swapBytes) {
3300848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3301848b8605Smrg            GLuint i;
3302848b8605Smrg            for (i = 0; i < n; i ++) {
3303848b8605Smrg               GLushort p = ussrc[i];
3304848b8605Smrg               SWAP2BYTE(p);
3305848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
3306848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
3307848b8605Smrg               rgba[i][bDst] = ((p >> 11)       ) * bs;
3308848b8605Smrg               rgba[i][aDst] = 1.0F;
3309848b8605Smrg            }
3310848b8605Smrg         }
3311848b8605Smrg         else {
3312848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3313848b8605Smrg            GLuint i;
3314848b8605Smrg            for (i = 0; i < n; i ++) {
3315848b8605Smrg               GLushort p = ussrc[i];
3316848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
3317848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
3318848b8605Smrg               rgba[i][bDst] = ((p >> 11)       ) * bs;
3319848b8605Smrg               rgba[i][aDst] = 1.0F;
3320848b8605Smrg            }
3321848b8605Smrg         }
3322848b8605Smrg         break;
3323848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4:
3324848b8605Smrg         if (!intFormat) {
3325848b8605Smrg            rs = gs = bs = as = 1.0F / 15.0F;
3326848b8605Smrg         }
3327848b8605Smrg         if (swapBytes) {
3328848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3329848b8605Smrg            GLuint i;
3330848b8605Smrg            for (i = 0; i < n; i ++) {
3331848b8605Smrg               GLushort p = ussrc[i];
3332848b8605Smrg               SWAP2BYTE(p);
3333848b8605Smrg               rgba[i][rDst] = ((p >> 12)      ) * rs;
3334848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
3335848b8605Smrg               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
3336848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xf) * as;
3337848b8605Smrg            }
3338848b8605Smrg         }
3339848b8605Smrg         else {
3340848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3341848b8605Smrg            GLuint i;
3342848b8605Smrg            for (i = 0; i < n; i ++) {
3343848b8605Smrg               GLushort p = ussrc[i];
3344848b8605Smrg               rgba[i][rDst] = ((p >> 12)      ) * rs;
3345848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
3346848b8605Smrg               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
3347848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xf) * as;
3348848b8605Smrg            }
3349848b8605Smrg         }
3350848b8605Smrg         break;
3351848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3352848b8605Smrg         if (!intFormat) {
3353848b8605Smrg            rs = gs = bs = as = 1.0F / 15.0F;
3354848b8605Smrg         }
3355848b8605Smrg         if (swapBytes) {
3356848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3357848b8605Smrg            GLuint i;
3358848b8605Smrg            for (i = 0; i < n; i ++) {
3359848b8605Smrg               GLushort p = ussrc[i];
3360848b8605Smrg               SWAP2BYTE(p);
3361848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xf) * rs;
3362848b8605Smrg               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
3363848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
3364848b8605Smrg               rgba[i][aDst] = ((p >> 12)      ) * as;
3365848b8605Smrg            }
3366848b8605Smrg         }
3367848b8605Smrg         else {
3368848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3369848b8605Smrg            GLuint i;
3370848b8605Smrg            for (i = 0; i < n; i ++) {
3371848b8605Smrg               GLushort p = ussrc[i];
3372848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xf) * rs;
3373848b8605Smrg               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
3374848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
3375848b8605Smrg               rgba[i][aDst] = ((p >> 12)      ) * as;
3376848b8605Smrg            }
3377848b8605Smrg         }
3378848b8605Smrg         break;
3379848b8605Smrg      case GL_UNSIGNED_SHORT_5_5_5_1:
3380848b8605Smrg         if (!intFormat) {
3381848b8605Smrg            rs = gs = bs = 1.0F / 31.0F;
3382848b8605Smrg         }
3383848b8605Smrg         if (swapBytes) {
3384848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3385848b8605Smrg            GLuint i;
3386848b8605Smrg            for (i = 0; i < n; i ++) {
3387848b8605Smrg               GLushort p = ussrc[i];
3388848b8605Smrg               SWAP2BYTE(p);
3389848b8605Smrg               rgba[i][rDst] = ((p >> 11)       ) * rs;
3390848b8605Smrg               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
3391848b8605Smrg               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
3392848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x1)  * as;
3393848b8605Smrg            }
3394848b8605Smrg         }
3395848b8605Smrg         else {
3396848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3397848b8605Smrg            GLuint i;
3398848b8605Smrg            for (i = 0; i < n; i ++) {
3399848b8605Smrg               GLushort p = ussrc[i];
3400848b8605Smrg               rgba[i][rDst] = ((p >> 11)       ) * rs;
3401848b8605Smrg               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
3402848b8605Smrg               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
3403848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x1)  * as;
3404848b8605Smrg            }
3405848b8605Smrg         }
3406848b8605Smrg         break;
3407848b8605Smrg      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3408848b8605Smrg         if (!intFormat) {
3409848b8605Smrg            rs = gs = bs = 1.0F / 31.0F;
3410848b8605Smrg         }
3411848b8605Smrg         if (swapBytes) {
3412848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3413848b8605Smrg            GLuint i;
3414848b8605Smrg            for (i = 0; i < n; i ++) {
3415848b8605Smrg               GLushort p = ussrc[i];
3416848b8605Smrg               SWAP2BYTE(p);
3417848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
3418848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
3419848b8605Smrg               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
3420848b8605Smrg               rgba[i][aDst] = ((p >> 15)       ) * as;
3421848b8605Smrg            }
3422848b8605Smrg         }
3423848b8605Smrg         else {
3424848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3425848b8605Smrg            GLuint i;
3426848b8605Smrg            for (i = 0; i < n; i ++) {
3427848b8605Smrg               GLushort p = ussrc[i];
3428848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
3429848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
3430848b8605Smrg               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
3431848b8605Smrg               rgba[i][aDst] = ((p >> 15)       ) * as;
3432848b8605Smrg            }
3433848b8605Smrg         }
3434848b8605Smrg         break;
3435848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8:
3436848b8605Smrg         if (swapBytes) {
3437848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3438848b8605Smrg            GLuint i;
3439848b8605Smrg            if (intFormat) {
3440848b8605Smrg               for (i = 0; i < n; i ++) {
3441848b8605Smrg                  GLuint p = uisrc[i];
3442848b8605Smrg                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
3443848b8605Smrg                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
3444848b8605Smrg                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
3445848b8605Smrg                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
3446848b8605Smrg               }
3447848b8605Smrg            }
3448848b8605Smrg            else {
3449848b8605Smrg               for (i = 0; i < n; i ++) {
3450848b8605Smrg                  GLuint p = uisrc[i];
3451848b8605Smrg                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
3452848b8605Smrg                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3453848b8605Smrg                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3454848b8605Smrg                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
3455848b8605Smrg               }
3456848b8605Smrg            }
3457848b8605Smrg         }
3458848b8605Smrg         else {
3459848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3460848b8605Smrg            GLuint i;
3461848b8605Smrg            if (intFormat) {
3462848b8605Smrg               for (i = 0; i < n; i ++) {
3463848b8605Smrg                  GLuint p = uisrc[i];
3464848b8605Smrg                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
3465848b8605Smrg                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
3466848b8605Smrg                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
3467848b8605Smrg                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
3468848b8605Smrg               }
3469848b8605Smrg            }
3470848b8605Smrg            else {
3471848b8605Smrg               for (i = 0; i < n; i ++) {
3472848b8605Smrg                  GLuint p = uisrc[i];
3473848b8605Smrg                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
3474848b8605Smrg                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3475848b8605Smrg                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3476848b8605Smrg                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
3477848b8605Smrg               }
3478848b8605Smrg            }
3479848b8605Smrg         }
3480848b8605Smrg         break;
3481848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8_REV:
3482848b8605Smrg         if (swapBytes) {
3483848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3484848b8605Smrg            GLuint i;
3485848b8605Smrg            if (intFormat) {
3486848b8605Smrg               for (i = 0; i < n; i ++) {
3487848b8605Smrg                  GLuint p = uisrc[i];
3488848b8605Smrg                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
3489848b8605Smrg                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
3490848b8605Smrg                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
3491848b8605Smrg                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
3492848b8605Smrg               }
3493848b8605Smrg            }
3494848b8605Smrg            else {
3495848b8605Smrg               for (i = 0; i < n; i ++) {
3496848b8605Smrg                  GLuint p = uisrc[i];
3497848b8605Smrg                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
3498848b8605Smrg                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3499848b8605Smrg                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3500848b8605Smrg                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
3501848b8605Smrg               }
3502848b8605Smrg            }
3503848b8605Smrg         }
3504848b8605Smrg         else {
3505848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3506848b8605Smrg            GLuint i;
3507848b8605Smrg            if (intFormat) {
3508848b8605Smrg               for (i = 0; i < n; i ++) {
3509848b8605Smrg                  GLuint p = uisrc[i];
3510848b8605Smrg                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
3511848b8605Smrg                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
3512848b8605Smrg                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
3513848b8605Smrg                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
3514848b8605Smrg               }
3515848b8605Smrg            }
3516848b8605Smrg            else {
3517848b8605Smrg               for (i = 0; i < n; i ++) {
3518848b8605Smrg                  GLuint p = uisrc[i];
3519848b8605Smrg                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
3520848b8605Smrg                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
3521848b8605Smrg                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
3522848b8605Smrg                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
3523848b8605Smrg               }
3524848b8605Smrg            }
3525848b8605Smrg         }
3526848b8605Smrg         break;
3527848b8605Smrg      case GL_UNSIGNED_INT_10_10_10_2:
3528848b8605Smrg         if (!intFormat) {
3529848b8605Smrg            rs = 1.0F / 1023.0F;
3530848b8605Smrg            gs = 1.0F / 1023.0F;
3531848b8605Smrg            bs = 1.0F / 1023.0F;
3532848b8605Smrg            as = 1.0F / 3.0F;
3533848b8605Smrg         }
3534848b8605Smrg         if (swapBytes) {
3535848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3536848b8605Smrg            GLuint i;
3537848b8605Smrg            for (i = 0; i < n; i ++) {
3538848b8605Smrg               GLuint p = uisrc[i];
3539848b8605Smrg               SWAP4BYTE(p);
3540848b8605Smrg               rgba[i][rDst] = ((p >> 22)        ) * rs;
3541848b8605Smrg               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
3542848b8605Smrg               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
3543848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
3544848b8605Smrg            }
3545848b8605Smrg         }
3546848b8605Smrg         else {
3547848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3548848b8605Smrg            GLuint i;
3549848b8605Smrg            for (i = 0; i < n; i ++) {
3550848b8605Smrg               GLuint p = uisrc[i];
3551848b8605Smrg               rgba[i][rDst] = ((p >> 22)        ) * rs;
3552848b8605Smrg               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
3553848b8605Smrg               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
3554848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
3555848b8605Smrg            }
3556848b8605Smrg         }
3557848b8605Smrg         break;
3558848b8605Smrg      case GL_UNSIGNED_INT_2_10_10_10_REV:
3559848b8605Smrg         if (!intFormat) {
3560848b8605Smrg            rs = 1.0F / 1023.0F;
3561848b8605Smrg            gs = 1.0F / 1023.0F;
3562848b8605Smrg            bs = 1.0F / 1023.0F;
3563848b8605Smrg            as = 1.0F / 3.0F;
3564848b8605Smrg         }
3565848b8605Smrg         if (swapBytes) {
3566848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3567848b8605Smrg            GLuint i;
3568848b8605Smrg            for (i = 0; i < n; i ++) {
3569848b8605Smrg               GLuint p = uisrc[i];
3570848b8605Smrg               SWAP4BYTE(p);
3571848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
3572848b8605Smrg               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
3573848b8605Smrg               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
3574848b8605Smrg               if (aSrc < 0) {
3575848b8605Smrg                  rgba[i][aDst] = 1.0F;
3576848b8605Smrg               } else {
3577848b8605Smrg                  rgba[i][aDst] = (p >> 30) * as;
3578848b8605Smrg               }
3579848b8605Smrg            }
3580848b8605Smrg         }
3581848b8605Smrg         else {
3582848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3583848b8605Smrg            GLuint i;
3584848b8605Smrg            for (i = 0; i < n; i ++) {
3585848b8605Smrg               GLuint p = uisrc[i];
3586848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
3587848b8605Smrg               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
3588848b8605Smrg               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
3589848b8605Smrg               if (aSrc < 0) {
3590848b8605Smrg                  rgba[i][aDst] = 1.0F;
3591848b8605Smrg               } else {
3592848b8605Smrg                  rgba[i][aDst] = (p >> 30) * as;
3593848b8605Smrg               }
3594848b8605Smrg            }
3595848b8605Smrg         }
3596848b8605Smrg         break;
3597848b8605Smrg      case GL_UNSIGNED_INT_5_9_9_9_REV:
3598848b8605Smrg         if (swapBytes) {
3599848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3600848b8605Smrg            GLuint i;
3601848b8605Smrg            GLfloat f[3];
3602848b8605Smrg            for (i = 0; i < n; i ++) {
3603848b8605Smrg               GLuint p = uisrc[i];
3604848b8605Smrg               SWAP4BYTE(p);
3605848b8605Smrg               rgb9e5_to_float3(p, f);
3606848b8605Smrg               rgba[i][rDst] = f[0];
3607848b8605Smrg               rgba[i][gDst] = f[1];
3608848b8605Smrg               rgba[i][bDst] = f[2];
3609848b8605Smrg               rgba[i][aDst] = 1.0F;
3610848b8605Smrg            }
3611848b8605Smrg         }
3612848b8605Smrg         else {
3613848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3614848b8605Smrg            GLuint i;
3615848b8605Smrg            GLfloat f[3];
3616848b8605Smrg            for (i = 0; i < n; i ++) {
3617848b8605Smrg               rgb9e5_to_float3(uisrc[i], f);
3618848b8605Smrg               rgba[i][rDst] = f[0];
3619848b8605Smrg               rgba[i][gDst] = f[1];
3620848b8605Smrg               rgba[i][bDst] = f[2];
3621848b8605Smrg               rgba[i][aDst] = 1.0F;
3622848b8605Smrg            }
3623848b8605Smrg         }
3624848b8605Smrg         break;
3625848b8605Smrg      case GL_UNSIGNED_INT_10F_11F_11F_REV:
3626848b8605Smrg         if (swapBytes) {
3627848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3628848b8605Smrg            GLuint i;
3629848b8605Smrg            GLfloat f[3];
3630848b8605Smrg            for (i = 0; i < n; i ++) {
3631848b8605Smrg               GLuint p = uisrc[i];
3632848b8605Smrg               SWAP4BYTE(p);
3633848b8605Smrg               r11g11b10f_to_float3(p, f);
3634848b8605Smrg               rgba[i][rDst] = f[0];
3635848b8605Smrg               rgba[i][gDst] = f[1];
3636848b8605Smrg               rgba[i][bDst] = f[2];
3637848b8605Smrg               rgba[i][aDst] = 1.0F;
3638848b8605Smrg            }
3639848b8605Smrg         }
3640848b8605Smrg         else {
3641848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
3642848b8605Smrg            GLuint i;
3643848b8605Smrg            GLfloat f[3];
3644848b8605Smrg            for (i = 0; i < n; i ++) {
3645848b8605Smrg               r11g11b10f_to_float3(uisrc[i], f);
3646848b8605Smrg               rgba[i][rDst] = f[0];
3647848b8605Smrg               rgba[i][gDst] = f[1];
3648848b8605Smrg               rgba[i][bDst] = f[2];
3649848b8605Smrg               rgba[i][aDst] = 1.0F;
3650848b8605Smrg            }
3651848b8605Smrg         }
3652848b8605Smrg         break;
3653848b8605Smrg      default:
3654848b8605Smrg         _mesa_problem(NULL, "bad srcType in extract float data");
3655848b8605Smrg         break;
3656848b8605Smrg   }
3657848b8605Smrg#undef PROCESS
3658848b8605Smrg}
3659848b8605Smrg
3660848b8605Smrg
3661848b8605Smrgstatic inline GLuint
3662848b8605Smrgclamp_float_to_uint(GLfloat f)
3663848b8605Smrg{
3664848b8605Smrg   return f < 0.0F ? 0 : F_TO_I(f);
3665848b8605Smrg}
3666848b8605Smrg
3667848b8605Smrg
3668848b8605Smrgstatic inline GLuint
3669848b8605Smrgclamp_half_to_uint(GLhalfARB h)
3670848b8605Smrg{
3671848b8605Smrg   GLfloat f = _mesa_half_to_float(h);
3672848b8605Smrg   return f < 0.0F ? 0 : F_TO_I(f);
3673848b8605Smrg}
3674848b8605Smrg
3675848b8605Smrg
3676848b8605Smrg/**
3677848b8605Smrg * \sa extract_float_rgba()
3678848b8605Smrg */
3679848b8605Smrgstatic void
3680848b8605Smrgextract_uint_rgba(GLuint n, GLuint rgba[][4],
3681848b8605Smrg                  GLenum srcFormat, GLenum srcType, const GLvoid *src,
3682848b8605Smrg                  GLboolean swapBytes)
3683848b8605Smrg{
3684848b8605Smrg   GLint rSrc, gSrc, bSrc, aSrc;
3685848b8605Smrg   GLint stride;
3686848b8605Smrg   GLint rDst, bDst, gDst, aDst;
3687848b8605Smrg
3688848b8605Smrg   ASSERT(srcFormat == GL_RED ||
3689848b8605Smrg          srcFormat == GL_GREEN ||
3690848b8605Smrg          srcFormat == GL_BLUE ||
3691848b8605Smrg          srcFormat == GL_ALPHA ||
3692848b8605Smrg          srcFormat == GL_LUMINANCE ||
3693848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA ||
3694848b8605Smrg          srcFormat == GL_INTENSITY ||
3695848b8605Smrg          srcFormat == GL_RG ||
3696848b8605Smrg          srcFormat == GL_RGB ||
3697848b8605Smrg          srcFormat == GL_BGR ||
3698848b8605Smrg          srcFormat == GL_RGBA ||
3699848b8605Smrg          srcFormat == GL_BGRA ||
3700848b8605Smrg          srcFormat == GL_ABGR_EXT ||
3701848b8605Smrg          srcFormat == GL_RED_INTEGER_EXT ||
3702848b8605Smrg          srcFormat == GL_RG_INTEGER ||
3703848b8605Smrg          srcFormat == GL_GREEN_INTEGER_EXT ||
3704848b8605Smrg          srcFormat == GL_BLUE_INTEGER_EXT ||
3705848b8605Smrg          srcFormat == GL_ALPHA_INTEGER_EXT ||
3706848b8605Smrg          srcFormat == GL_RGB_INTEGER_EXT ||
3707848b8605Smrg          srcFormat == GL_RGBA_INTEGER_EXT ||
3708848b8605Smrg          srcFormat == GL_BGR_INTEGER_EXT ||
3709848b8605Smrg          srcFormat == GL_BGRA_INTEGER_EXT ||
3710848b8605Smrg          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3711848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
3712848b8605Smrg
3713848b8605Smrg   ASSERT(srcType == GL_UNSIGNED_BYTE ||
3714848b8605Smrg          srcType == GL_BYTE ||
3715848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
3716848b8605Smrg          srcType == GL_SHORT ||
3717848b8605Smrg          srcType == GL_UNSIGNED_INT ||
3718848b8605Smrg          srcType == GL_INT ||
3719848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
3720848b8605Smrg          srcType == GL_FLOAT ||
3721848b8605Smrg          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3722848b8605Smrg          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3723848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3724848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3725848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3726848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3727848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3728848b8605Smrg          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3729848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3730848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3731848b8605Smrg          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3732848b8605Smrg          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3733848b8605Smrg          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3734848b8605Smrg          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3735848b8605Smrg
3736848b8605Smrg   get_component_mapping(srcFormat,
3737848b8605Smrg                         &rSrc, &gSrc, &bSrc, &aSrc,
3738848b8605Smrg                         &rDst, &gDst, &bDst, &aDst);
3739848b8605Smrg
3740848b8605Smrg   stride = _mesa_components_in_format(srcFormat);
3741848b8605Smrg
3742848b8605Smrg#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION)	\
3743848b8605Smrg   if ((SRC_INDEX) < 0) {						\
3744848b8605Smrg      GLuint i;								\
3745848b8605Smrg      for (i = 0; i < n; i++) {						\
3746848b8605Smrg         rgba[i][DST_INDEX] = DEFAULT;					\
3747848b8605Smrg      }									\
3748848b8605Smrg   }									\
3749848b8605Smrg   else if (swapBytes) {						\
3750848b8605Smrg      const TYPE *s = (const TYPE *) src;				\
3751848b8605Smrg      GLuint i;								\
3752848b8605Smrg      for (i = 0; i < n; i++) {						\
3753848b8605Smrg         TYPE value = s[SRC_INDEX];					\
3754848b8605Smrg         if (sizeof(TYPE) == 2) {					\
3755848b8605Smrg            SWAP2BYTE(value);						\
3756848b8605Smrg         }								\
3757848b8605Smrg         else if (sizeof(TYPE) == 4) {					\
3758848b8605Smrg            SWAP4BYTE(value);						\
3759848b8605Smrg         }								\
3760848b8605Smrg         rgba[i][DST_INDEX] = CONVERSION(value);                        \
3761848b8605Smrg         s += stride;							\
3762848b8605Smrg      }									\
3763848b8605Smrg   }									\
3764848b8605Smrg   else {								\
3765848b8605Smrg      const TYPE *s = (const TYPE *) src;				\
3766848b8605Smrg      GLuint i;								\
3767848b8605Smrg      for (i = 0; i < n; i++) {						\
3768848b8605Smrg         rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]);			\
3769848b8605Smrg         s += stride;							\
3770848b8605Smrg      }									\
3771848b8605Smrg   }
3772848b8605Smrg
3773848b8605Smrg   switch (srcType) {
3774848b8605Smrg      case GL_UNSIGNED_BYTE:
3775848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
3776848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
3777848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
3778848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
3779848b8605Smrg         break;
3780848b8605Smrg      case GL_BYTE:
3781848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint));
3782848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint));
3783848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint));
3784848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint));
3785848b8605Smrg         break;
3786848b8605Smrg      case GL_UNSIGNED_SHORT:
3787848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
3788848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
3789848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
3790848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
3791848b8605Smrg         break;
3792848b8605Smrg      case GL_SHORT:
3793848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint));
3794848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint));
3795848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint));
3796848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint));
3797848b8605Smrg         break;
3798848b8605Smrg      case GL_UNSIGNED_INT:
3799848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
3800848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
3801848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
3802848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
3803848b8605Smrg         break;
3804848b8605Smrg      case GL_INT:
3805848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLint, (GLuint));
3806848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLint, (GLuint));
3807848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLint, (GLuint));
3808848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLint, (GLuint));
3809848b8605Smrg         break;
3810848b8605Smrg      case GL_FLOAT:
3811848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
3812848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
3813848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
3814848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
3815848b8605Smrg         break;
3816848b8605Smrg      case GL_HALF_FLOAT_ARB:
3817848b8605Smrg         PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
3818848b8605Smrg         PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
3819848b8605Smrg         PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
3820848b8605Smrg         PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
3821848b8605Smrg         break;
3822848b8605Smrg      case GL_UNSIGNED_BYTE_3_3_2:
3823848b8605Smrg         {
3824848b8605Smrg            const GLubyte *ubsrc = (const GLubyte *) src;
3825848b8605Smrg            GLuint i;
3826848b8605Smrg            for (i = 0; i < n; i ++) {
3827848b8605Smrg               GLubyte p = ubsrc[i];
3828848b8605Smrg               rgba[i][rDst] = ((p >> 5)      );
3829848b8605Smrg               rgba[i][gDst] = ((p >> 2) & 0x7);
3830848b8605Smrg               rgba[i][bDst] = ((p     ) & 0x3);
3831848b8605Smrg               rgba[i][aDst] = 1;
3832848b8605Smrg            }
3833848b8605Smrg         }
3834848b8605Smrg         break;
3835848b8605Smrg      case GL_UNSIGNED_BYTE_2_3_3_REV:
3836848b8605Smrg         {
3837848b8605Smrg            const GLubyte *ubsrc = (const GLubyte *) src;
3838848b8605Smrg            GLuint i;
3839848b8605Smrg            for (i = 0; i < n; i ++) {
3840848b8605Smrg               GLubyte p = ubsrc[i];
3841848b8605Smrg               rgba[i][rDst] = ((p     ) & 0x7);
3842848b8605Smrg               rgba[i][gDst] = ((p >> 3) & 0x7);
3843848b8605Smrg               rgba[i][bDst] = ((p >> 6)      );
3844848b8605Smrg               rgba[i][aDst] = 1;
3845848b8605Smrg            }
3846848b8605Smrg         }
3847848b8605Smrg         break;
3848848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5:
3849848b8605Smrg         if (swapBytes) {
3850848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3851848b8605Smrg            GLuint i;
3852848b8605Smrg            for (i = 0; i < n; i ++) {
3853848b8605Smrg               GLushort p = ussrc[i];
3854848b8605Smrg               SWAP2BYTE(p);
3855848b8605Smrg               rgba[i][rDst] = ((p >> 11)       );
3856848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f);
3857848b8605Smrg               rgba[i][bDst] = ((p      ) & 0x1f);
3858848b8605Smrg               rgba[i][aDst] = 1;
3859848b8605Smrg            }
3860848b8605Smrg         }
3861848b8605Smrg         else {
3862848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3863848b8605Smrg            GLuint i;
3864848b8605Smrg            for (i = 0; i < n; i ++) {
3865848b8605Smrg               GLushort p = ussrc[i];
3866848b8605Smrg               rgba[i][rDst] = ((p >> 11)       );
3867848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f);
3868848b8605Smrg               rgba[i][bDst] = ((p      ) & 0x1f);
3869848b8605Smrg               rgba[i][aDst] = 1;
3870848b8605Smrg            }
3871848b8605Smrg         }
3872848b8605Smrg         break;
3873848b8605Smrg      case GL_UNSIGNED_SHORT_5_6_5_REV:
3874848b8605Smrg         if (swapBytes) {
3875848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3876848b8605Smrg            GLuint i;
3877848b8605Smrg            for (i = 0; i < n; i ++) {
3878848b8605Smrg               GLushort p = ussrc[i];
3879848b8605Smrg               SWAP2BYTE(p);
3880848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f);
3881848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f);
3882848b8605Smrg               rgba[i][bDst] = ((p >> 11)       );
3883848b8605Smrg               rgba[i][aDst] = 1;
3884848b8605Smrg            }
3885848b8605Smrg         }
3886848b8605Smrg         else {
3887848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3888848b8605Smrg            GLuint i;
3889848b8605Smrg            for (i = 0; i < n; i ++) {
3890848b8605Smrg               GLushort p = ussrc[i];
3891848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f);
3892848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x3f);
3893848b8605Smrg               rgba[i][bDst] = ((p >> 11)       );
3894848b8605Smrg               rgba[i][aDst] = 1;
3895848b8605Smrg            }
3896848b8605Smrg         }
3897848b8605Smrg         break;
3898848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4:
3899848b8605Smrg         if (swapBytes) {
3900848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3901848b8605Smrg            GLuint i;
3902848b8605Smrg            for (i = 0; i < n; i ++) {
3903848b8605Smrg               GLushort p = ussrc[i];
3904848b8605Smrg               SWAP2BYTE(p);
3905848b8605Smrg               rgba[i][rDst] = ((p >> 12)      );
3906848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xf);
3907848b8605Smrg               rgba[i][bDst] = ((p >>  4) & 0xf);
3908848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xf);
3909848b8605Smrg            }
3910848b8605Smrg         }
3911848b8605Smrg         else {
3912848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3913848b8605Smrg            GLuint i;
3914848b8605Smrg            for (i = 0; i < n; i ++) {
3915848b8605Smrg               GLushort p = ussrc[i];
3916848b8605Smrg               rgba[i][rDst] = ((p >> 12)      );
3917848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xf);
3918848b8605Smrg               rgba[i][bDst] = ((p >>  4) & 0xf);
3919848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xf);
3920848b8605Smrg            }
3921848b8605Smrg         }
3922848b8605Smrg         break;
3923848b8605Smrg      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3924848b8605Smrg         if (swapBytes) {
3925848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3926848b8605Smrg            GLuint i;
3927848b8605Smrg            for (i = 0; i < n; i ++) {
3928848b8605Smrg               GLushort p = ussrc[i];
3929848b8605Smrg               SWAP2BYTE(p);
3930848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xf);
3931848b8605Smrg               rgba[i][gDst] = ((p >>  4) & 0xf);
3932848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xf);
3933848b8605Smrg               rgba[i][aDst] = ((p >> 12)      );
3934848b8605Smrg            }
3935848b8605Smrg         }
3936848b8605Smrg         else {
3937848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3938848b8605Smrg            GLuint i;
3939848b8605Smrg            for (i = 0; i < n; i ++) {
3940848b8605Smrg               GLushort p = ussrc[i];
3941848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xf);
3942848b8605Smrg               rgba[i][gDst] = ((p >>  4) & 0xf);
3943848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xf);
3944848b8605Smrg               rgba[i][aDst] = ((p >> 12)      );
3945848b8605Smrg            }
3946848b8605Smrg         }
3947848b8605Smrg         break;
3948848b8605Smrg      case GL_UNSIGNED_SHORT_5_5_5_1:
3949848b8605Smrg         if (swapBytes) {
3950848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3951848b8605Smrg            GLuint i;
3952848b8605Smrg            for (i = 0; i < n; i ++) {
3953848b8605Smrg               GLushort p = ussrc[i];
3954848b8605Smrg               SWAP2BYTE(p);
3955848b8605Smrg               rgba[i][rDst] = ((p >> 11)       );
3956848b8605Smrg               rgba[i][gDst] = ((p >>  6) & 0x1f);
3957848b8605Smrg               rgba[i][bDst] = ((p >>  1) & 0x1f);
3958848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x1 );
3959848b8605Smrg            }
3960848b8605Smrg         }
3961848b8605Smrg         else {
3962848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3963848b8605Smrg            GLuint i;
3964848b8605Smrg            for (i = 0; i < n; i ++) {
3965848b8605Smrg               GLushort p = ussrc[i];
3966848b8605Smrg               rgba[i][rDst] = ((p >> 11)       );
3967848b8605Smrg               rgba[i][gDst] = ((p >>  6) & 0x1f);
3968848b8605Smrg               rgba[i][bDst] = ((p >>  1) & 0x1f);
3969848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x1 );
3970848b8605Smrg            }
3971848b8605Smrg         }
3972848b8605Smrg         break;
3973848b8605Smrg      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3974848b8605Smrg         if (swapBytes) {
3975848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3976848b8605Smrg            GLuint i;
3977848b8605Smrg            for (i = 0; i < n; i ++) {
3978848b8605Smrg               GLushort p = ussrc[i];
3979848b8605Smrg               SWAP2BYTE(p);
3980848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f);
3981848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x1f);
3982848b8605Smrg               rgba[i][bDst] = ((p >> 10) & 0x1f);
3983848b8605Smrg               rgba[i][aDst] = ((p >> 15)       );
3984848b8605Smrg            }
3985848b8605Smrg         }
3986848b8605Smrg         else {
3987848b8605Smrg            const GLushort *ussrc = (const GLushort *) src;
3988848b8605Smrg            GLuint i;
3989848b8605Smrg            for (i = 0; i < n; i ++) {
3990848b8605Smrg               GLushort p = ussrc[i];
3991848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x1f);
3992848b8605Smrg               rgba[i][gDst] = ((p >>  5) & 0x1f);
3993848b8605Smrg               rgba[i][bDst] = ((p >> 10) & 0x1f);
3994848b8605Smrg               rgba[i][aDst] = ((p >> 15)       );
3995848b8605Smrg            }
3996848b8605Smrg         }
3997848b8605Smrg         break;
3998848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8:
3999848b8605Smrg         if (swapBytes) {
4000848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4001848b8605Smrg            GLuint i;
4002848b8605Smrg            for (i = 0; i < n; i ++) {
4003848b8605Smrg               GLuint p = uisrc[i];
4004848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xff);
4005848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xff);
4006848b8605Smrg               rgba[i][bDst] = ((p >> 16) & 0xff);
4007848b8605Smrg               rgba[i][aDst] = ((p >> 24)       );
4008848b8605Smrg            }
4009848b8605Smrg         }
4010848b8605Smrg         else {
4011848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4012848b8605Smrg            GLuint i;
4013848b8605Smrg            for (i = 0; i < n; i ++) {
4014848b8605Smrg               GLuint p = uisrc[i];
4015848b8605Smrg               rgba[i][rDst] = ((p >> 24)       );
4016848b8605Smrg               rgba[i][gDst] = ((p >> 16) & 0xff);
4017848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xff);
4018848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xff);
4019848b8605Smrg            }
4020848b8605Smrg         }
4021848b8605Smrg         break;
4022848b8605Smrg      case GL_UNSIGNED_INT_8_8_8_8_REV:
4023848b8605Smrg         if (swapBytes) {
4024848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4025848b8605Smrg            GLuint i;
4026848b8605Smrg            for (i = 0; i < n; i ++) {
4027848b8605Smrg               GLuint p = uisrc[i];
4028848b8605Smrg               rgba[i][rDst] = ((p >> 24)       );
4029848b8605Smrg               rgba[i][gDst] = ((p >> 16) & 0xff);
4030848b8605Smrg               rgba[i][bDst] = ((p >>  8) & 0xff);
4031848b8605Smrg               rgba[i][aDst] = ((p      ) & 0xff);
4032848b8605Smrg            }
4033848b8605Smrg         }
4034848b8605Smrg         else {
4035848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4036848b8605Smrg            GLuint i;
4037848b8605Smrg            for (i = 0; i < n; i ++) {
4038848b8605Smrg               GLuint p = uisrc[i];
4039848b8605Smrg               rgba[i][rDst] = ((p      ) & 0xff);
4040848b8605Smrg               rgba[i][gDst] = ((p >>  8) & 0xff);
4041848b8605Smrg               rgba[i][bDst] = ((p >> 16) & 0xff);
4042848b8605Smrg               rgba[i][aDst] = ((p >> 24)       );
4043848b8605Smrg            }
4044848b8605Smrg         }
4045848b8605Smrg         break;
4046848b8605Smrg      case GL_UNSIGNED_INT_10_10_10_2:
4047848b8605Smrg         if (swapBytes) {
4048848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4049848b8605Smrg            GLuint i;
4050848b8605Smrg            for (i = 0; i < n; i ++) {
4051848b8605Smrg               GLuint p = uisrc[i];
4052848b8605Smrg               SWAP4BYTE(p);
4053848b8605Smrg               rgba[i][rDst] = ((p >> 22)        );
4054848b8605Smrg               rgba[i][gDst] = ((p >> 12) & 0x3ff);
4055848b8605Smrg               rgba[i][bDst] = ((p >>  2) & 0x3ff);
4056848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x3  );
4057848b8605Smrg            }
4058848b8605Smrg         }
4059848b8605Smrg         else {
4060848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4061848b8605Smrg            GLuint i;
4062848b8605Smrg            for (i = 0; i < n; i ++) {
4063848b8605Smrg               GLuint p = uisrc[i];
4064848b8605Smrg               rgba[i][rDst] = ((p >> 22)        );
4065848b8605Smrg               rgba[i][gDst] = ((p >> 12) & 0x3ff);
4066848b8605Smrg               rgba[i][bDst] = ((p >>  2) & 0x3ff);
4067848b8605Smrg               rgba[i][aDst] = ((p      ) & 0x3  );
4068848b8605Smrg            }
4069848b8605Smrg         }
4070848b8605Smrg         break;
4071848b8605Smrg      case GL_UNSIGNED_INT_2_10_10_10_REV:
4072848b8605Smrg         if (swapBytes) {
4073848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4074848b8605Smrg            GLuint i;
4075848b8605Smrg            for (i = 0; i < n; i ++) {
4076848b8605Smrg               GLuint p = uisrc[i];
4077848b8605Smrg               SWAP4BYTE(p);
4078848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x3ff);
4079848b8605Smrg               rgba[i][gDst] = ((p >> 10) & 0x3ff);
4080848b8605Smrg               rgba[i][bDst] = ((p >> 20) & 0x3ff);
4081848b8605Smrg               rgba[i][aDst] = ((p >> 30)        );
4082848b8605Smrg            }
4083848b8605Smrg         }
4084848b8605Smrg         else {
4085848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4086848b8605Smrg            GLuint i;
4087848b8605Smrg            for (i = 0; i < n; i ++) {
4088848b8605Smrg               GLuint p = uisrc[i];
4089848b8605Smrg               rgba[i][rDst] = ((p      ) & 0x3ff);
4090848b8605Smrg               rgba[i][gDst] = ((p >> 10) & 0x3ff);
4091848b8605Smrg               rgba[i][bDst] = ((p >> 20) & 0x3ff);
4092848b8605Smrg               rgba[i][aDst] = ((p >> 30)        );
4093848b8605Smrg            }
4094848b8605Smrg         }
4095848b8605Smrg         break;
4096848b8605Smrg      case GL_UNSIGNED_INT_5_9_9_9_REV:
4097848b8605Smrg         if (swapBytes) {
4098848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4099848b8605Smrg            GLuint i;
4100848b8605Smrg            float f[3];
4101848b8605Smrg            for (i = 0; i < n; i ++) {
4102848b8605Smrg               GLuint p = uisrc[i];
4103848b8605Smrg               SWAP4BYTE(p);
4104848b8605Smrg               rgb9e5_to_float3(p, f);
4105848b8605Smrg               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4106848b8605Smrg               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4107848b8605Smrg               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4108848b8605Smrg               rgba[i][aDst] = 1;
4109848b8605Smrg            }
4110848b8605Smrg         }
4111848b8605Smrg         else {
4112848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4113848b8605Smrg            GLuint i;
4114848b8605Smrg            float f[3];
4115848b8605Smrg            for (i = 0; i < n; i ++) {
4116848b8605Smrg               GLuint p = uisrc[i];
4117848b8605Smrg               rgb9e5_to_float3(p, f);
4118848b8605Smrg               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4119848b8605Smrg               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4120848b8605Smrg               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4121848b8605Smrg               rgba[i][aDst] = 1;
4122848b8605Smrg            }
4123848b8605Smrg         }
4124848b8605Smrg         break;
4125848b8605Smrg      case GL_UNSIGNED_INT_10F_11F_11F_REV:
4126848b8605Smrg         if (swapBytes) {
4127848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4128848b8605Smrg            GLuint i;
4129848b8605Smrg            float f[3];
4130848b8605Smrg            for (i = 0; i < n; i ++) {
4131848b8605Smrg               GLuint p = uisrc[i];
4132848b8605Smrg               SWAP4BYTE(p);
4133848b8605Smrg               r11g11b10f_to_float3(p, f);
4134848b8605Smrg               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4135848b8605Smrg               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4136848b8605Smrg               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4137848b8605Smrg               rgba[i][aDst] = 1;
4138848b8605Smrg            }
4139848b8605Smrg         }
4140848b8605Smrg         else {
4141848b8605Smrg            const GLuint *uisrc = (const GLuint *) src;
4142848b8605Smrg            GLuint i;
4143848b8605Smrg            float f[3];
4144848b8605Smrg            for (i = 0; i < n; i ++) {
4145848b8605Smrg               GLuint p = uisrc[i];
4146848b8605Smrg               r11g11b10f_to_float3(p, f);
4147848b8605Smrg               rgba[i][rDst] = clamp_float_to_uint(f[0]);
4148848b8605Smrg               rgba[i][gDst] = clamp_float_to_uint(f[1]);
4149848b8605Smrg               rgba[i][bDst] = clamp_float_to_uint(f[2]);
4150848b8605Smrg               rgba[i][aDst] = 1;
4151848b8605Smrg            }
4152848b8605Smrg         }
4153848b8605Smrg         break;
4154848b8605Smrg      default:
4155848b8605Smrg         _mesa_problem(NULL, "bad srcType in extract uint data");
4156848b8605Smrg         break;
4157848b8605Smrg   }
4158848b8605Smrg#undef PROCESS
4159848b8605Smrg}
4160848b8605Smrg
4161848b8605Smrg
4162848b8605Smrg
4163848b8605Smrg/*
4164848b8605Smrg * Unpack a row of color image data from a client buffer according to
4165848b8605Smrg * the pixel unpacking parameters.
4166848b8605Smrg * Return GLubyte values in the specified dest image format.
4167848b8605Smrg * This is used by glDrawPixels and glTexImage?D().
4168848b8605Smrg * \param ctx - the context
4169848b8605Smrg *         n - number of pixels in the span
4170848b8605Smrg *         dstFormat - format of destination color array
4171848b8605Smrg *         dest - the destination color array
4172848b8605Smrg *         srcFormat - source image format
4173848b8605Smrg *         srcType - source image  data type
4174848b8605Smrg *         source - source image pointer
4175848b8605Smrg *         srcPacking - pixel unpacking parameters
4176848b8605Smrg *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
4177848b8605Smrg *
4178848b8605Smrg * XXX perhaps expand this to process whole images someday.
4179848b8605Smrg */
4180848b8605Smrgvoid
4181848b8605Smrg_mesa_unpack_color_span_ubyte(struct gl_context *ctx,
4182848b8605Smrg                              GLuint n, GLenum dstFormat, GLubyte dest[],
4183848b8605Smrg                              GLenum srcFormat, GLenum srcType,
4184848b8605Smrg                              const GLvoid *source,
4185848b8605Smrg                              const struct gl_pixelstore_attrib *srcPacking,
4186848b8605Smrg                              GLbitfield transferOps )
4187848b8605Smrg{
4188848b8605Smrg   GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat);
4189848b8605Smrg   ASSERT(dstFormat == GL_ALPHA ||
4190848b8605Smrg          dstFormat == GL_LUMINANCE ||
4191848b8605Smrg          dstFormat == GL_LUMINANCE_ALPHA ||
4192848b8605Smrg          dstFormat == GL_INTENSITY ||
4193848b8605Smrg          dstFormat == GL_RED ||
4194848b8605Smrg          dstFormat == GL_RG ||
4195848b8605Smrg          dstFormat == GL_RGB ||
4196848b8605Smrg          dstFormat == GL_RGBA);
4197848b8605Smrg
4198848b8605Smrg   ASSERT(srcFormat == GL_RED ||
4199848b8605Smrg          srcFormat == GL_GREEN ||
4200848b8605Smrg          srcFormat == GL_BLUE ||
4201848b8605Smrg          srcFormat == GL_ALPHA ||
4202848b8605Smrg          srcFormat == GL_LUMINANCE ||
4203848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA ||
4204848b8605Smrg          srcFormat == GL_INTENSITY ||
4205848b8605Smrg          srcFormat == GL_RG ||
4206848b8605Smrg          srcFormat == GL_RGB ||
4207848b8605Smrg          srcFormat == GL_BGR ||
4208848b8605Smrg          srcFormat == GL_RGBA ||
4209848b8605Smrg          srcFormat == GL_BGRA ||
4210848b8605Smrg          srcFormat == GL_ABGR_EXT ||
4211848b8605Smrg          srcFormat == GL_COLOR_INDEX);
4212848b8605Smrg
4213848b8605Smrg   ASSERT(srcType == GL_BITMAP ||
4214848b8605Smrg          srcType == GL_UNSIGNED_BYTE ||
4215848b8605Smrg          srcType == GL_BYTE ||
4216848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
4217848b8605Smrg          srcType == GL_SHORT ||
4218848b8605Smrg          srcType == GL_UNSIGNED_INT ||
4219848b8605Smrg          srcType == GL_INT ||
4220848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
4221848b8605Smrg          srcType == GL_FLOAT ||
4222848b8605Smrg          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4223848b8605Smrg          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4224848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4225848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4226848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4227848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4228848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4229848b8605Smrg          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4230848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4231848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4232848b8605Smrg          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4233848b8605Smrg          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4234848b8605Smrg          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4235848b8605Smrg          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4236848b8605Smrg
4237848b8605Smrg   /* EXT_texture_integer specifies no transfer ops on integer
4238848b8605Smrg    * types in the resolved issues section. Just set them to 0
4239848b8605Smrg    * for integer surfaces.
4240848b8605Smrg    */
4241848b8605Smrg   if (intFormat)
4242848b8605Smrg      transferOps = 0;
4243848b8605Smrg
4244848b8605Smrg   /* Try simple cases first */
4245848b8605Smrg   if (transferOps == 0) {
4246848b8605Smrg      if (srcType == GL_UNSIGNED_BYTE) {
4247848b8605Smrg         if (dstFormat == GL_RGBA) {
4248848b8605Smrg            if (srcFormat == GL_RGBA) {
4249848b8605Smrg               memcpy( dest, source, n * 4 * sizeof(GLubyte) );
4250848b8605Smrg               return;
4251848b8605Smrg            }
4252848b8605Smrg            else if (srcFormat == GL_RGB) {
4253848b8605Smrg               GLuint i;
4254848b8605Smrg               const GLubyte *src = (const GLubyte *) source;
4255848b8605Smrg               GLubyte *dst = dest;
4256848b8605Smrg               for (i = 0; i < n; i++) {
4257848b8605Smrg                  dst[0] = src[0];
4258848b8605Smrg                  dst[1] = src[1];
4259848b8605Smrg                  dst[2] = src[2];
4260848b8605Smrg                  dst[3] = 255;
4261848b8605Smrg                  src += 3;
4262848b8605Smrg                  dst += 4;
4263848b8605Smrg               }
4264848b8605Smrg               return;
4265848b8605Smrg            }
4266848b8605Smrg         }
4267848b8605Smrg         else if (dstFormat == GL_RGB) {
4268848b8605Smrg            if (srcFormat == GL_RGB) {
4269848b8605Smrg               memcpy( dest, source, n * 3 * sizeof(GLubyte) );
4270848b8605Smrg               return;
4271848b8605Smrg            }
4272848b8605Smrg            else if (srcFormat == GL_RGBA) {
4273848b8605Smrg               GLuint i;
4274848b8605Smrg               const GLubyte *src = (const GLubyte *) source;
4275848b8605Smrg               GLubyte *dst = dest;
4276848b8605Smrg               for (i = 0; i < n; i++) {
4277848b8605Smrg                  dst[0] = src[0];
4278848b8605Smrg                  dst[1] = src[1];
4279848b8605Smrg                  dst[2] = src[2];
4280848b8605Smrg                  src += 4;
4281848b8605Smrg                  dst += 3;
4282848b8605Smrg               }
4283848b8605Smrg               return;
4284848b8605Smrg            }
4285848b8605Smrg         }
4286848b8605Smrg         else if (dstFormat == srcFormat) {
4287848b8605Smrg            GLint comps = _mesa_components_in_format(srcFormat);
4288848b8605Smrg            assert(comps > 0);
4289848b8605Smrg            memcpy( dest, source, n * comps * sizeof(GLubyte) );
4290848b8605Smrg            return;
4291848b8605Smrg         }
4292848b8605Smrg      }
4293848b8605Smrg   }
4294848b8605Smrg
4295848b8605Smrg
4296848b8605Smrg   /* general solution begins here */
4297848b8605Smrg   {
4298848b8605Smrg      GLint dstComponents;
4299848b8605Smrg      GLint rDst, gDst, bDst, aDst, lDst, iDst;
4300848b8605Smrg      GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat));
4301848b8605Smrg
4302848b8605Smrg      if (!rgba) {
4303848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4304848b8605Smrg         return;
4305848b8605Smrg      }
4306848b8605Smrg
4307848b8605Smrg      dstComponents = _mesa_components_in_format( dstFormat );
4308848b8605Smrg      /* source & dest image formats should have been error checked by now */
4309848b8605Smrg      assert(dstComponents > 0);
4310848b8605Smrg
4311848b8605Smrg      /*
4312848b8605Smrg       * Extract image data and convert to RGBA floats
4313848b8605Smrg       */
4314848b8605Smrg      if (srcFormat == GL_COLOR_INDEX) {
4315848b8605Smrg         GLuint *indexes = malloc(n * sizeof(GLuint));
4316848b8605Smrg
4317848b8605Smrg         if (!indexes) {
4318848b8605Smrg            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4319848b8605Smrg            free(rgba);
4320848b8605Smrg            return;
4321848b8605Smrg         }
4322848b8605Smrg
4323848b8605Smrg         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
4324848b8605Smrg                              srcPacking);
4325848b8605Smrg
4326848b8605Smrg	 /* Convert indexes to RGBA */
4327848b8605Smrg	 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4328848b8605Smrg	    _mesa_shift_and_offset_ci(ctx, n, indexes);
4329848b8605Smrg	 }
4330848b8605Smrg	 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
4331848b8605Smrg
4332848b8605Smrg         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4333848b8605Smrg          * with color indexes.
4334848b8605Smrg          */
4335848b8605Smrg         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
4336848b8605Smrg
4337848b8605Smrg         free(indexes);
4338848b8605Smrg      }
4339848b8605Smrg      else {
4340848b8605Smrg         /* non-color index data */
4341848b8605Smrg         extract_float_rgba(n, rgba, srcFormat, srcType, source,
4342848b8605Smrg                            srcPacking->SwapBytes);
4343848b8605Smrg      }
4344848b8605Smrg
4345848b8605Smrg      /* Need to clamp if returning GLubytes */
4346848b8605Smrg      transferOps |= IMAGE_CLAMP_BIT;
4347848b8605Smrg
4348848b8605Smrg      if (transferOps) {
4349848b8605Smrg         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
4350848b8605Smrg      }
4351848b8605Smrg
4352848b8605Smrg      get_component_indexes(dstFormat,
4353848b8605Smrg                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4354848b8605Smrg
4355848b8605Smrg      /* Now return the GLubyte data in the requested dstFormat */
4356848b8605Smrg      if (rDst >= 0) {
4357848b8605Smrg         GLubyte *dst = dest;
4358848b8605Smrg         GLuint i;
4359848b8605Smrg         for (i = 0; i < n; i++) {
4360848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]);
4361848b8605Smrg            dst += dstComponents;
4362848b8605Smrg         }
4363848b8605Smrg      }
4364848b8605Smrg
4365848b8605Smrg      if (gDst >= 0) {
4366848b8605Smrg         GLubyte *dst = dest;
4367848b8605Smrg         GLuint i;
4368848b8605Smrg         for (i = 0; i < n; i++) {
4369848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]);
4370848b8605Smrg            dst += dstComponents;
4371848b8605Smrg         }
4372848b8605Smrg      }
4373848b8605Smrg
4374848b8605Smrg      if (bDst >= 0) {
4375848b8605Smrg         GLubyte *dst = dest;
4376848b8605Smrg         GLuint i;
4377848b8605Smrg         for (i = 0; i < n; i++) {
4378848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]);
4379848b8605Smrg            dst += dstComponents;
4380848b8605Smrg         }
4381848b8605Smrg      }
4382848b8605Smrg
4383848b8605Smrg      if (aDst >= 0) {
4384848b8605Smrg         GLubyte *dst = dest;
4385848b8605Smrg         GLuint i;
4386848b8605Smrg         for (i = 0; i < n; i++) {
4387848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]);
4388848b8605Smrg            dst += dstComponents;
4389848b8605Smrg         }
4390848b8605Smrg      }
4391848b8605Smrg
4392848b8605Smrg      if (iDst >= 0) {
4393848b8605Smrg         GLubyte *dst = dest;
4394848b8605Smrg         GLuint i;
4395848b8605Smrg         assert(iDst == 0);
4396848b8605Smrg         assert(dstComponents == 1);
4397848b8605Smrg         for (i = 0; i < n; i++) {
4398848b8605Smrg            /* Intensity comes from red channel */
4399848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]);
4400848b8605Smrg         }
4401848b8605Smrg      }
4402848b8605Smrg
4403848b8605Smrg      if (lDst >= 0) {
4404848b8605Smrg         GLubyte *dst = dest;
4405848b8605Smrg         GLuint i;
4406848b8605Smrg         assert(lDst == 0);
4407848b8605Smrg         for (i = 0; i < n; i++) {
4408848b8605Smrg            /* Luminance comes from red channel */
4409848b8605Smrg            CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]);
4410848b8605Smrg            dst += dstComponents;
4411848b8605Smrg         }
4412848b8605Smrg      }
4413848b8605Smrg
4414848b8605Smrg      free(rgba);
4415848b8605Smrg   }
4416848b8605Smrg}
4417848b8605Smrg
4418848b8605Smrg
4419848b8605Smrg/**
4420848b8605Smrg * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
4421848b8605Smrg * instead of GLubyte.
4422848b8605Smrg */
4423848b8605Smrgvoid
4424848b8605Smrg_mesa_unpack_color_span_float( struct gl_context *ctx,
4425848b8605Smrg                               GLuint n, GLenum dstFormat, GLfloat dest[],
4426848b8605Smrg                               GLenum srcFormat, GLenum srcType,
4427848b8605Smrg                               const GLvoid *source,
4428848b8605Smrg                               const struct gl_pixelstore_attrib *srcPacking,
4429848b8605Smrg                               GLbitfield transferOps )
4430848b8605Smrg{
4431848b8605Smrg   ASSERT(dstFormat == GL_ALPHA ||
4432848b8605Smrg          dstFormat == GL_LUMINANCE ||
4433848b8605Smrg          dstFormat == GL_LUMINANCE_ALPHA ||
4434848b8605Smrg          dstFormat == GL_INTENSITY ||
4435848b8605Smrg          dstFormat == GL_RED ||
4436848b8605Smrg          dstFormat == GL_RG ||
4437848b8605Smrg          dstFormat == GL_RGB ||
4438848b8605Smrg          dstFormat == GL_RGBA);
4439848b8605Smrg
4440848b8605Smrg   ASSERT(srcFormat == GL_RED ||
4441848b8605Smrg          srcFormat == GL_GREEN ||
4442848b8605Smrg          srcFormat == GL_BLUE ||
4443848b8605Smrg          srcFormat == GL_ALPHA ||
4444848b8605Smrg          srcFormat == GL_LUMINANCE ||
4445848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA ||
4446848b8605Smrg          srcFormat == GL_INTENSITY ||
4447848b8605Smrg          srcFormat == GL_RG ||
4448848b8605Smrg          srcFormat == GL_RGB ||
4449848b8605Smrg          srcFormat == GL_BGR ||
4450848b8605Smrg          srcFormat == GL_RGBA ||
4451848b8605Smrg          srcFormat == GL_BGRA ||
4452848b8605Smrg          srcFormat == GL_ABGR_EXT ||
4453848b8605Smrg          srcFormat == GL_RED_INTEGER_EXT ||
4454848b8605Smrg          srcFormat == GL_GREEN_INTEGER_EXT ||
4455848b8605Smrg          srcFormat == GL_BLUE_INTEGER_EXT ||
4456848b8605Smrg          srcFormat == GL_ALPHA_INTEGER_EXT ||
4457848b8605Smrg          srcFormat == GL_RG_INTEGER ||
4458848b8605Smrg          srcFormat == GL_RGB_INTEGER_EXT ||
4459848b8605Smrg          srcFormat == GL_RGBA_INTEGER_EXT ||
4460848b8605Smrg          srcFormat == GL_BGR_INTEGER_EXT ||
4461848b8605Smrg          srcFormat == GL_BGRA_INTEGER_EXT ||
4462848b8605Smrg          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
4463848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
4464848b8605Smrg          srcFormat == GL_COLOR_INDEX);
4465848b8605Smrg
4466848b8605Smrg   ASSERT(srcType == GL_BITMAP ||
4467848b8605Smrg          srcType == GL_UNSIGNED_BYTE ||
4468848b8605Smrg          srcType == GL_BYTE ||
4469848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
4470848b8605Smrg          srcType == GL_SHORT ||
4471848b8605Smrg          srcType == GL_UNSIGNED_INT ||
4472848b8605Smrg          srcType == GL_INT ||
4473848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
4474848b8605Smrg          srcType == GL_FLOAT ||
4475848b8605Smrg          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4476848b8605Smrg          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4477848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4478848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4479848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4480848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4481848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4482848b8605Smrg          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4483848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4484848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4485848b8605Smrg          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4486848b8605Smrg          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4487848b8605Smrg          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4488848b8605Smrg          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4489848b8605Smrg
4490848b8605Smrg   /* general solution, no special cases, yet */
4491848b8605Smrg   {
4492848b8605Smrg      GLint dstComponents;
4493848b8605Smrg      GLint rDst, gDst, bDst, aDst, lDst, iDst;
4494848b8605Smrg      GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat));
4495848b8605Smrg      GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat);
4496848b8605Smrg
4497848b8605Smrg      if (!rgba) {
4498848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4499848b8605Smrg         return;
4500848b8605Smrg      }
4501848b8605Smrg
4502848b8605Smrg      dstComponents = _mesa_components_in_format( dstFormat );
4503848b8605Smrg      /* source & dest image formats should have been error checked by now */
4504848b8605Smrg      assert(dstComponents > 0);
4505848b8605Smrg
4506848b8605Smrg      /* EXT_texture_integer specifies no transfer ops on integer
4507848b8605Smrg       * types in the resolved issues section. Just set them to 0
4508848b8605Smrg       * for integer surfaces.
4509848b8605Smrg       */
4510848b8605Smrg      if (intFormat)
4511848b8605Smrg         transferOps = 0;
4512848b8605Smrg
4513848b8605Smrg      /*
4514848b8605Smrg       * Extract image data and convert to RGBA floats
4515848b8605Smrg       */
4516848b8605Smrg      if (srcFormat == GL_COLOR_INDEX) {
4517848b8605Smrg         GLuint *indexes = malloc(n * sizeof(GLuint));
4518848b8605Smrg
4519848b8605Smrg         if (!indexes) {
4520848b8605Smrg            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4521848b8605Smrg            free(rgba);
4522848b8605Smrg            return;
4523848b8605Smrg         }
4524848b8605Smrg
4525848b8605Smrg         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
4526848b8605Smrg                              srcPacking);
4527848b8605Smrg
4528848b8605Smrg	 /* Convert indexes to RGBA */
4529848b8605Smrg	 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4530848b8605Smrg	    _mesa_shift_and_offset_ci(ctx, n, indexes);
4531848b8605Smrg	 }
4532848b8605Smrg	 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
4533848b8605Smrg
4534848b8605Smrg         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4535848b8605Smrg          * with color indexes.
4536848b8605Smrg          */
4537848b8605Smrg         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
4538848b8605Smrg
4539848b8605Smrg         free(indexes);
4540848b8605Smrg      }
4541848b8605Smrg      else {
4542848b8605Smrg         /* non-color index data */
4543848b8605Smrg         extract_float_rgba(n, rgba, srcFormat, srcType, source,
4544848b8605Smrg                            srcPacking->SwapBytes);
4545848b8605Smrg      }
4546848b8605Smrg
4547848b8605Smrg      if (transferOps) {
4548848b8605Smrg         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
4549848b8605Smrg      }
4550848b8605Smrg
4551848b8605Smrg      get_component_indexes(dstFormat,
4552848b8605Smrg                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4553848b8605Smrg
4554848b8605Smrg      /* Now pack results in the requested dstFormat */
4555848b8605Smrg      if (rDst >= 0) {
4556848b8605Smrg         GLfloat *dst = dest;
4557848b8605Smrg         GLuint i;
4558848b8605Smrg         for (i = 0; i < n; i++) {
4559848b8605Smrg            dst[rDst] = rgba[i][RCOMP];
4560848b8605Smrg            dst += dstComponents;
4561848b8605Smrg         }
4562848b8605Smrg      }
4563848b8605Smrg
4564848b8605Smrg      if (gDst >= 0) {
4565848b8605Smrg         GLfloat *dst = dest;
4566848b8605Smrg         GLuint i;
4567848b8605Smrg         for (i = 0; i < n; i++) {
4568848b8605Smrg            dst[gDst] = rgba[i][GCOMP];
4569848b8605Smrg            dst += dstComponents;
4570848b8605Smrg         }
4571848b8605Smrg      }
4572848b8605Smrg
4573848b8605Smrg      if (bDst >= 0) {
4574848b8605Smrg         GLfloat *dst = dest;
4575848b8605Smrg         GLuint i;
4576848b8605Smrg         for (i = 0; i < n; i++) {
4577848b8605Smrg            dst[bDst] = rgba[i][BCOMP];
4578848b8605Smrg            dst += dstComponents;
4579848b8605Smrg         }
4580848b8605Smrg      }
4581848b8605Smrg
4582848b8605Smrg      if (aDst >= 0) {
4583848b8605Smrg         GLfloat *dst = dest;
4584848b8605Smrg         GLuint i;
4585848b8605Smrg         for (i = 0; i < n; i++) {
4586848b8605Smrg            dst[aDst] = rgba[i][ACOMP];
4587848b8605Smrg            dst += dstComponents;
4588848b8605Smrg         }
4589848b8605Smrg      }
4590848b8605Smrg
4591848b8605Smrg      if (iDst >= 0) {
4592848b8605Smrg         GLfloat *dst = dest;
4593848b8605Smrg         GLuint i;
4594848b8605Smrg         assert(iDst == 0);
4595848b8605Smrg         assert(dstComponents == 1);
4596848b8605Smrg         for (i = 0; i < n; i++) {
4597848b8605Smrg            /* Intensity comes from red channel */
4598848b8605Smrg            dst[i] = rgba[i][RCOMP];
4599848b8605Smrg         }
4600848b8605Smrg      }
4601848b8605Smrg
4602848b8605Smrg      if (lDst >= 0) {
4603848b8605Smrg         GLfloat *dst = dest;
4604848b8605Smrg         GLuint i;
4605848b8605Smrg         assert(lDst == 0);
4606848b8605Smrg         for (i = 0; i < n; i++) {
4607848b8605Smrg            /* Luminance comes from red channel */
4608848b8605Smrg            dst[0] = rgba[i][RCOMP];
4609848b8605Smrg            dst += dstComponents;
4610848b8605Smrg         }
4611848b8605Smrg      }
4612848b8605Smrg
4613848b8605Smrg      free(rgba);
4614848b8605Smrg   }
4615848b8605Smrg}
4616848b8605Smrg
4617848b8605Smrg
4618848b8605Smrg/**
4619848b8605Smrg * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4620848b8605Smrg * instead of GLubyte.
4621848b8605Smrg * No pixel transfer ops are applied.
4622848b8605Smrg */
4623848b8605Smrgvoid
4624848b8605Smrg_mesa_unpack_color_span_uint(struct gl_context *ctx,
4625848b8605Smrg                             GLuint n, GLenum dstFormat, GLuint *dest,
4626848b8605Smrg                             GLenum srcFormat, GLenum srcType,
4627848b8605Smrg                             const GLvoid *source,
4628848b8605Smrg                             const struct gl_pixelstore_attrib *srcPacking)
4629848b8605Smrg{
4630848b8605Smrg   GLuint (*rgba)[4] = malloc(n * 4 * sizeof(GLfloat));
4631848b8605Smrg
4632848b8605Smrg   if (!rgba) {
4633848b8605Smrg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4634848b8605Smrg      return;
4635848b8605Smrg   }
4636848b8605Smrg
4637848b8605Smrg   ASSERT(dstFormat == GL_ALPHA ||
4638848b8605Smrg          dstFormat == GL_LUMINANCE ||
4639848b8605Smrg          dstFormat == GL_LUMINANCE_ALPHA ||
4640848b8605Smrg          dstFormat == GL_INTENSITY ||
4641848b8605Smrg          dstFormat == GL_RED ||
4642848b8605Smrg          dstFormat == GL_RG ||
4643848b8605Smrg          dstFormat == GL_RGB ||
4644848b8605Smrg          dstFormat == GL_RGBA);
4645848b8605Smrg
4646848b8605Smrg   ASSERT(srcFormat == GL_RED ||
4647848b8605Smrg          srcFormat == GL_GREEN ||
4648848b8605Smrg          srcFormat == GL_BLUE ||
4649848b8605Smrg          srcFormat == GL_ALPHA ||
4650848b8605Smrg          srcFormat == GL_LUMINANCE ||
4651848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA ||
4652848b8605Smrg          srcFormat == GL_INTENSITY ||
4653848b8605Smrg          srcFormat == GL_RG ||
4654848b8605Smrg          srcFormat == GL_RGB ||
4655848b8605Smrg          srcFormat == GL_BGR ||
4656848b8605Smrg          srcFormat == GL_RGBA ||
4657848b8605Smrg          srcFormat == GL_BGRA ||
4658848b8605Smrg          srcFormat == GL_ABGR_EXT ||
4659848b8605Smrg          srcFormat == GL_RED_INTEGER_EXT ||
4660848b8605Smrg          srcFormat == GL_GREEN_INTEGER_EXT ||
4661848b8605Smrg          srcFormat == GL_BLUE_INTEGER_EXT ||
4662848b8605Smrg          srcFormat == GL_ALPHA_INTEGER_EXT ||
4663848b8605Smrg          srcFormat == GL_RG_INTEGER ||
4664848b8605Smrg          srcFormat == GL_RGB_INTEGER_EXT ||
4665848b8605Smrg          srcFormat == GL_RGBA_INTEGER_EXT ||
4666848b8605Smrg          srcFormat == GL_BGR_INTEGER_EXT ||
4667848b8605Smrg          srcFormat == GL_BGRA_INTEGER_EXT ||
4668848b8605Smrg          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
4669848b8605Smrg          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
4670848b8605Smrg
4671848b8605Smrg   ASSERT(srcType == GL_UNSIGNED_BYTE ||
4672848b8605Smrg          srcType == GL_BYTE ||
4673848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
4674848b8605Smrg          srcType == GL_SHORT ||
4675848b8605Smrg          srcType == GL_UNSIGNED_INT ||
4676848b8605Smrg          srcType == GL_INT ||
4677848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
4678848b8605Smrg          srcType == GL_FLOAT ||
4679848b8605Smrg          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4680848b8605Smrg          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4681848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4682848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4683848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4684848b8605Smrg          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4685848b8605Smrg          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4686848b8605Smrg          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4687848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4688848b8605Smrg          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4689848b8605Smrg          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4690848b8605Smrg          srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4691848b8605Smrg          srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4692848b8605Smrg          srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4693848b8605Smrg
4694848b8605Smrg
4695848b8605Smrg   /* Extract image data as uint[4] pixels */
4696848b8605Smrg   extract_uint_rgba(n, rgba, srcFormat, srcType, source,
4697848b8605Smrg                     srcPacking->SwapBytes);
4698848b8605Smrg
4699848b8605Smrg   if (dstFormat == GL_RGBA) {
4700848b8605Smrg      /* simple case */
4701848b8605Smrg      memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
4702848b8605Smrg   }
4703848b8605Smrg   else {
4704848b8605Smrg      /* general case */
4705848b8605Smrg      GLint rDst, gDst, bDst, aDst, lDst, iDst;
4706848b8605Smrg      GLint dstComponents = _mesa_components_in_format( dstFormat );
4707848b8605Smrg
4708848b8605Smrg      assert(dstComponents > 0);
4709848b8605Smrg
4710848b8605Smrg      get_component_indexes(dstFormat,
4711848b8605Smrg                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4712848b8605Smrg
4713848b8605Smrg      /* Now pack values in the requested dest format */
4714848b8605Smrg      if (rDst >= 0) {
4715848b8605Smrg         GLuint *dst = dest;
4716848b8605Smrg         GLuint i;
4717848b8605Smrg         for (i = 0; i < n; i++) {
4718848b8605Smrg            dst[rDst] = rgba[i][RCOMP];
4719848b8605Smrg            dst += dstComponents;
4720848b8605Smrg         }
4721848b8605Smrg      }
4722848b8605Smrg
4723848b8605Smrg      if (gDst >= 0) {
4724848b8605Smrg         GLuint *dst = dest;
4725848b8605Smrg         GLuint i;
4726848b8605Smrg         for (i = 0; i < n; i++) {
4727848b8605Smrg            dst[gDst] = rgba[i][GCOMP];
4728848b8605Smrg            dst += dstComponents;
4729848b8605Smrg         }
4730848b8605Smrg      }
4731848b8605Smrg
4732848b8605Smrg      if (bDst >= 0) {
4733848b8605Smrg         GLuint *dst = dest;
4734848b8605Smrg         GLuint i;
4735848b8605Smrg         for (i = 0; i < n; i++) {
4736848b8605Smrg            dst[bDst] = rgba[i][BCOMP];
4737848b8605Smrg            dst += dstComponents;
4738848b8605Smrg         }
4739848b8605Smrg      }
4740848b8605Smrg
4741848b8605Smrg      if (aDst >= 0) {
4742848b8605Smrg         GLuint *dst = dest;
4743848b8605Smrg         GLuint i;
4744848b8605Smrg         for (i = 0; i < n; i++) {
4745848b8605Smrg            dst[aDst] = rgba[i][ACOMP];
4746848b8605Smrg            dst += dstComponents;
4747848b8605Smrg         }
4748848b8605Smrg      }
4749848b8605Smrg
4750848b8605Smrg      if (iDst >= 0) {
4751848b8605Smrg         GLuint *dst = dest;
4752848b8605Smrg         GLuint i;
4753848b8605Smrg         assert(iDst == 0);
4754848b8605Smrg         assert(dstComponents == 1);
4755848b8605Smrg         for (i = 0; i < n; i++) {
4756848b8605Smrg            /* Intensity comes from red channel */
4757848b8605Smrg            dst[i] = rgba[i][RCOMP];
4758848b8605Smrg         }
4759848b8605Smrg      }
4760848b8605Smrg
4761848b8605Smrg      if (lDst >= 0) {
4762848b8605Smrg         GLuint *dst = dest;
4763848b8605Smrg         GLuint i;
4764848b8605Smrg         assert(lDst == 0);
4765848b8605Smrg         for (i = 0; i < n; i++) {
4766848b8605Smrg            /* Luminance comes from red channel */
4767848b8605Smrg            dst[0] = rgba[i][RCOMP];
4768848b8605Smrg            dst += dstComponents;
4769848b8605Smrg         }
4770848b8605Smrg      }
4771848b8605Smrg   }
4772848b8605Smrg
4773848b8605Smrg   free(rgba);
4774848b8605Smrg}
4775848b8605Smrg
4776848b8605Smrg
4777848b8605Smrg/*
4778848b8605Smrg * Unpack a row of color index data from a client buffer according to
4779848b8605Smrg * the pixel unpacking parameters.
4780848b8605Smrg * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4781848b8605Smrg *
4782848b8605Smrg * Args:  ctx - the context
4783848b8605Smrg *        n - number of pixels
4784848b8605Smrg *        dstType - destination data type
4785848b8605Smrg *        dest - destination array
4786848b8605Smrg *        srcType - source pixel type
4787848b8605Smrg *        source - source data pointer
4788848b8605Smrg *        srcPacking - pixel unpacking parameters
4789848b8605Smrg *        transferOps - the pixel transfer operations to apply
4790848b8605Smrg */
4791848b8605Smrgvoid
4792848b8605Smrg_mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
4793848b8605Smrg                         GLenum dstType, GLvoid *dest,
4794848b8605Smrg                         GLenum srcType, const GLvoid *source,
4795848b8605Smrg                         const struct gl_pixelstore_attrib *srcPacking,
4796848b8605Smrg                         GLbitfield transferOps )
4797848b8605Smrg{
4798848b8605Smrg   ASSERT(srcType == GL_BITMAP ||
4799848b8605Smrg          srcType == GL_UNSIGNED_BYTE ||
4800848b8605Smrg          srcType == GL_BYTE ||
4801848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
4802848b8605Smrg          srcType == GL_SHORT ||
4803848b8605Smrg          srcType == GL_UNSIGNED_INT ||
4804848b8605Smrg          srcType == GL_INT ||
4805848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
4806848b8605Smrg          srcType == GL_FLOAT);
4807848b8605Smrg
4808848b8605Smrg   ASSERT(dstType == GL_UNSIGNED_BYTE ||
4809848b8605Smrg          dstType == GL_UNSIGNED_SHORT ||
4810848b8605Smrg          dstType == GL_UNSIGNED_INT);
4811848b8605Smrg
4812848b8605Smrg
4813848b8605Smrg   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4814848b8605Smrg
4815848b8605Smrg   /*
4816848b8605Smrg    * Try simple cases first
4817848b8605Smrg    */
4818848b8605Smrg   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
4819848b8605Smrg       && dstType == GL_UNSIGNED_BYTE) {
4820848b8605Smrg      memcpy(dest, source, n * sizeof(GLubyte));
4821848b8605Smrg   }
4822848b8605Smrg   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
4823848b8605Smrg            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
4824848b8605Smrg      memcpy(dest, source, n * sizeof(GLuint));
4825848b8605Smrg   }
4826848b8605Smrg   else {
4827848b8605Smrg      /*
4828848b8605Smrg       * general solution
4829848b8605Smrg       */
4830848b8605Smrg      GLuint *indexes = malloc(n * sizeof(GLuint));
4831848b8605Smrg
4832848b8605Smrg      if (!indexes) {
4833848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4834848b8605Smrg         return;
4835848b8605Smrg      }
4836848b8605Smrg
4837848b8605Smrg      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
4838848b8605Smrg                           srcPacking);
4839848b8605Smrg
4840848b8605Smrg      if (transferOps)
4841848b8605Smrg         _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4842848b8605Smrg
4843848b8605Smrg      /* convert to dest type */
4844848b8605Smrg      switch (dstType) {
4845848b8605Smrg         case GL_UNSIGNED_BYTE:
4846848b8605Smrg            {
4847848b8605Smrg               GLubyte *dst = (GLubyte *) dest;
4848848b8605Smrg               GLuint i;
4849848b8605Smrg               for (i = 0; i < n; i++) {
4850848b8605Smrg                  dst[i] = (GLubyte) (indexes[i] & 0xff);
4851848b8605Smrg               }
4852848b8605Smrg            }
4853848b8605Smrg            break;
4854848b8605Smrg         case GL_UNSIGNED_SHORT:
4855848b8605Smrg            {
4856848b8605Smrg               GLuint *dst = (GLuint *) dest;
4857848b8605Smrg               GLuint i;
4858848b8605Smrg               for (i = 0; i < n; i++) {
4859848b8605Smrg                  dst[i] = (GLushort) (indexes[i] & 0xffff);
4860848b8605Smrg               }
4861848b8605Smrg            }
4862848b8605Smrg            break;
4863848b8605Smrg         case GL_UNSIGNED_INT:
4864848b8605Smrg            memcpy(dest, indexes, n * sizeof(GLuint));
4865848b8605Smrg            break;
4866848b8605Smrg         default:
4867848b8605Smrg            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
4868848b8605Smrg      }
4869848b8605Smrg
4870848b8605Smrg      free(indexes);
4871848b8605Smrg   }
4872848b8605Smrg}
4873848b8605Smrg
4874848b8605Smrg
4875848b8605Smrgvoid
4876848b8605Smrg_mesa_pack_index_span( struct gl_context *ctx, GLuint n,
4877848b8605Smrg                       GLenum dstType, GLvoid *dest, const GLuint *source,
4878848b8605Smrg                       const struct gl_pixelstore_attrib *dstPacking,
4879848b8605Smrg                       GLbitfield transferOps )
4880848b8605Smrg{
4881848b8605Smrg   GLuint *indexes = malloc(n * sizeof(GLuint));
4882848b8605Smrg
4883848b8605Smrg   if (!indexes) {
4884848b8605Smrg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4885848b8605Smrg      return;
4886848b8605Smrg   }
4887848b8605Smrg
4888848b8605Smrg   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4889848b8605Smrg
4890848b8605Smrg   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
4891848b8605Smrg      /* make a copy of input */
4892848b8605Smrg      memcpy(indexes, source, n * sizeof(GLuint));
4893848b8605Smrg      _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4894848b8605Smrg      source = indexes;
4895848b8605Smrg   }
4896848b8605Smrg
4897848b8605Smrg   switch (dstType) {
4898848b8605Smrg   case GL_UNSIGNED_BYTE:
4899848b8605Smrg      {
4900848b8605Smrg         GLubyte *dst = (GLubyte *) dest;
4901848b8605Smrg         GLuint i;
4902848b8605Smrg         for (i = 0; i < n; i++) {
4903848b8605Smrg            *dst++ = (GLubyte) source[i];
4904848b8605Smrg         }
4905848b8605Smrg      }
4906848b8605Smrg      break;
4907848b8605Smrg   case GL_BYTE:
4908848b8605Smrg      {
4909848b8605Smrg         GLbyte *dst = (GLbyte *) dest;
4910848b8605Smrg         GLuint i;
4911848b8605Smrg         for (i = 0; i < n; i++) {
4912848b8605Smrg            dst[i] = (GLbyte) source[i];
4913848b8605Smrg         }
4914848b8605Smrg      }
4915848b8605Smrg      break;
4916848b8605Smrg   case GL_UNSIGNED_SHORT:
4917848b8605Smrg      {
4918848b8605Smrg         GLushort *dst = (GLushort *) dest;
4919848b8605Smrg         GLuint i;
4920848b8605Smrg         for (i = 0; i < n; i++) {
4921848b8605Smrg            dst[i] = (GLushort) source[i];
4922848b8605Smrg         }
4923848b8605Smrg         if (dstPacking->SwapBytes) {
4924848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
4925848b8605Smrg         }
4926848b8605Smrg      }
4927848b8605Smrg      break;
4928848b8605Smrg   case GL_SHORT:
4929848b8605Smrg      {
4930848b8605Smrg         GLshort *dst = (GLshort *) dest;
4931848b8605Smrg         GLuint i;
4932848b8605Smrg         for (i = 0; i < n; i++) {
4933848b8605Smrg            dst[i] = (GLshort) source[i];
4934848b8605Smrg         }
4935848b8605Smrg         if (dstPacking->SwapBytes) {
4936848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
4937848b8605Smrg         }
4938848b8605Smrg      }
4939848b8605Smrg      break;
4940848b8605Smrg   case GL_UNSIGNED_INT:
4941848b8605Smrg      {
4942848b8605Smrg         GLuint *dst = (GLuint *) dest;
4943848b8605Smrg         GLuint i;
4944848b8605Smrg         for (i = 0; i < n; i++) {
4945848b8605Smrg            dst[i] = (GLuint) source[i];
4946848b8605Smrg         }
4947848b8605Smrg         if (dstPacking->SwapBytes) {
4948848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
4949848b8605Smrg         }
4950848b8605Smrg      }
4951848b8605Smrg      break;
4952848b8605Smrg   case GL_INT:
4953848b8605Smrg      {
4954848b8605Smrg         GLint *dst = (GLint *) dest;
4955848b8605Smrg         GLuint i;
4956848b8605Smrg         for (i = 0; i < n; i++) {
4957848b8605Smrg            dst[i] = (GLint) source[i];
4958848b8605Smrg         }
4959848b8605Smrg         if (dstPacking->SwapBytes) {
4960848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
4961848b8605Smrg         }
4962848b8605Smrg      }
4963848b8605Smrg      break;
4964848b8605Smrg   case GL_FLOAT:
4965848b8605Smrg      {
4966848b8605Smrg         GLfloat *dst = (GLfloat *) dest;
4967848b8605Smrg         GLuint i;
4968848b8605Smrg         for (i = 0; i < n; i++) {
4969848b8605Smrg            dst[i] = (GLfloat) source[i];
4970848b8605Smrg         }
4971848b8605Smrg         if (dstPacking->SwapBytes) {
4972848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
4973848b8605Smrg         }
4974848b8605Smrg      }
4975848b8605Smrg      break;
4976848b8605Smrg   case GL_HALF_FLOAT_ARB:
4977848b8605Smrg      {
4978848b8605Smrg         GLhalfARB *dst = (GLhalfARB *) dest;
4979848b8605Smrg         GLuint i;
4980848b8605Smrg         for (i = 0; i < n; i++) {
4981848b8605Smrg            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
4982848b8605Smrg         }
4983848b8605Smrg         if (dstPacking->SwapBytes) {
4984848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
4985848b8605Smrg         }
4986848b8605Smrg      }
4987848b8605Smrg      break;
4988848b8605Smrg   default:
4989848b8605Smrg      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4990848b8605Smrg   }
4991848b8605Smrg
4992848b8605Smrg   free(indexes);
4993848b8605Smrg}
4994848b8605Smrg
4995848b8605Smrg
4996848b8605Smrg/*
4997848b8605Smrg * Unpack a row of stencil data from a client buffer according to
4998848b8605Smrg * the pixel unpacking parameters.
4999848b8605Smrg * This is (or will be) used by glDrawPixels
5000848b8605Smrg *
5001848b8605Smrg * Args:  ctx - the context
5002848b8605Smrg *        n - number of pixels
5003848b8605Smrg *        dstType - destination data type
5004848b8605Smrg *        dest - destination array
5005848b8605Smrg *        srcType - source pixel type
5006848b8605Smrg *        source - source data pointer
5007848b8605Smrg *        srcPacking - pixel unpacking parameters
5008848b8605Smrg *        transferOps - apply offset/bias/lookup ops?
5009848b8605Smrg */
5010848b8605Smrgvoid
5011848b8605Smrg_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
5012848b8605Smrg                           GLenum dstType, GLvoid *dest,
5013848b8605Smrg                           GLenum srcType, const GLvoid *source,
5014848b8605Smrg                           const struct gl_pixelstore_attrib *srcPacking,
5015848b8605Smrg                           GLbitfield transferOps )
5016848b8605Smrg{
5017848b8605Smrg   ASSERT(srcType == GL_BITMAP ||
5018848b8605Smrg          srcType == GL_UNSIGNED_BYTE ||
5019848b8605Smrg          srcType == GL_BYTE ||
5020848b8605Smrg          srcType == GL_UNSIGNED_SHORT ||
5021848b8605Smrg          srcType == GL_SHORT ||
5022848b8605Smrg          srcType == GL_UNSIGNED_INT ||
5023848b8605Smrg          srcType == GL_INT ||
5024848b8605Smrg          srcType == GL_UNSIGNED_INT_24_8_EXT ||
5025848b8605Smrg          srcType == GL_HALF_FLOAT_ARB ||
5026848b8605Smrg          srcType == GL_FLOAT ||
5027848b8605Smrg          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
5028848b8605Smrg
5029848b8605Smrg   ASSERT(dstType == GL_UNSIGNED_BYTE ||
5030848b8605Smrg          dstType == GL_UNSIGNED_SHORT ||
5031848b8605Smrg          dstType == GL_UNSIGNED_INT ||
5032848b8605Smrg          dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
5033848b8605Smrg
5034848b8605Smrg   /* only shift and offset apply to stencil */
5035848b8605Smrg   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
5036848b8605Smrg
5037848b8605Smrg   /*
5038848b8605Smrg    * Try simple cases first
5039848b8605Smrg    */
5040848b8605Smrg   if (transferOps == 0 &&
5041848b8605Smrg       !ctx->Pixel.MapStencilFlag &&
5042848b8605Smrg       srcType == GL_UNSIGNED_BYTE &&
5043848b8605Smrg       dstType == GL_UNSIGNED_BYTE) {
5044848b8605Smrg      memcpy(dest, source, n * sizeof(GLubyte));
5045848b8605Smrg   }
5046848b8605Smrg   else if (transferOps == 0 &&
5047848b8605Smrg            !ctx->Pixel.MapStencilFlag &&
5048848b8605Smrg            srcType == GL_UNSIGNED_INT &&
5049848b8605Smrg            dstType == GL_UNSIGNED_INT &&
5050848b8605Smrg            !srcPacking->SwapBytes) {
5051848b8605Smrg      memcpy(dest, source, n * sizeof(GLuint));
5052848b8605Smrg   }
5053848b8605Smrg   else {
5054848b8605Smrg      /*
5055848b8605Smrg       * general solution
5056848b8605Smrg       */
5057848b8605Smrg      GLuint *indexes = malloc(n * sizeof(GLuint));
5058848b8605Smrg
5059848b8605Smrg      if (!indexes) {
5060848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
5061848b8605Smrg         return;
5062848b8605Smrg      }
5063848b8605Smrg
5064848b8605Smrg      extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
5065848b8605Smrg                           srcPacking);
5066848b8605Smrg
5067848b8605Smrg      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
5068848b8605Smrg         /* shift and offset indexes */
5069848b8605Smrg         _mesa_shift_and_offset_ci(ctx, n, indexes);
5070848b8605Smrg      }
5071848b8605Smrg
5072848b8605Smrg      if (ctx->Pixel.MapStencilFlag) {
5073848b8605Smrg         /* Apply stencil lookup table */
5074848b8605Smrg         const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
5075848b8605Smrg         GLuint i;
5076848b8605Smrg         for (i = 0; i < n; i++) {
5077848b8605Smrg            indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
5078848b8605Smrg         }
5079848b8605Smrg      }
5080848b8605Smrg
5081848b8605Smrg      /* convert to dest type */
5082848b8605Smrg      switch (dstType) {
5083848b8605Smrg         case GL_UNSIGNED_BYTE:
5084848b8605Smrg            {
5085848b8605Smrg               GLubyte *dst = (GLubyte *) dest;
5086848b8605Smrg               GLuint i;
5087848b8605Smrg               for (i = 0; i < n; i++) {
5088848b8605Smrg                  dst[i] = (GLubyte) (indexes[i] & 0xff);
5089848b8605Smrg               }
5090848b8605Smrg            }
5091848b8605Smrg            break;
5092848b8605Smrg         case GL_UNSIGNED_SHORT:
5093848b8605Smrg            {
5094848b8605Smrg               GLuint *dst = (GLuint *) dest;
5095848b8605Smrg               GLuint i;
5096848b8605Smrg               for (i = 0; i < n; i++) {
5097848b8605Smrg                  dst[i] = (GLushort) (indexes[i] & 0xffff);
5098848b8605Smrg               }
5099848b8605Smrg            }
5100848b8605Smrg            break;
5101848b8605Smrg         case GL_UNSIGNED_INT:
5102848b8605Smrg            memcpy(dest, indexes, n * sizeof(GLuint));
5103848b8605Smrg            break;
5104848b8605Smrg         case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5105848b8605Smrg            {
5106848b8605Smrg               GLuint *dst = (GLuint *) dest;
5107848b8605Smrg               GLuint i;
5108848b8605Smrg               for (i = 0; i < n; i++) {
5109848b8605Smrg                  dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */
5110848b8605Smrg               }
5111848b8605Smrg            }
5112848b8605Smrg            break;
5113848b8605Smrg         default:
5114848b8605Smrg            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
5115848b8605Smrg      }
5116848b8605Smrg
5117848b8605Smrg      free(indexes);
5118848b8605Smrg   }
5119848b8605Smrg}
5120848b8605Smrg
5121848b8605Smrg
5122848b8605Smrgvoid
5123848b8605Smrg_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
5124848b8605Smrg                         GLenum dstType, GLvoid *dest, const GLubyte *source,
5125848b8605Smrg                         const struct gl_pixelstore_attrib *dstPacking )
5126848b8605Smrg{
5127848b8605Smrg   GLubyte *stencil = malloc(n * sizeof(GLubyte));
5128848b8605Smrg
5129848b8605Smrg   if (!stencil) {
5130848b8605Smrg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
5131848b8605Smrg      return;
5132848b8605Smrg   }
5133848b8605Smrg
5134848b8605Smrg   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
5135848b8605Smrg       ctx->Pixel.MapStencilFlag) {
5136848b8605Smrg      /* make a copy of input */
5137848b8605Smrg      memcpy(stencil, source, n * sizeof(GLubyte));
5138848b8605Smrg      _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
5139848b8605Smrg      source = stencil;
5140848b8605Smrg   }
5141848b8605Smrg
5142848b8605Smrg   switch (dstType) {
5143848b8605Smrg   case GL_UNSIGNED_BYTE:
5144848b8605Smrg      memcpy(dest, source, n);
5145848b8605Smrg      break;
5146848b8605Smrg   case GL_BYTE:
5147848b8605Smrg      {
5148848b8605Smrg         GLbyte *dst = (GLbyte *) dest;
5149848b8605Smrg         GLuint i;
5150848b8605Smrg         for (i=0;i<n;i++) {
5151848b8605Smrg            dst[i] = (GLbyte) (source[i] & 0x7f);
5152848b8605Smrg         }
5153848b8605Smrg      }
5154848b8605Smrg      break;
5155848b8605Smrg   case GL_UNSIGNED_SHORT:
5156848b8605Smrg      {
5157848b8605Smrg         GLushort *dst = (GLushort *) dest;
5158848b8605Smrg         GLuint i;
5159848b8605Smrg         for (i=0;i<n;i++) {
5160848b8605Smrg            dst[i] = (GLushort) source[i];
5161848b8605Smrg         }
5162848b8605Smrg         if (dstPacking->SwapBytes) {
5163848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5164848b8605Smrg         }
5165848b8605Smrg      }
5166848b8605Smrg      break;
5167848b8605Smrg   case GL_SHORT:
5168848b8605Smrg      {
5169848b8605Smrg         GLshort *dst = (GLshort *) dest;
5170848b8605Smrg         GLuint i;
5171848b8605Smrg         for (i=0;i<n;i++) {
5172848b8605Smrg            dst[i] = (GLshort) source[i];
5173848b8605Smrg         }
5174848b8605Smrg         if (dstPacking->SwapBytes) {
5175848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5176848b8605Smrg         }
5177848b8605Smrg      }
5178848b8605Smrg      break;
5179848b8605Smrg   case GL_UNSIGNED_INT:
5180848b8605Smrg      {
5181848b8605Smrg         GLuint *dst = (GLuint *) dest;
5182848b8605Smrg         GLuint i;
5183848b8605Smrg         for (i=0;i<n;i++) {
5184848b8605Smrg            dst[i] = (GLuint) source[i];
5185848b8605Smrg         }
5186848b8605Smrg         if (dstPacking->SwapBytes) {
5187848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5188848b8605Smrg         }
5189848b8605Smrg      }
5190848b8605Smrg      break;
5191848b8605Smrg   case GL_INT:
5192848b8605Smrg      {
5193848b8605Smrg         GLint *dst = (GLint *) dest;
5194848b8605Smrg         GLuint i;
5195848b8605Smrg         for (i=0;i<n;i++) {
5196848b8605Smrg            dst[i] = (GLint) source[i];
5197848b8605Smrg         }
5198848b8605Smrg         if (dstPacking->SwapBytes) {
5199848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5200848b8605Smrg         }
5201848b8605Smrg      }
5202848b8605Smrg      break;
5203848b8605Smrg   case GL_FLOAT:
5204848b8605Smrg      {
5205848b8605Smrg         GLfloat *dst = (GLfloat *) dest;
5206848b8605Smrg         GLuint i;
5207848b8605Smrg         for (i=0;i<n;i++) {
5208848b8605Smrg            dst[i] = (GLfloat) source[i];
5209848b8605Smrg         }
5210848b8605Smrg         if (dstPacking->SwapBytes) {
5211848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5212848b8605Smrg         }
5213848b8605Smrg      }
5214848b8605Smrg      break;
5215848b8605Smrg   case GL_HALF_FLOAT_ARB:
5216848b8605Smrg      {
5217848b8605Smrg         GLhalfARB *dst = (GLhalfARB *) dest;
5218848b8605Smrg         GLuint i;
5219848b8605Smrg         for (i=0;i<n;i++) {
5220848b8605Smrg            dst[i] = _mesa_float_to_half( (float) source[i] );
5221848b8605Smrg         }
5222848b8605Smrg         if (dstPacking->SwapBytes) {
5223848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5224848b8605Smrg         }
5225848b8605Smrg      }
5226848b8605Smrg      break;
5227848b8605Smrg   case GL_BITMAP:
5228848b8605Smrg      if (dstPacking->LsbFirst) {
5229848b8605Smrg         GLubyte *dst = (GLubyte *) dest;
5230848b8605Smrg         GLint shift = 0;
5231848b8605Smrg         GLuint i;
5232848b8605Smrg         for (i = 0; i < n; i++) {
5233848b8605Smrg            if (shift == 0)
5234848b8605Smrg               *dst = 0;
5235848b8605Smrg            *dst |= ((source[i] != 0) << shift);
5236848b8605Smrg            shift++;
5237848b8605Smrg            if (shift == 8) {
5238848b8605Smrg               shift = 0;
5239848b8605Smrg               dst++;
5240848b8605Smrg            }
5241848b8605Smrg         }
5242848b8605Smrg      }
5243848b8605Smrg      else {
5244848b8605Smrg         GLubyte *dst = (GLubyte *) dest;
5245848b8605Smrg         GLint shift = 7;
5246848b8605Smrg         GLuint i;
5247848b8605Smrg         for (i = 0; i < n; i++) {
5248848b8605Smrg            if (shift == 7)
5249848b8605Smrg               *dst = 0;
5250848b8605Smrg            *dst |= ((source[i] != 0) << shift);
5251848b8605Smrg            shift--;
5252848b8605Smrg            if (shift < 0) {
5253848b8605Smrg               shift = 7;
5254848b8605Smrg               dst++;
5255848b8605Smrg            }
5256848b8605Smrg         }
5257848b8605Smrg      }
5258848b8605Smrg      break;
5259848b8605Smrg   default:
5260848b8605Smrg      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
5261848b8605Smrg   }
5262848b8605Smrg
5263848b8605Smrg   free(stencil);
5264848b8605Smrg}
5265848b8605Smrg
5266848b8605Smrg#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
5267848b8605Smrg    do {                                                                \
5268848b8605Smrg        GLuint i;                                                       \
5269848b8605Smrg        const GLTYPE *src = (const GLTYPE *)source;                     \
5270848b8605Smrg        for (i = 0; i < n; i++) {                                       \
5271848b8605Smrg            GLTYPE value = src[i];                                      \
5272848b8605Smrg            if (srcPacking->SwapBytes) {                                \
5273848b8605Smrg                if (sizeof(GLTYPE) == 2) {                              \
5274848b8605Smrg                    SWAP2BYTE(value);                                   \
5275848b8605Smrg                } else if (sizeof(GLTYPE) == 4) {                       \
5276848b8605Smrg                    SWAP4BYTE(value);                                   \
5277848b8605Smrg                }                                                       \
5278848b8605Smrg            }                                                           \
5279848b8605Smrg            depthValues[i] = GLTYPE2FLOAT(value);                       \
5280848b8605Smrg        }                                                               \
5281848b8605Smrg    } while (0)
5282848b8605Smrg
5283848b8605Smrg
5284848b8605Smrg/**
5285848b8605Smrg * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5286848b8605Smrg * or GLfloat values.
5287848b8605Smrg * The glPixelTransfer (scale/bias) params will be applied.
5288848b8605Smrg *
5289848b8605Smrg * \param dstType  one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5290848b8605Smrg * \param depthMax  max value for returned GLushort or GLuint values
5291848b8605Smrg *                  (ignored for GLfloat).
5292848b8605Smrg */
5293848b8605Smrgvoid
5294848b8605Smrg_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
5295848b8605Smrg                         GLenum dstType, GLvoid *dest, GLuint depthMax,
5296848b8605Smrg                         GLenum srcType, const GLvoid *source,
5297848b8605Smrg                         const struct gl_pixelstore_attrib *srcPacking )
5298848b8605Smrg{
5299848b8605Smrg   GLfloat *depthTemp = NULL, *depthValues;
5300848b8605Smrg   GLboolean needClamp = GL_FALSE;
5301848b8605Smrg
5302848b8605Smrg   /* Look for special cases first.
5303848b8605Smrg    * Not only are these faster, they're less prone to numeric conversion
5304848b8605Smrg    * problems.  Otherwise, converting from an int type to a float then
5305848b8605Smrg    * back to an int type can introduce errors that will show up as
5306848b8605Smrg    * artifacts in things like depth peeling which uses glCopyTexImage.
5307848b8605Smrg    */
5308848b8605Smrg   if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
5309848b8605Smrg      if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
5310848b8605Smrg         const GLuint *src = (const GLuint *) source;
5311848b8605Smrg         GLushort *dst = (GLushort *) dest;
5312848b8605Smrg         GLuint i;
5313848b8605Smrg         for (i = 0; i < n; i++) {
5314848b8605Smrg            dst[i] = src[i] >> 16;
5315848b8605Smrg         }
5316848b8605Smrg         return;
5317848b8605Smrg      }
5318848b8605Smrg      if (srcType == GL_UNSIGNED_SHORT
5319848b8605Smrg          && dstType == GL_UNSIGNED_INT
5320848b8605Smrg          && depthMax == 0xffffffff) {
5321848b8605Smrg         const GLushort *src = (const GLushort *) source;
5322848b8605Smrg         GLuint *dst = (GLuint *) dest;
5323848b8605Smrg         GLuint i;
5324848b8605Smrg         for (i = 0; i < n; i++) {
5325848b8605Smrg            dst[i] = src[i] | (src[i] << 16);
5326848b8605Smrg         }
5327848b8605Smrg         return;
5328848b8605Smrg      }
5329848b8605Smrg      if (srcType == GL_UNSIGNED_INT_24_8
5330848b8605Smrg          && dstType == GL_UNSIGNED_INT
5331848b8605Smrg          && depthMax == 0xffffff) {
5332848b8605Smrg         const GLuint *src = (const GLuint *) source;
5333848b8605Smrg         GLuint *dst = (GLuint *) dest;
5334848b8605Smrg         GLuint i;
5335848b8605Smrg         for (i = 0; i < n; i++) {
5336848b8605Smrg            dst[i] = src[i] >> 8;
5337848b8605Smrg         }
5338848b8605Smrg         return;
5339848b8605Smrg      }
5340848b8605Smrg      /* XXX may want to add additional cases here someday */
5341848b8605Smrg   }
5342848b8605Smrg
5343848b8605Smrg   /* general case path follows */
5344848b8605Smrg
5345848b8605Smrg   if (dstType == GL_FLOAT) {
5346848b8605Smrg      depthValues = (GLfloat *) dest;
5347848b8605Smrg   }
5348848b8605Smrg   else {
5349848b8605Smrg      depthTemp = malloc(n * sizeof(GLfloat));
5350848b8605Smrg      if (!depthTemp) {
5351848b8605Smrg         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
5352848b8605Smrg         return;
5353848b8605Smrg      }
5354848b8605Smrg
5355848b8605Smrg      depthValues = depthTemp;
5356848b8605Smrg   }
5357848b8605Smrg
5358848b8605Smrg   /* Convert incoming values to GLfloat.  Some conversions will require
5359848b8605Smrg    * clamping, below.
5360848b8605Smrg    */
5361848b8605Smrg   switch (srcType) {
5362848b8605Smrg      case GL_BYTE:
5363848b8605Smrg         DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ);
5364848b8605Smrg         needClamp = GL_TRUE;
5365848b8605Smrg         break;
5366848b8605Smrg      case GL_UNSIGNED_BYTE:
5367848b8605Smrg         DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
5368848b8605Smrg         break;
5369848b8605Smrg      case GL_SHORT:
5370848b8605Smrg         DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ);
5371848b8605Smrg         needClamp = GL_TRUE;
5372848b8605Smrg         break;
5373848b8605Smrg      case GL_UNSIGNED_SHORT:
5374848b8605Smrg         DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
5375848b8605Smrg         break;
5376848b8605Smrg      case GL_INT:
5377848b8605Smrg         DEPTH_VALUES(GLint, INT_TO_FLOAT);
5378848b8605Smrg         needClamp = GL_TRUE;
5379848b8605Smrg         break;
5380848b8605Smrg      case GL_UNSIGNED_INT:
5381848b8605Smrg         DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
5382848b8605Smrg         break;
5383848b8605Smrg      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
5384848b8605Smrg         if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
5385848b8605Smrg             depthMax == 0xffffff &&
5386848b8605Smrg             ctx->Pixel.DepthScale == 1.0 &&
5387848b8605Smrg             ctx->Pixel.DepthBias == 0.0) {
5388848b8605Smrg            const GLuint *src = (const GLuint *) source;
5389848b8605Smrg            GLuint *zValues = (GLuint *) dest;
5390848b8605Smrg            GLuint i;
5391848b8605Smrg            for (i = 0; i < n; i++) {
5392848b8605Smrg                GLuint value = src[i];
5393848b8605Smrg                if (srcPacking->SwapBytes) {
5394848b8605Smrg                    SWAP4BYTE(value);
5395848b8605Smrg                }
5396848b8605Smrg                zValues[i] = value & 0xffffff00;
5397848b8605Smrg            }
5398848b8605Smrg            free(depthTemp);
5399848b8605Smrg            return;
5400848b8605Smrg         }
5401848b8605Smrg         else {
5402848b8605Smrg            const GLuint *src = (const GLuint *) source;
5403848b8605Smrg            const GLfloat scale = 1.0f / 0xffffff;
5404848b8605Smrg            GLuint i;
5405848b8605Smrg            for (i = 0; i < n; i++) {
5406848b8605Smrg                GLuint value = src[i];
5407848b8605Smrg                if (srcPacking->SwapBytes) {
5408848b8605Smrg                    SWAP4BYTE(value);
5409848b8605Smrg                }
5410848b8605Smrg                depthValues[i] = (value >> 8) * scale;
5411848b8605Smrg            }
5412848b8605Smrg         }
5413848b8605Smrg         break;
5414848b8605Smrg      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5415848b8605Smrg         {
5416848b8605Smrg            GLuint i;
5417848b8605Smrg            const GLfloat *src = (const GLfloat *)source;
5418848b8605Smrg            for (i = 0; i < n; i++) {
5419848b8605Smrg               GLfloat value = src[i * 2];
5420848b8605Smrg               if (srcPacking->SwapBytes) {
5421848b8605Smrg                  SWAP4BYTE(value);
5422848b8605Smrg               }
5423848b8605Smrg               depthValues[i] = value;
5424848b8605Smrg            }
5425848b8605Smrg            needClamp = GL_TRUE;
5426848b8605Smrg         }
5427848b8605Smrg         break;
5428848b8605Smrg      case GL_FLOAT:
5429848b8605Smrg         DEPTH_VALUES(GLfloat, 1*);
5430848b8605Smrg         needClamp = GL_TRUE;
5431848b8605Smrg         break;
5432848b8605Smrg      case GL_HALF_FLOAT_ARB:
5433848b8605Smrg         {
5434848b8605Smrg            GLuint i;
5435848b8605Smrg            const GLhalfARB *src = (const GLhalfARB *) source;
5436848b8605Smrg            for (i = 0; i < n; i++) {
5437848b8605Smrg               GLhalfARB value = src[i];
5438848b8605Smrg               if (srcPacking->SwapBytes) {
5439848b8605Smrg                  SWAP2BYTE(value);
5440848b8605Smrg               }
5441848b8605Smrg               depthValues[i] = _mesa_half_to_float(value);
5442848b8605Smrg            }
5443848b8605Smrg            needClamp = GL_TRUE;
5444848b8605Smrg         }
5445848b8605Smrg         break;
5446848b8605Smrg      default:
5447848b8605Smrg         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
5448848b8605Smrg         free(depthTemp);
5449848b8605Smrg         return;
5450848b8605Smrg   }
5451848b8605Smrg
5452848b8605Smrg   /* apply depth scale and bias */
5453848b8605Smrg   {
5454848b8605Smrg      const GLfloat scale = ctx->Pixel.DepthScale;
5455848b8605Smrg      const GLfloat bias = ctx->Pixel.DepthBias;
5456848b8605Smrg      if (scale != 1.0 || bias != 0.0) {
5457848b8605Smrg         GLuint i;
5458848b8605Smrg         for (i = 0; i < n; i++) {
5459848b8605Smrg            depthValues[i] = depthValues[i] * scale + bias;
5460848b8605Smrg         }
5461848b8605Smrg         needClamp = GL_TRUE;
5462848b8605Smrg      }
5463848b8605Smrg   }
5464848b8605Smrg
5465848b8605Smrg   /* clamp to [0, 1] */
5466848b8605Smrg   if (needClamp) {
5467848b8605Smrg      GLuint i;
5468848b8605Smrg      for (i = 0; i < n; i++) {
5469848b8605Smrg         depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
5470848b8605Smrg      }
5471848b8605Smrg   }
5472848b8605Smrg
5473848b8605Smrg   /*
5474848b8605Smrg    * Convert values to dstType
5475848b8605Smrg    */
5476848b8605Smrg   if (dstType == GL_UNSIGNED_INT) {
5477848b8605Smrg      GLuint *zValues = (GLuint *) dest;
5478848b8605Smrg      GLuint i;
5479848b8605Smrg      if (depthMax <= 0xffffff) {
5480848b8605Smrg         /* no overflow worries */
5481848b8605Smrg         for (i = 0; i < n; i++) {
5482848b8605Smrg            zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
5483848b8605Smrg         }
5484848b8605Smrg      }
5485848b8605Smrg      else {
5486848b8605Smrg         /* need to use double precision to prevent overflow problems */
5487848b8605Smrg         for (i = 0; i < n; i++) {
5488848b8605Smrg            GLdouble z = depthValues[i] * (GLdouble) depthMax;
5489848b8605Smrg            if (z >= (GLdouble) 0xffffffff)
5490848b8605Smrg               zValues[i] = 0xffffffff;
5491848b8605Smrg            else
5492848b8605Smrg               zValues[i] = (GLuint) z;
5493848b8605Smrg         }
5494848b8605Smrg      }
5495848b8605Smrg   }
5496848b8605Smrg   else if (dstType == GL_UNSIGNED_SHORT) {
5497848b8605Smrg      GLushort *zValues = (GLushort *) dest;
5498848b8605Smrg      GLuint i;
5499848b8605Smrg      ASSERT(depthMax <= 0xffff);
5500848b8605Smrg      for (i = 0; i < n; i++) {
5501848b8605Smrg         zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
5502848b8605Smrg      }
5503848b8605Smrg   }
5504848b8605Smrg   else if (dstType == GL_FLOAT) {
5505848b8605Smrg      /* Nothing to do. depthValues is pointing to dest. */
5506848b8605Smrg   }
5507848b8605Smrg   else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
5508848b8605Smrg      GLfloat *zValues = (GLfloat*) dest;
5509848b8605Smrg      GLuint i;
5510848b8605Smrg      for (i = 0; i < n; i++) {
5511848b8605Smrg         zValues[i*2] = depthValues[i];
5512848b8605Smrg      }
5513848b8605Smrg   }
5514848b8605Smrg   else {
5515848b8605Smrg      ASSERT(0);
5516848b8605Smrg   }
5517848b8605Smrg
5518848b8605Smrg   free(depthTemp);
5519848b8605Smrg}
5520848b8605Smrg
5521848b8605Smrg
5522848b8605Smrg/*
5523848b8605Smrg * Pack an array of depth values.  The values are floats in [0,1].
5524848b8605Smrg */
5525848b8605Smrgvoid
5526848b8605Smrg_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
5527848b8605Smrg                       GLenum dstType, const GLfloat *depthSpan,
5528848b8605Smrg                       const struct gl_pixelstore_attrib *dstPacking )
5529848b8605Smrg{
5530848b8605Smrg   GLfloat *depthCopy = malloc(n * sizeof(GLfloat));
5531848b8605Smrg   if (!depthCopy) {
5532848b8605Smrg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
5533848b8605Smrg      return;
5534848b8605Smrg   }
5535848b8605Smrg
5536848b8605Smrg   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5537848b8605Smrg      memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
5538848b8605Smrg      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5539848b8605Smrg      depthSpan = depthCopy;
5540848b8605Smrg   }
5541848b8605Smrg
5542848b8605Smrg   switch (dstType) {
5543848b8605Smrg   case GL_UNSIGNED_BYTE:
5544848b8605Smrg      {
5545848b8605Smrg         GLubyte *dst = (GLubyte *) dest;
5546848b8605Smrg         GLuint i;
5547848b8605Smrg         for (i = 0; i < n; i++) {
5548848b8605Smrg            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
5549848b8605Smrg         }
5550848b8605Smrg      }
5551848b8605Smrg      break;
5552848b8605Smrg   case GL_BYTE:
5553848b8605Smrg      {
5554848b8605Smrg         GLbyte *dst = (GLbyte *) dest;
5555848b8605Smrg         GLuint i;
5556848b8605Smrg         for (i = 0; i < n; i++) {
5557848b8605Smrg            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
5558848b8605Smrg         }
5559848b8605Smrg      }
5560848b8605Smrg      break;
5561848b8605Smrg   case GL_UNSIGNED_SHORT:
5562848b8605Smrg      {
5563848b8605Smrg         GLushort *dst = (GLushort *) dest;
5564848b8605Smrg         GLuint i;
5565848b8605Smrg         for (i = 0; i < n; i++) {
5566848b8605Smrg            CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
5567848b8605Smrg         }
5568848b8605Smrg         if (dstPacking->SwapBytes) {
5569848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5570848b8605Smrg         }
5571848b8605Smrg      }
5572848b8605Smrg      break;
5573848b8605Smrg   case GL_SHORT:
5574848b8605Smrg      {
5575848b8605Smrg         GLshort *dst = (GLshort *) dest;
5576848b8605Smrg         GLuint i;
5577848b8605Smrg         for (i = 0; i < n; i++) {
5578848b8605Smrg            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
5579848b8605Smrg         }
5580848b8605Smrg         if (dstPacking->SwapBytes) {
5581848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5582848b8605Smrg         }
5583848b8605Smrg      }
5584848b8605Smrg      break;
5585848b8605Smrg   case GL_UNSIGNED_INT:
5586848b8605Smrg      {
5587848b8605Smrg         GLuint *dst = (GLuint *) dest;
5588848b8605Smrg         GLuint i;
5589848b8605Smrg         for (i = 0; i < n; i++) {
5590848b8605Smrg            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
5591848b8605Smrg         }
5592848b8605Smrg         if (dstPacking->SwapBytes) {
5593848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5594848b8605Smrg         }
5595848b8605Smrg      }
5596848b8605Smrg      break;
5597848b8605Smrg   case GL_INT:
5598848b8605Smrg      {
5599848b8605Smrg         GLint *dst = (GLint *) dest;
5600848b8605Smrg         GLuint i;
5601848b8605Smrg         for (i = 0; i < n; i++) {
5602848b8605Smrg            dst[i] = FLOAT_TO_INT( depthSpan[i] );
5603848b8605Smrg         }
5604848b8605Smrg         if (dstPacking->SwapBytes) {
5605848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5606848b8605Smrg         }
5607848b8605Smrg      }
5608848b8605Smrg      break;
5609848b8605Smrg   case GL_FLOAT:
5610848b8605Smrg      {
5611848b8605Smrg         GLfloat *dst = (GLfloat *) dest;
5612848b8605Smrg         GLuint i;
5613848b8605Smrg         for (i = 0; i < n; i++) {
5614848b8605Smrg            dst[i] = depthSpan[i];
5615848b8605Smrg         }
5616848b8605Smrg         if (dstPacking->SwapBytes) {
5617848b8605Smrg            _mesa_swap4( (GLuint *) dst, n );
5618848b8605Smrg         }
5619848b8605Smrg      }
5620848b8605Smrg      break;
5621848b8605Smrg   case GL_HALF_FLOAT_ARB:
5622848b8605Smrg      {
5623848b8605Smrg         GLhalfARB *dst = (GLhalfARB *) dest;
5624848b8605Smrg         GLuint i;
5625848b8605Smrg         for (i = 0; i < n; i++) {
5626848b8605Smrg            dst[i] = _mesa_float_to_half(depthSpan[i]);
5627848b8605Smrg         }
5628848b8605Smrg         if (dstPacking->SwapBytes) {
5629848b8605Smrg            _mesa_swap2( (GLushort *) dst, n );
5630848b8605Smrg         }
5631848b8605Smrg      }
5632848b8605Smrg      break;
5633848b8605Smrg   default:
5634848b8605Smrg      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
5635848b8605Smrg   }
5636848b8605Smrg
5637848b8605Smrg   free(depthCopy);
5638848b8605Smrg}
5639848b8605Smrg
5640848b8605Smrg
5641848b8605Smrg
5642848b8605Smrg/**
5643848b8605Smrg * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5644848b8605Smrg */
5645848b8605Smrgvoid
5646848b8605Smrg_mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n,
5647848b8605Smrg                              GLenum dstType, GLuint *dest,
5648848b8605Smrg                              const GLfloat *depthVals,
5649848b8605Smrg                              const GLubyte *stencilVals,
5650848b8605Smrg                              const struct gl_pixelstore_attrib *dstPacking)
5651848b8605Smrg{
5652848b8605Smrg   GLfloat *depthCopy = malloc(n * sizeof(GLfloat));
5653848b8605Smrg   GLubyte *stencilCopy = malloc(n * sizeof(GLubyte));
5654848b8605Smrg   GLuint i;
5655848b8605Smrg
5656848b8605Smrg   if (!depthCopy || !stencilCopy) {
5657848b8605Smrg      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
5658848b8605Smrg      free(depthCopy);
5659848b8605Smrg      free(stencilCopy);
5660848b8605Smrg      return;
5661848b8605Smrg   }
5662848b8605Smrg
5663848b8605Smrg   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5664848b8605Smrg      memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
5665848b8605Smrg      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5666848b8605Smrg      depthVals = depthCopy;
5667848b8605Smrg   }
5668848b8605Smrg
5669848b8605Smrg   if (ctx->Pixel.IndexShift ||
5670848b8605Smrg       ctx->Pixel.IndexOffset ||
5671848b8605Smrg       ctx->Pixel.MapStencilFlag) {
5672848b8605Smrg      memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte));
5673848b8605Smrg      _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
5674848b8605Smrg      stencilVals = stencilCopy;
5675848b8605Smrg   }
5676848b8605Smrg
5677848b8605Smrg   switch (dstType) {
5678848b8605Smrg   case GL_UNSIGNED_INT_24_8:
5679848b8605Smrg      for (i = 0; i < n; i++) {
5680848b8605Smrg         GLuint z = (GLuint) (depthVals[i] * 0xffffff);
5681848b8605Smrg         dest[i] = (z << 8) | (stencilVals[i] & 0xff);
5682848b8605Smrg      }
5683848b8605Smrg      break;
5684848b8605Smrg   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5685848b8605Smrg      for (i = 0; i < n; i++) {
5686848b8605Smrg         ((GLfloat*)dest)[i*2] = depthVals[i];
5687848b8605Smrg         dest[i*2+1] = stencilVals[i] & 0xff;
5688848b8605Smrg      }
5689848b8605Smrg      break;
5690848b8605Smrg   }
5691848b8605Smrg
5692848b8605Smrg   if (dstPacking->SwapBytes) {
5693848b8605Smrg      _mesa_swap4(dest, n);
5694848b8605Smrg   }
5695848b8605Smrg
5696848b8605Smrg   free(depthCopy);
5697848b8605Smrg   free(stencilCopy);
5698848b8605Smrg}
5699848b8605Smrg
5700848b8605Smrg
5701848b8605Smrg
5702848b8605Smrg
5703848b8605Smrg/**
5704848b8605Smrg * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
5705848b8605Smrg * Return all image data in a contiguous block.  This is used when we
5706848b8605Smrg * compile glDrawPixels, glTexImage, etc into a display list.  We
5707848b8605Smrg * need a copy of the data in a standard format.
5708848b8605Smrg */
5709848b8605Smrgvoid *
5710848b8605Smrg_mesa_unpack_image( GLuint dimensions,
5711848b8605Smrg                    GLsizei width, GLsizei height, GLsizei depth,
5712848b8605Smrg                    GLenum format, GLenum type, const GLvoid *pixels,
5713848b8605Smrg                    const struct gl_pixelstore_attrib *unpack )
5714848b8605Smrg{
5715848b8605Smrg   GLint bytesPerRow, compsPerRow;
5716848b8605Smrg   GLboolean flipBytes, swap2, swap4;
5717848b8605Smrg
5718848b8605Smrg   if (!pixels)
5719848b8605Smrg      return NULL;  /* not necessarily an error */
5720848b8605Smrg
5721848b8605Smrg   if (width <= 0 || height <= 0 || depth <= 0)
5722848b8605Smrg      return NULL;  /* generate error later */
5723848b8605Smrg
5724848b8605Smrg   if (type == GL_BITMAP) {
5725848b8605Smrg      bytesPerRow = (width + 7) >> 3;
5726848b8605Smrg      flipBytes = unpack->LsbFirst;
5727848b8605Smrg      swap2 = swap4 = GL_FALSE;
5728848b8605Smrg      compsPerRow = 0;
5729848b8605Smrg   }
5730848b8605Smrg   else {
5731848b8605Smrg      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
5732848b8605Smrg      GLint components = _mesa_components_in_format(format);
5733848b8605Smrg      GLint bytesPerComp;
5734848b8605Smrg
5735848b8605Smrg      if (_mesa_type_is_packed(type))
5736848b8605Smrg          components = 1;
5737848b8605Smrg
5738848b8605Smrg      if (bytesPerPixel <= 0 || components <= 0)
5739848b8605Smrg         return NULL;   /* bad format or type.  generate error later */
5740848b8605Smrg      bytesPerRow = bytesPerPixel * width;
5741848b8605Smrg      bytesPerComp = bytesPerPixel / components;
5742848b8605Smrg      flipBytes = GL_FALSE;
5743848b8605Smrg      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
5744848b8605Smrg      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
5745848b8605Smrg      compsPerRow = components * width;
5746848b8605Smrg      assert(compsPerRow >= width);
5747848b8605Smrg   }
5748848b8605Smrg
5749848b8605Smrg   {
5750848b8605Smrg      GLubyte *destBuffer
5751848b8605Smrg         = malloc(bytesPerRow * height * depth);
5752848b8605Smrg      GLubyte *dst;
5753848b8605Smrg      GLint img, row;
5754848b8605Smrg      if (!destBuffer)
5755848b8605Smrg         return NULL;   /* generate GL_OUT_OF_MEMORY later */
5756848b8605Smrg
5757848b8605Smrg      dst = destBuffer;
5758848b8605Smrg      for (img = 0; img < depth; img++) {
5759848b8605Smrg         for (row = 0; row < height; row++) {
5760848b8605Smrg            const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
5761848b8605Smrg                               width, height, format, type, img, row, 0);
5762848b8605Smrg
5763848b8605Smrg            if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
5764848b8605Smrg               GLint i;
5765848b8605Smrg               flipBytes = GL_FALSE;
5766848b8605Smrg               if (unpack->LsbFirst) {
5767848b8605Smrg                  GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
5768848b8605Smrg                  GLubyte dstMask = 128;
5769848b8605Smrg                  const GLubyte *s = src;
5770848b8605Smrg                  GLubyte *d = dst;
5771848b8605Smrg                  *d = 0;
5772848b8605Smrg                  for (i = 0; i < width; i++) {
5773848b8605Smrg                     if (*s & srcMask) {
5774848b8605Smrg                        *d |= dstMask;
5775848b8605Smrg                     }
5776848b8605Smrg                     if (srcMask == 128) {
5777848b8605Smrg                        srcMask = 1;
5778848b8605Smrg                        s++;
5779848b8605Smrg                     }
5780848b8605Smrg                     else {
5781848b8605Smrg                        srcMask = srcMask << 1;
5782848b8605Smrg                     }
5783848b8605Smrg                     if (dstMask == 1) {
5784848b8605Smrg                        dstMask = 128;
5785848b8605Smrg                        d++;
5786848b8605Smrg                        *d = 0;
5787848b8605Smrg                     }
5788848b8605Smrg                     else {
5789848b8605Smrg                        dstMask = dstMask >> 1;
5790848b8605Smrg                     }
5791848b8605Smrg                  }
5792848b8605Smrg               }
5793848b8605Smrg               else {
5794848b8605Smrg                  GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
5795848b8605Smrg                  GLubyte dstMask = 128;
5796848b8605Smrg                  const GLubyte *s = src;
5797848b8605Smrg                  GLubyte *d = dst;
5798848b8605Smrg                  *d = 0;
5799848b8605Smrg                  for (i = 0; i < width; i++) {
5800848b8605Smrg                     if (*s & srcMask) {
5801848b8605Smrg                        *d |= dstMask;
5802848b8605Smrg                     }
5803848b8605Smrg                     if (srcMask == 1) {
5804848b8605Smrg                        srcMask = 128;
5805848b8605Smrg                        s++;
5806848b8605Smrg                     }
5807848b8605Smrg                     else {
5808848b8605Smrg                        srcMask = srcMask >> 1;
5809848b8605Smrg                     }
5810848b8605Smrg                     if (dstMask == 1) {
5811848b8605Smrg                        dstMask = 128;
5812848b8605Smrg                        d++;
5813848b8605Smrg                        *d = 0;
5814848b8605Smrg                     }
5815848b8605Smrg                     else {
5816848b8605Smrg                        dstMask = dstMask >> 1;
5817848b8605Smrg                     }
5818848b8605Smrg                  }
5819848b8605Smrg               }
5820848b8605Smrg            }
5821848b8605Smrg            else {
5822848b8605Smrg               memcpy(dst, src, bytesPerRow);
5823848b8605Smrg            }
5824848b8605Smrg
5825848b8605Smrg            /* byte flipping/swapping */
5826848b8605Smrg            if (flipBytes) {
5827848b8605Smrg               flip_bytes((GLubyte *) dst, bytesPerRow);
5828848b8605Smrg            }
5829848b8605Smrg            else if (swap2) {
5830848b8605Smrg               _mesa_swap2((GLushort*) dst, compsPerRow);
5831848b8605Smrg            }
5832848b8605Smrg            else if (swap4) {
5833848b8605Smrg               _mesa_swap4((GLuint*) dst, compsPerRow);
5834848b8605Smrg            }
5835848b8605Smrg            dst += bytesPerRow;
5836848b8605Smrg         }
5837848b8605Smrg      }
5838848b8605Smrg      return destBuffer;
5839848b8605Smrg   }
5840848b8605Smrg}
5841848b8605Smrg
5842848b8605Smrg
5843848b8605Smrg
5844848b8605Smrg/**
5845848b8605Smrg * If we unpack colors from a luminance surface, we'll get pixel colors
5846848b8605Smrg * such as (l, l, l, a).
5847848b8605Smrg * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5848848b8605Smrg * function will compute L=R+G+B before packing.  The net effect is we'll
5849848b8605Smrg * accidentally store luminance values = 3*l.
5850848b8605Smrg * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5851848b8605Smrg * to be (l,0,0,a).
5852848b8605Smrg * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5853848b8605Smrg * and INTENSITY.
5854848b8605Smrg *
5855848b8605Smrg * Finally, we also need to do this when the actual surface format does
5856848b8605Smrg * not match the logical surface format.  For example, suppose the user
5857848b8605Smrg * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5858848b8605Smrg * Again, we'll get pixel values like (l,l,l,a).
5859848b8605Smrg */
5860848b8605Smrgvoid
5861848b8605Smrg_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat)
5862848b8605Smrg{
5863848b8605Smrg   GLuint i;
5864848b8605Smrg
5865848b8605Smrg   switch (baseFormat) {
5866848b8605Smrg   case GL_ALPHA:
5867848b8605Smrg      for (i = 0; i < n; i++) {
5868848b8605Smrg         rgba[i][RCOMP] = 0.0F;
5869848b8605Smrg         rgba[i][GCOMP] = 0.0F;
5870848b8605Smrg         rgba[i][BCOMP] = 0.0F;
5871848b8605Smrg      }
5872848b8605Smrg      break;
5873848b8605Smrg   case GL_INTENSITY:
5874848b8605Smrg      /* fall-through */
5875848b8605Smrg   case GL_LUMINANCE:
5876848b8605Smrg      for (i = 0; i < n; i++) {
5877848b8605Smrg         rgba[i][GCOMP] = 0.0F;
5878848b8605Smrg         rgba[i][BCOMP] = 0.0F;
5879848b8605Smrg         rgba[i][ACOMP] = 1.0F;
5880848b8605Smrg      }
5881848b8605Smrg      break;
5882848b8605Smrg   case GL_LUMINANCE_ALPHA:
5883848b8605Smrg      for (i = 0; i < n; i++) {
5884848b8605Smrg         rgba[i][GCOMP] = 0.0F;
5885848b8605Smrg         rgba[i][BCOMP] = 0.0F;
5886848b8605Smrg      }
5887848b8605Smrg      break;
5888848b8605Smrg   case GL_RGB:
5889848b8605Smrg      for (i = 0; i < n; i++) {
5890848b8605Smrg         rgba[i][ACOMP] = 1.0F;
5891848b8605Smrg      }
5892848b8605Smrg      break;
5893848b8605Smrg   case GL_RG:
5894848b8605Smrg      for (i = 0; i < n; i++) {
5895848b8605Smrg         rgba[i][BCOMP] = 0.0F;
5896848b8605Smrg         rgba[i][ACOMP] = 1.0F;
5897848b8605Smrg      }
5898848b8605Smrg      break;
5899848b8605Smrg   case GL_RED:
5900848b8605Smrg      for (i = 0; i < n; i++) {
5901848b8605Smrg         rgba[i][GCOMP] = 0.0F;
5902848b8605Smrg         rgba[i][BCOMP] = 0.0F;
5903848b8605Smrg         rgba[i][ACOMP] = 1.0F;
5904848b8605Smrg      }
5905848b8605Smrg      break;
5906848b8605Smrg
5907848b8605Smrg   default:
5908848b8605Smrg      /* no-op */
5909848b8605Smrg      ;
5910848b8605Smrg   }
5911848b8605Smrg}
5912848b8605Smrg
5913848b8605Smrg
5914848b8605Smrg/**
5915848b8605Smrg * As above, but GLuint components.
5916848b8605Smrg */
5917848b8605Smrgvoid
5918848b8605Smrg_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat)
5919848b8605Smrg{
5920848b8605Smrg   GLuint i;
5921848b8605Smrg
5922848b8605Smrg   switch (baseFormat) {
5923848b8605Smrg   case GL_ALPHA:
5924848b8605Smrg      for (i = 0; i < n; i++) {
5925848b8605Smrg         rgba[i][RCOMP] = 0;
5926848b8605Smrg         rgba[i][GCOMP] = 0;
5927848b8605Smrg         rgba[i][BCOMP] = 0;
5928848b8605Smrg      }
5929848b8605Smrg      break;
5930848b8605Smrg   case GL_INTENSITY:
5931848b8605Smrg      /* fall-through */
5932848b8605Smrg   case GL_LUMINANCE:
5933848b8605Smrg      for (i = 0; i < n; i++) {
5934848b8605Smrg         rgba[i][GCOMP] = 0;
5935848b8605Smrg         rgba[i][BCOMP] = 0;
5936848b8605Smrg         rgba[i][ACOMP] = 1;
5937848b8605Smrg      }
5938848b8605Smrg      break;
5939848b8605Smrg   case GL_LUMINANCE_ALPHA:
5940848b8605Smrg      for (i = 0; i < n; i++) {
5941848b8605Smrg         rgba[i][GCOMP] = 0;
5942848b8605Smrg         rgba[i][BCOMP] = 0;
5943848b8605Smrg      }
5944848b8605Smrg      break;
5945848b8605Smrg   case GL_RGB:
5946848b8605Smrg      for (i = 0; i < n; i++) {
5947848b8605Smrg         rgba[i][ACOMP] = 1;
5948848b8605Smrg      }
5949848b8605Smrg      break;
5950848b8605Smrg   case GL_RG:
5951848b8605Smrg      for (i = 0; i < n; i++) {
5952848b8605Smrg         rgba[i][BCOMP] = 0;
5953848b8605Smrg         rgba[i][ACOMP] = 1;
5954848b8605Smrg      }
5955848b8605Smrg      break;
5956848b8605Smrg   case GL_RED:
5957848b8605Smrg      for (i = 0; i < n; i++) {
5958848b8605Smrg         rgba[i][GCOMP] = 0;
5959848b8605Smrg         rgba[i][BCOMP] = 0;
5960848b8605Smrg         rgba[i][ACOMP] = 1;
5961848b8605Smrg      }
5962848b8605Smrg   default:
5963848b8605Smrg      /* no-op */
5964848b8605Smrg      ;
5965848b8605Smrg   }
5966848b8605Smrg}
5967848b8605Smrg
5968848b8605Smrg
5969