image.c revision c5b995066020191982b2315fc45d05e068eee761
1c5b995066020191982b2315fc45d05e068eee761Brian Paul/* $Id: image.c,v 1.67 2002/09/21 16:51:25 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Version:  4.1
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h"
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else
31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
32c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
358a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
37fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images.
47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format.
48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc)
49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current
50fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values!
51fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
52279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = {
53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   1,            /* Alignment */
54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* RowLength */
55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipPixels */
56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipRows */
57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* ImageHeight */
58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipImages */
59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE,     /* SwapBytes */
60c5b995066020191982b2315fc45d05e068eee761Brian Paul   GL_FALSE,     /* LsbFirst */
61c5b995066020191982b2315fc45d05e068eee761Brian Paul   GL_FALSE      /* ClientStorage */
62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul};
63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
65fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
66fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
6864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *
6964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * XXX try this trick to flip bytes someday:
7064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
7164a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
7264a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
74b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
75b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
8064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul      b = (GLuint) p[i];        /* words are often faster than bytes */
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
97b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
98b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
112b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
113b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype.
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP.
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum.
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
135b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
161b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes.
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
164b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type )
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
188c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
192c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
194c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
196c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
198c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
207c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
208c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
209c5b995066020191982b2315fc45d05e068eee761Brian Paul          return sizeof(GLushort);
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type.
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format.
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
221b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format )
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
238070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
252c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
253c5b995066020191982b2315fc45d05e068eee761Brian Paul         return 2;
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type.
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
264b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
266b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
293c450d57991628318696ee7a2bd052f91f480cda3Brian Paul            return sizeof(GLushort);
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
312c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
313c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
314c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (format == GL_YCBCR_MESA)
315c5b995066020191982b2315fc45d05e068eee761Brian Paul            return sizeof(GLushort);
316c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
317c5b995066020191982b2315fc45d05e068eee761Brian Paul            return -1;
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal.
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal.
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
328b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
329b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type )
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3512a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
3683d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul      case GL_BGR:
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
408c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
409c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
410c5b995066020191982b2315fc45d05e068eee761Brian Paul             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
411c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_TRUE;
412c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
413c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_FALSE;
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume).
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'.
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  image - start of image data
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         width, height - size of image
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - image format
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - pixel component type
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - the pixelstore attributes
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         img - which image in the volume (0 for 1D or 2D images)
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         row, column - location of pixel in the image
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  address of pixel at (image,row,column) in image or NULL if error.
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
434b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
435b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
436b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
437b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
438b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
473b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
479b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
498b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given
526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type.
527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
533ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (width + 7) / 8;
537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
538ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
539ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
540ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (packing->RowLength + 7) / 8;
541ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
542ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
543ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
544ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
545ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
546b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
547fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      GLint bytesPerRow, remainder;
548ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
549ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
550ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
551fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
552ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
553ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
554fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
555ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
556fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      remainder = bytesPerRow % packing->Alignment;
557fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      if (remainder > 0)
558fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow += (packing->Alignment - remainder);
559fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      return bytesPerRow;
560ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
561ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
562ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
563ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
564ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
565ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
566d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given
567d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type.
568d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */
569d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint
570d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
571d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLint width, GLint height,
572d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLenum format, GLenum type )
573d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{
574d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(packing);
575d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(type != GL_BITMAP);
576d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
577d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   {
578d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
579d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      GLint bytesPerRow, bytesPerImage, remainder;
580d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
581d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (bytesPerPixel <= 0)
582d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         return -1;  /* error */
583d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->RowLength == 0) {
584d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * width;
585d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
586d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else {
587d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
588d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
589d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      remainder = bytesPerRow % packing->Alignment;
590d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (remainder > 0)
591d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow += (packing->Alignment - remainder);
592d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
593d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->ImageHeight == 0)
594d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * height;
595d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else
596d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * packing->ImageHeight;
597d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
598d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      return bytesPerImage;
599d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   }
600d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul}
601d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
602d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
603d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
604d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
605d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/*
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6097c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6107c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
6117c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
613959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
6147c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
6157c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
6167c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
6177c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
6187c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
6197c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
6207c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
6217c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
6227c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
6237c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
6247c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
6257c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
6267c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
6277c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
632fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
634fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
635fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6377c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6387c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
6397c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
6417c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
6427c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
6437c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
6447c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
645fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
646fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
6477c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
6487c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
6497c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
6507c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
6527c652d77220610ecc19aaefa20876216b035e961Brian Paul
6537c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
657699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
658699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
659699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte.
660699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
661699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid *
662699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
663699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                     const struct gl_pixelstore_attrib *packing )
664699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
665699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint bytes, row, width_in_bytes;
666699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLubyte *buffer, *dst;
667699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
668699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!pixels)
669699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
670699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
671699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Alloc dest storage */
672699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   bytes = ((width + 7) / 8 * height);
673699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   buffer = (GLubyte *) MALLOC( bytes );
674699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!buffer)
675699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
676699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
677699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
678699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
679699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   dst = buffer;
680699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
681b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      const GLubyte *src = (const GLubyte *)
682b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul         _mesa_image_address(packing, pixels, width, height,
683b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                             GL_COLOR_INDEX, GL_BITMAP, 0, row, 0);
684699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!src) {
685699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         FREE(buffer);
686699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return NULL;
687699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
688699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
689699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
690699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
691699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
692699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
693699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
694699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
701b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
728b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      dst += width_in_bytes;
754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   return buffer;
757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data.
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
763b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint row, width_in_bytes;
768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   const GLubyte *src;
769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!source)
771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return;
772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   src = source;
775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
776b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest,
777b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                       width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!dst)
779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return;
780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
7863428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
808699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
809699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
810699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
811699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
812699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
813699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
815699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
818699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
825699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      src += width_in_bytes;
846116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
847116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul}
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
85196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/*
85296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified
85396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking.  Used by glReadPixels,
85496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc.
85596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */
856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid
857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx,
858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint n, CONST GLfloat rgbaIn[][4],
859b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLenum dstFormat, GLenum dstType,
860b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLvoid *dstAddr,
861b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            const struct gl_pixelstore_attrib *dstPacking,
862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint transferOps )
863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{
864b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat luminance[MAX_WIDTH];
866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat (*rgba)[4];
867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLuint i;
868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   if (transferOps) {
870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* make copy of incoming data */
87147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4);  /* mac 32k limitation */
87247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgbaCopy, return);  /* mac 32k limitation */
87347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][0] = rgbaIn[i][0];
876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][1] = rgbaIn[i][1];
877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][2] = rgbaIn[i][2];
878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][3] = rgbaIn[i][3];
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaCopy;
882ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* scale & bias */
884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_SCALE_BIAS_BIT) {
88545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
88645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
88745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
88845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
88945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color map lookup */
892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_map_rgba( ctx, n, rgba );
894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_COLOR_TABLE lookup */
896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_TABLE_BIT) {
897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* convolution */
900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_CONVOLUTION_BIT) {
901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         /* this has to be done in the calling code */
902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
90345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
90445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
90545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
90645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[RCOMP],
90745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[GCOMP],
90845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[BCOMP],
90945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[ACOMP],
91045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[RCOMP],
91145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[GCOMP],
91245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[BCOMP],
91345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[ACOMP]);
91445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      }
915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color matrix transform */
920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_transform_rgba(ctx, n, rgba);
922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* update histogram count */
928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_HISTOGRAM_BIT) {
929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* min/max here */
932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MIN_MAX_BIT) {
933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
93447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul         if (ctx->MinMax.Sink) {
93547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            return;
93747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul         }
938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
93947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   else {
942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* use incoming data, not a copy */
943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaIn;
944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
945ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /* XXX clamp rgba to [0,1]? */
947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
949b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
95296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE == GL_FLOAT
95396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul         luminance[i] = sum;
95496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#else
955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         luminance[i] = CLAMP(sum, 0.0F, 1.0F);
95696385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /*
961116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    */
963b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   switch (dstType) {
964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE:
965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
966b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
967b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
968116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
969116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
103308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_BYTE:
1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1039b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLbyte *dst = (GLbyte *) dstAddr;
1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
110508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT:
1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1111b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1112b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(luminance[i]);
1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
117808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1180b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps);
1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_SHORT:
1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1187b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLshort *dst = (GLshort *) dstAddr;
1188b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
125308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1255b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT:
1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1262b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1263b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
132908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1331b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_INT:
1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1338b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLint *dst = (GLint *) dstAddr;
1339b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
140508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1407b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_FLOAT:
1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1414b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLfloat *dst = (GLfloat *) dstAddr;
1415b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][RCOMP];
1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][GCOMP];
1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][BCOMP];
1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][ACOMP];
1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = luminance[i];
1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = luminance[i];
1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
1467116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1468116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
1469116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1471116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1472116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1473116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1474116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
1476116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
1477116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
148108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1483b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1489b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1490b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1499b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1500b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1509b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1510b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1519b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1520b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1530b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
1542881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1543881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
1544881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1545881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1546881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1547881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1548881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1549881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1550881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) <<  4)
1551881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1552881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
1553881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1556116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1557116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1559b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1560116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1561116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1562116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1563116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1564116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1566116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
1571881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1572881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
1573881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1574881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1575881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1576881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1577881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1578881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1579881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
1580881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1581881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1582881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
1583881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1584881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1587881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1588b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1589116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1590116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1591116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1592116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1593116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1596881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1597881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1598881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1599881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
1600881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1601881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
1602881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1603881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1604881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1605881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1606881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1607881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1608881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
1609881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
1610881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
1611881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
1612881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1613881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1616881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1617b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1618116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1619116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1620116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1621116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1622116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1625881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1626881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1627881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1628881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
1629881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1630881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
1631881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1632881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1633881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1634881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1635881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1636881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1637881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
1638881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
1639881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
1640881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
1641881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1642881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1645b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1646b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1648116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1654b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1655b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1663b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1664b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
1674b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1675b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1679116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1683b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1684b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1689116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1691116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1692b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1693b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1694116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1695116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
1696116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1697116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1698116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1701116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1702116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
1703b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1704b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1705116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1706116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1707116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1708116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1709116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1711116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1712b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1713b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1714116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1715116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1716116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1717116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1718116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1720116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1721b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1722b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1723116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1724116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
1725116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1726116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
1727116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1730116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1731116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
1732b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1733b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1734116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1735116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1736116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1737116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1738116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1739116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1740116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1741b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1742b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1743116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1744116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1745116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1746116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1747116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1748116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1749116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1750b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1751b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1752116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1753116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
1754116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1755116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
1756116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1759116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1760116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      default:
176108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(ctx, "bad type in _mesa_pack_float_rgba_span");
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1766179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul
1767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
1768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address
1769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type.
1770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops.
1771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct.
1772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D()
1773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input:  ctx - the context
1774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         n - number of pixels in the span
1775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         rgba - the pixels
1776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         format - dest packing format
1777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         type - dest packing datatype
1778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         destination - destination packing address
1779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         packing - pixel packing parameters
1780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         transferOps - bitmask of IMAGE_*_BIT operations to apply
1781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
1782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid
1783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx,
1784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint n, CONST GLchan srcRgba[][4],
1785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLenum dstFormat, GLenum dstType,
1786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLvoid *dstAddr,
1787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      const struct gl_pixelstore_attrib *dstPacking,
1788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint transferOps)
1789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
1790cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul   ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0);
1791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Test for optimized case first */
1793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
1794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
1796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
1798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1799b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLuint i;
1800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLchan *dest = (GLchan *) dstAddr;
1801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i = 0; i < n; i++) {
1802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[0] = srcRgba[i][RCOMP];
1803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[1] = srcRgba[i][GCOMP];
1804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[2] = srcRgba[i][BCOMP];
1805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest += 3;
1806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) {
1809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /* common simple case */
1810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLuint i;
1811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLubyte *dest = (GLubyte *) dstAddr;
1812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      for (i = 0; i < n; i++) {
1813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]);
1814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]);
1815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]);
1816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]);
1817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest += 4;
1818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      }
1819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   }
1820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else {
1821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* general solution */
1822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLuint i;
182347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
182447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
182547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
1826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      assert(n <= MAX_WIDTH);
1827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* convert color components to floating point */
1828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i=0;i<n;i++) {
1829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
1830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
1831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
1832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
1833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba,
1835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstFormat, dstType, dstAddr,
1836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstPacking, transferOps);
183747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
1838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
1840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2004959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2009959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
201408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - datatype of incoming data
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2067a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2068a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2069a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2071a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2073a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2075a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2076a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2077a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2079a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
2080a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
21025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      case GL_LUMINANCE:
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
211301429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul         redIndex = greenIndex = blueIndex = alphaIndex = 0;
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
216408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcFormat in extract float data");
2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
24253041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
24263041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
24273041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
24283041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
24363041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
24373041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
24383041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
24393041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
24493041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
24503041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
24513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
24523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
24603041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
24613041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
24623041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
24633041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2474a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2475a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2476a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2477a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2485a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2486a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2487a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2488a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
251808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract float data");
2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2527fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format.
2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D().
2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input:  ctx - the context
2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcType - source image  datatype
2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2537b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *         srcPacking - pixel unpacking parameters
2538fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2543699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx,
2544699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint n, GLenum dstFormat, GLchan dest[],
2545699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLenum srcFormat, GLenum srcType,
2546699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const GLvoid *source,
2547699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const struct gl_pixelstore_attrib *srcPacking,
2548699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint transferOps )
2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
25515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2581a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2582a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2583a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2585a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2587a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2589a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2590a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2591a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2594aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   if (transferOps == 0 ){
2595aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      if (srcType == CHAN_TYPE) {
2596aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2597aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGBA) {
2598aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
2599aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2600aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2601aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGB) {
2602aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2603aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2604aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2605aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2606aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2607aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2608aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2609aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2610aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2611aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2612aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2613aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2614aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2616aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2617aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2618aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
2619aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2620aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2621aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2622aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2623aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2624aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2625aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2626aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2627aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2628aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2629aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2630aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2631aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2632aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2634aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         }
2635aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == srcFormat) {
2636aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            GLint comps = _mesa_components_in_format(srcFormat);
2637aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            assert(comps > 0);
2638aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            MEMCPY( dest, source, n * comps * sizeof(GLchan) );
2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2642aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /*
2643aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * Common situation, loading 8bit RGBA/RGB source images
2644aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * into 16/32 bit destination. (OSMesa16/32)
2645aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       */
2646aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      else if (srcType == GL_UNSIGNED_BYTE) {
2647aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2648aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2649aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2650aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2651aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2652aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2653aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2654aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2655aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2656aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2657aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2658aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2659aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2660aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2661aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2662aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2663aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2664aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2665aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2666aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2667aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2668aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2669aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2670aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = UBYTE_TO_CHAN(src[3]);
2671aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2672aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2673aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2674aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2675aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul             }
2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2677aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2678aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2679aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2680aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2681aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2682aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2683aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2684aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2685aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2686aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2687aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2688aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2689aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2690aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2691aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2692aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2693aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2694aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2695aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2696aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2697aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2698aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2699aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2700aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2701aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2702aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2709179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
271447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
271547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2717b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2728b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2730fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2731fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2732fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2733fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2734fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2735fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2736c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2740c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2741c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
274447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2745c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2749179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2754b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2756fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
2757fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
275845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
275945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
276045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
276145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
276245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
2763fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2764fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
2765fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
2766fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
2767c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2768c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2769c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2770fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
2771c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2772fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
2773c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2774c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2775fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
2776fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
2777ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul            /* this has to be done in the calling code */
2778fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
277945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
278045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
278145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
278245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
278345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
278445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
278545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
278645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
278745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
278845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
278945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
279045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
2791c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2792fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
2793c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2794c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2796fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2800fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
28031a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
2804fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
28051a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
28061a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2807fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
2808fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
28091a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* clamp to [0,1] */
281496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT
2815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      {
2816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
282496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif
2825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
28355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
286508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
286647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2867276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* Now return the GLchan data in the requested dstFormat */
2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
28776532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
2878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
28866532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2892699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
28956532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
2896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
2901699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
29046532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
2905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
2910699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
2913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
2914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
29166532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
2917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
2921699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
2924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
29266532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
2927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
293047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
2931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx,
2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
2938c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
2940b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                               const struct gl_pixelstore_attrib *srcPacking,
2941fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                               GLuint transferOps, GLboolean clamp )
2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
29445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
2950c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2957c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2980c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2984c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
2987c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
299147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
299247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3005b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3007fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
3008fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
3009fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
3010fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
3011fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3012fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
3016699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
3019699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
302147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
3031b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3033fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
3034fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
303545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
303645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
303745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
303845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
303945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
3040fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
3041fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
3042fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
3043fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3047fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
3049fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3052fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
3053fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
3054fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            /* XXX to do */
3055fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
305645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
305745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
305845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
305945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
306045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
306145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
306245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
306345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
306445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
306545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
306645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
306745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
3068c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
3069fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
3070c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
3071c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
3073fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
3077fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
30801a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
3081fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
30821a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
30831a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
3084fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
3085fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
30861a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3088c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* clamp to [0,1] */
309196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT
30927a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul      if (clamp) {
3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
310196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif
3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3103c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
3104c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
3108c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
3109c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
31125e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3117c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3119c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
3120c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3121c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3122c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3123c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
3124c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
3125c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3126c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
3127c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3128c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
3129c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3131c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
3133c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3136c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3138c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3140c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3141c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
314208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()");
314347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3144c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3145c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3146c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3147fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      /* Now pack results in the requested dstFormat */
3148c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
3149c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3152c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
3153c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3154c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3155c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3157c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
3158c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3159c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3160c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3165c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3170c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3195c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
3196c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3200c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
3201c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
320547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
3214fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
3217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
3218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
3219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dstType - destination datatype
3220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
3221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
3222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
3223b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3224fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - the pixel transfer operations to apply
3225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
3227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
3228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
3229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
3230b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3231fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
3234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
3235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
3236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
3237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
3238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
3239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
3240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
3241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
3244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
3245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3246fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
3247fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
3248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
3250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
3251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
3252fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
3253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
3254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3256fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
3257b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
3258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
3262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
3263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
3264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
3265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
3266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3268b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3270fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3271fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* shift and offset indexes */
3272fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
3273fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      }
3274fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
3275fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* Apply lookup table */
3276fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_map_ci(ctx, n, indexes);
3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
3280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
3281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
3282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
3291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
330308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
3304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
330923e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
331023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
331123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, GLvoid *dest, const GLuint *source,
331223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking,
331323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLuint transferOps )
331423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
331523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLuint indexes[MAX_WIDTH];
331623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
331723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
331823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
331923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
332023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
332123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
332223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
332323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(indexes, source, n * sizeof(GLuint));
332423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
332523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_ci( ctx, n, indexes);
332623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
332723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
332823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_ci(ctx, n, indexes);
332923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
333023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = indexes;
333123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
333223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
333323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
333423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
333523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
333623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
333723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
333823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
333923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLubyte) source[i];
334023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
334123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
334223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
334323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
334423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
334523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
334623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
334723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3348a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLbyte) source[i];
334923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
335023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
335123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
335223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
335323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
335423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
335523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
335623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3357a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLushort) source[i];
335823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
335923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
336023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
336123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3369a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLshort) source[i];
337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3381a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLuint) source[i];
338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3393a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLint) source[i];
339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3405a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLfloat) source[i];
340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
341308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3420fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
3421fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3422fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
3423fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
3424fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
3425fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
3426fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dstType - destination datatype
3427fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
3428fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
3429fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
3430b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3431fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - apply offset/bias/lookup ops?
3432fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3433fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3434fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
3435fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
3436fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
3437b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           const struct gl_pixelstore_attrib *srcPacking,
3438fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                           GLuint transferOps )
3439fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3440fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
3441fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3442fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
3443fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3444fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
3445fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
3446fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
3447fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
3448fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3449fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3450fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
3451fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
3452fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3453fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   /* only shift and offset apply to stencil */
3454fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
3455fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3456fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
3457fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
3458fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
3459fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 &&
3460fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       srcType == GL_UNSIGNED_BYTE &&
3461fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       dstType == GL_UNSIGNED_BYTE) {
3462fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3463fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3464fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 &&
3465fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            srcType == GL_UNSIGNED_INT &&
3466fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            dstType == GL_UNSIGNED_INT &&
3467b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            !srcPacking->SwapBytes) {
3468fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3469fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3470fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
3471fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
3472fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
3473fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
3474fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
3475fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
3476fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3477fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3478b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3479fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3480fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3481fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3482fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
3483179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3484fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
3487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
3489fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3493fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3494fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
3498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
3499fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
3501fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3505fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3506fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
352008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
352623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
352723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
352823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         GLenum dstType, GLvoid *dest, const GLstencil *source,
352923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         const struct gl_pixelstore_attrib *dstPacking )
353023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
353123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLstencil stencil[MAX_WIDTH];
353223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
353323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
353423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
353523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
353623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul       ctx->Pixel.MapStencilFlag) {
353723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
353823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(stencil, source, n * sizeof(GLstencil));
353923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
354023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_stencil( ctx, n, stencil );
354123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
354223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.MapStencilFlag) {
354323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_stencil( ctx, n, stencil );
354423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
354523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = stencil;
354623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
354723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
354823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
354923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
355023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
355123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
355223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
355323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
355423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
355523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
355623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
355723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLubyte) source[i];
355823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
355923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
356023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
356123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
356223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
356323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
356423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
356523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
356623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
356723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
356823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
356923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLbyte) source[i];
357023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
357123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
357223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
357323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
357423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
357523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
357623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
357723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
357823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLushort) source[i];
357923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
358023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
358123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
358223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
358323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
358423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
358523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
358623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
358723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
358823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
358923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLshort) source[i];
359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
359323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLuint) source[i];
360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLint) source[i];
361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLfloat) source[i];
362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BITMAP:
363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (dstPacking->LsbFirst) {
363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 0;
363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 0)
364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift++;
364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 8) {
364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 0;
364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 7;
365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 7)
365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift--;
365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift < 0) {
365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 7;
366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
366608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3671fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3672fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3673e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
3674fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
3675e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul                         const struct gl_pixelstore_attrib *srcPacking )
3676fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3677fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
3678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
3679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3680fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3683e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = BYTE_TO_FLOAT(src[i]);
3684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3685fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3686fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3687fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
3688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3691fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3692e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UBYTE_TO_FLOAT(src[i]);
3693fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3696fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
3697fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3698fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3699fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
3700fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3701e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = SHORT_TO_FLOAT(src[i]);
3702fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3703fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3704fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3705fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
3706fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3707fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
3709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3710e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = USHORT_TO_FLOAT(src[i]);
3711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3713fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3714fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
3715fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3716fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3717fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
3718fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3719e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = INT_TO_FLOAT(src[i]);
3720fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3721fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3722fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3723fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
3724fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3725fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3726fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3727fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3728e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UINT_TO_FLOAT(src[i]);
3729fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3730fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3731fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3732fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3733e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         MEMCPY(dest, source, n * sizeof(GLfloat));
3734fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3735fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
373608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
3737fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3738fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3739fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3740fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3741e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul   /* apply depth scale and bias and clamp to [0,1] */
3742fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3743fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3745e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3746e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         dest[i] = CLAMP(d, 0.0F, 1.0F);
3747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3748fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3749fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3750fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3751fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3753fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
375423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values.  The values are floats in [0,1].
375523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */
375623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
3757b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
375823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, const GLfloat *depthSpan,
375923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking )
376023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
376123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLfloat depthCopy[MAX_WIDTH];
376223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 ||
376323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                                   ctx->Pixel.DepthScale != 1.0;
376423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
376523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
376623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
376723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (bias_or_scale) {
376823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      GLuint i;
376923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      for (i = 0; i < n; i++) {
377023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat d;
377123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
377223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         depthCopy[i] = CLAMP(d, 0.0F, 1.0F);
377323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
377423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      depthSpan = depthCopy;
377523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
377623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
377723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
377823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
377923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
378023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
378123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
378223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
378323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
378423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
378523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
378623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
378723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
378823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
378923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
379023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
379123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
379223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
379323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
379423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
379523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
379623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
379723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
379823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
379923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
380023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
380123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_USHORT( depthSpan[i] );
380223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
380323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
380423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
380523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
380623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
380723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
380823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
380923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
381023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
381123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
381223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
381323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
381423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
381523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
381623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
381723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
381823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
381923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
382023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
382123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
382223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
382323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
382423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
382523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
382623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
382723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
382823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
382923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
383023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
383123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
383223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
383323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
383423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
383523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
383623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
383723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_INT( depthSpan[i] );
383823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
383923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
384023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
384123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
384523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = depthSpan[i];
385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
385708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul/*
3865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data.  Apply byteswapping, byte flipping (bitmap).
3866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block.
3867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3889b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3890b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
3900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
3901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
3904b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth);
3905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
3906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
3907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
3908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
3909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
3911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
3912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
3913b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
3914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
3915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
3916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
3917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
3918b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
3919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
3921b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
3922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
3924b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
3925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
3927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
3930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3932