image.c revision b51b0a847d7e7daaea69f77ab569086ef81c24a2
1b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul/* $Id: image.c,v 1.58 2001/03/07 05:06:11 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * Version:  3.5
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Copyright (C) 1999-2001  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 */
60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE      /* LsbFirst */
61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul};
62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
65fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
6764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *
6864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul * XXX try this trick to flip bytes someday:
6964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
7064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
7164a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
73b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
74b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
7964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul      b = (GLuint) p[i];        /* words are often faster than bytes */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
96b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
97b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
111b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
112b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype.
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP.
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum.
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
134b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
160b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes.
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
163b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type )
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type.
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format.
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
217b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format )
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
234070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type.
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
258b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
260b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLshort);
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal.
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal.
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
316b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
317b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type )
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3392a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
3563d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul      case GL_BGR:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume).
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'.
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  image - start of image data
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         width, height - size of image
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - image format
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - pixel component type
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - the pixelstore attributes
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         img - which image in the volume (0 for 1D or 2D images)
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         row, column - location of pixel in the image
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  address of pixel at (image,row,column) in image or NULL if error.
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
416b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
417b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
418b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
419b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
420b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
461b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
480b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given
508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type.
509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (width + 7) / 8;
519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
520ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
522ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (packing->RowLength + 7) / 8;
523ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
528b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
529fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      GLint bytesPerRow, remainder;
530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
533fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
536fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
538fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      remainder = bytesPerRow % packing->Alignment;
539fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      if (remainder > 0)
540fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow += (packing->Alignment - remainder);
541fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      return bytesPerRow;
542ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
543ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
544ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
545ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
546ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
547ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5517c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5527c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
5537c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
555959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
5567c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
5577c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
5587c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
5597c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
5607c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
5617c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
5627c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
5637c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
5647c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
5657c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
5667c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
5677c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
5687c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
5697c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5797c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5807c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
5817c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
5837c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
5847c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
5857c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
5867c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
5897c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
5907c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
5917c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
5927c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
5947c652d77220610ecc19aaefa20876216b035e961Brian Paul
5957c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
599699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
600699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
601699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte.
602699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
603699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid *
604699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
605699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                     const struct gl_pixelstore_attrib *packing )
606699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
607699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint bytes, row, width_in_bytes;
608699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLubyte *buffer, *dst;
609699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
610699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!pixels)
611699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
612699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
613699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Alloc dest storage */
614699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   bytes = ((width + 7) / 8 * height);
615699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   buffer = (GLubyte *) MALLOC( bytes );
616699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!buffer)
617699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
618699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
619699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
620699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
621699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   dst = buffer;
622699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
623b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      const GLubyte *src = (const GLubyte *)
624b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul         _mesa_image_address(packing, pixels, width, height,
625b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                             GL_COLOR_INDEX, GL_BITMAP, 0, row, 0);
626699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!src) {
627699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         FREE(buffer);
628699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return NULL;
629699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
630699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
631699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
632699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
633699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
634699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
635699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
636699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
637699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
638699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
639699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
640699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
641699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
642699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
643b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
644699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
645699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
646699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
647699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
648699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
649699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
650699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
651699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
652699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
653699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
654699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
655699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
656699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
657699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
658699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
659699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
660699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
661699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
662699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
663699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
664699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
665699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
666699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
667699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
668699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
669699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
670b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
671699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
672699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
673699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
674699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
675699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
676699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
677699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
678699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
679699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
680699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
681699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
682699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
683699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
684699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
685699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
686699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
687699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
688699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
689699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
690699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
691699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
692699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
693699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
694699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      dst += width_in_bytes;
696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   return buffer;
699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data.
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
705b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint row, width_in_bytes;
710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   const GLubyte *src;
711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!source)
713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return;
714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   src = source;
717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
718b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest,
719b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                       width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!dst)
721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return;
722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
7283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      src += width_in_bytes;
788116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul}
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
793116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid
794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx,
795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint n, CONST GLfloat rgbaIn[][4],
796b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLenum dstFormat, GLenum dstType,
797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLvoid *dstAddr,
798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            const struct gl_pixelstore_attrib *dstPacking,
799116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint transferOps )
800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{
801b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
802116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat luminance[MAX_WIDTH];
803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat (*rgba)[4];
804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLuint i;
805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   if (transferOps) {
807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* make copy of incoming data */
808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      GLfloat rgbaCopy[MAX_WIDTH][4];
809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][0] = rgbaIn[i][0];
811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][1] = rgbaIn[i][1];
812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][2] = rgbaIn[i][2];
813116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][3] = rgbaIn[i][3];
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaCopy;
817ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
818116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* scale & bias */
819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_SCALE_BIAS_BIT) {
82045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
82145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
82245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
82345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
82445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color map lookup */
827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_map_rgba( ctx, n, rgba );
829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_COLOR_TABLE lookup */
831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_TABLE_BIT) {
832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* convolution */
835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_CONVOLUTION_BIT) {
836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         /* this has to be done in the calling code */
837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
83845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
83945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
84045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
84145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[RCOMP],
84245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[GCOMP],
84345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[BCOMP],
84445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[ACOMP],
84545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[RCOMP],
84645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[GCOMP],
84745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[BCOMP],
84845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[ACOMP]);
84945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      }
850116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color matrix transform */
855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_transform_rgba(ctx, n, rgba);
857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* update histogram count */
863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_HISTOGRAM_BIT) {
864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* min/max here */
867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MIN_MAX_BIT) {
868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         if (ctx->MinMax.Sink)
870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            return;
871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   else {
874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* use incoming data, not a copy */
875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaIn;
876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
877ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /* XXX clamp rgba to [0,1]? */
879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
881b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         luminance[i] = CLAMP(sum, 0.0F, 1.0F);
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
888116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /*
889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    */
891b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   switch (dstType) {
892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE:
893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
895b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
904116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
905116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
906116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
907116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
908116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
909116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
910116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
911116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
912116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
913116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
914116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
934116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
935116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
937116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
939116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
945116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
949116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
952116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
953116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
954116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
956116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
957116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
959116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
96108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
963116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_BYTE:
966116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
967b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLbyte *dst = (GLbyte *) dstAddr;
968b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
969116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(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_UNSIGNED_SHORT:
1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1039b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(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_USHORT(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_USHORT(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_USHORT(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_USHORT(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_USHORT(luminance[i]);
1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(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_USHORT(rgba[i][RCOMP]);
1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(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_USHORT(rgba[i][RCOMP]);
1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(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_USHORT(rgba[i][BCOMP]);
1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(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_USHORT(rgba[i][BCOMP]);
1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
110608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1108b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps);
1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_SHORT:
1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1115b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLshort *dst = (GLshort *) dstAddr;
1116b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
118108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1183b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT:
1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1190b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1191b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
125708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1259b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_INT:
1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1266b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLint *dst = (GLint *) dstAddr;
1267b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
133308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1335b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_FLOAT:
1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1342b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLfloat *dst = (GLfloat *) dstAddr;
1343b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][RCOMP];
1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][GCOMP];
1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][BCOMP];
1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][ACOMP];
1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = luminance[i];
1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = luminance[i];
1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
140908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1411b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1417b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1418b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1427b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1428b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1437b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1438b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1447b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1448b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1457881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1458b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1466881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1467881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1468881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1469881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
1470881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1471881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
1472881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1473881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1474881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1475881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1476881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1477881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1478881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) <<  4)
1479881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1480881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
1481881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
1482881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1483881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1486881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1487b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1495881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1496881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1497881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1498881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
1499881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1500881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
1501881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1502881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1503881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1504881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1505881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1506881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1507881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
1508881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1509881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1510881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
1511881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1512881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1515881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1516b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1524881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1525881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1526881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1527881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
1528881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
1530881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1531881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1532881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1533881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1534881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1535881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1536881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
1537881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1544881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1545b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1550116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1552116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1553881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1556881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
1557881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
1559881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1560881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1561881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1562881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1563881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1564881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1565881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
1566881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1571116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1572116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1573b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1574b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1575116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1576116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1577116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1578116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1579116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1581116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1582b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1583b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1584116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1587116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1588116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1590116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1591b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1592b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1593116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1594116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1596116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1597116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1599116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1600116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1601116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
1602b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1603b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1604116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1605116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1606116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1607116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1608116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1610116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1611b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1612b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1613116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1616116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1617116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1619116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1620b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1621b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1622116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1623116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1625116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1628116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
1631b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1633116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1640b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1641b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1642116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1648116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1649b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1650b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
1660b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1661b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1663116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1669b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1670b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1678b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1679b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1681116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1683116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
1684116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      default:
168908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(ctx, "bad type in _mesa_pack_float_rgba_span");
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1694179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul
1695699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
1696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address
1697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type.
1698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops.
1699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct.
1700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D()
1701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input:  ctx - the context
1702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         n - number of pixels in the span
1703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         rgba - the pixels
1704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         format - dest packing format
1705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         type - dest packing datatype
1706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         destination - destination packing address
1707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         packing - pixel packing parameters
1708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         transferOps - bitmask of IMAGE_*_BIT operations to apply
1709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
1710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid
1711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx,
1712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint n, CONST GLchan srcRgba[][4],
1713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLenum dstFormat, GLenum dstType,
1714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLvoid *dstAddr,
1715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      const struct gl_pixelstore_attrib *dstPacking,
1716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint transferOps)
1717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
17189499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   ASSERT((ctx->NewState & _NEW_PIXEL) == 0);
1719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Test for optimized case first */
1721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
1722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
1724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
1726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1727b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLuint i;
1728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLchan *dest = (GLchan *) dstAddr;
1729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i = 0; i < n; i++) {
1730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[0] = srcRgba[i][RCOMP];
1731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[1] = srcRgba[i][GCOMP];
1732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[2] = srcRgba[i][BCOMP];
1733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest += 3;
1734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else {
1737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* general solution */
1738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLfloat rgba[MAX_WIDTH][4];
1739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLuint i;
1740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      assert(n <= MAX_WIDTH);
1741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* convert color components to floating point */
1742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i=0;i<n;i++) {
1743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
1744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
1745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
1746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
1747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba,
1749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstFormat, dstType, dstAddr,
1750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstPacking, transferOps);
1751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
1753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1917959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1922959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
192708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - datatype of incoming data
1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
1980a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
1981a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
1982a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
1984a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
1986a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1988a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
1989a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
1990a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1992a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
1993a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
20155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      case GL_LUMINANCE:
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
207808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcFormat in extract float data");
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23393041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
23403041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23413041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23423041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23503041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
23513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23533041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23633041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
23643041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23653041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23663041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23743041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
23753041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23763041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23773041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2388a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2389a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2390a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2391a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2399a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2400a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2401a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2402a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
243208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract float data");
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2441fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format.
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D().
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input:  ctx - the context
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcType - source image  datatype
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2451b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *         srcPacking - pixel unpacking parameters
2452fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2457699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx,
2458699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint n, GLenum dstFormat, GLchan dest[],
2459699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLenum srcFormat, GLenum srcType,
2460699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const GLvoid *source,
2461699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const struct gl_pixelstore_attrib *srcPacking,
2462699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint transferOps )
2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
24655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2495a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2496a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2497a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2499a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2501a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2503a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2504a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2505a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2508699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && srcType == CHAN_TYPE) {
2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstFormat == GL_RGBA) {
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGBA) {
2511699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGB) {
2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2516699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLchan *src = (const GLchan *) source;
2517699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLchan *dst = dest;
2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2522699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dst[3] = CHAN_MAX;
2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 3;
2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 4;
2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else if (dstFormat == GL_RGB) {
2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGB) {
2531699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGBA) {
2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2536699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLchan *src = (const GLchan *) source;
2537699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLchan *dst = dest;
2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 4;
2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 3;
2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2548b09a4cd913e2de612fddf5411185a257da35647cBrian Paul      else if (dstFormat == srcFormat) {
2549b7d076fc96ac27117421653a043d00a95f789d24Brian Paul         GLint comps = _mesa_components_in_format(srcFormat);
2550b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         assert(comps > 0);
2551699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dest, source, n * comps * sizeof(GLchan) );
2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2557179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLfloat rgba[MAX_WIDTH][4];
2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2564b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2575b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2577fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2578fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2579fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2580fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2581fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2582fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2583c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2586699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2588c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2589699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2595179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2600b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2602fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
2603fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
260445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
260545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
260645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
260745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
260845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
2609fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2610fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
2611fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
2612fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
2613c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2614c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2615c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2616fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2618fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2620c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2621fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
2622fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
2623ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul            /* this has to be done in the calling code */
2624fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
262545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
262645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
262745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
262845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
262945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
263045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
263145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
263245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
263345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
263445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
263545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
263645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
2637c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2638fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
2639c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2640c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2641c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2642fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
2643c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2644c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2646fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
26491a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
2650fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
26511a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
26521a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2653fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
2654fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
26551a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* clamp to [0,1] */
2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      {
2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
26795e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
270908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
2710276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* Now return the GLchan data in the requested dstFormat */
2715fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
27206532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
27296532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
27386532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
2744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
27476532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
2753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
27596532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
2764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
27696532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2777c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
2778c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx,
2779c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
2780c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
2781c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
2782b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                               const struct gl_pixelstore_attrib *srcPacking,
2783fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                               GLuint transferOps, GLboolean clamp )
2784c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
2785c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
27865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2787c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2788c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
2789c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
2790c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
2791c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
2792c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2793c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
2794c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
2796c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
2800c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
2803c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
2804c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
2805c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
2806c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2807c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
2808c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2809c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
2810c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2811c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
2812c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
2813c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
2814c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
2815c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2816c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2817c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2818c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2819c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2820c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2821c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2822c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2823c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2824c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2825c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2826c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2827c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2828c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
2829c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
2830c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLfloat rgba[MAX_WIDTH][4];
2831c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
2832c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2833c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2834c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2835c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2836c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
2837c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
2838c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2839c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
2840c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
2841c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2842c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
2843c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
2844c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
2845c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2846b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2847c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2848fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2849fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2850fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2851fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2852fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2853fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2854c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2855c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2856c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
2857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2858c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2859c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2861c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2862c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2863c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2864c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
2865c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
2866c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2867c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2868c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2869c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
2870c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2871b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2872c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2873fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
2874fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
287545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
287645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
287745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
287845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
287945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
2880fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2881fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
2882fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
2883fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
2884c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2885c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2886c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2887fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
2888c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2889fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
2890c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2891c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2892fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
2893fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            /* XXX to do */
2895fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
289645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
289745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
289845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
289945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
290045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
290145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
290245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
290345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
290445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
290545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
290645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
290745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
2908c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2909fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
2910c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2911c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2912c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2913fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
2914c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2915c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2916c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2917fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
2918c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2919c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
29201a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
2921fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
29221a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
29231a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2924fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
2925fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
29261a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2927c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2928c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2929c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2930c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* clamp to [0,1] */
29317a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul      if (clamp) {
2932c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2933c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2934c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2938c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2940c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2941c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2944c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
29505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2957c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
298008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()");
2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2984fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      /* Now pack results in the requested dstFormat */
2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2987c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2991c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2992c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3005c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3007c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
3008c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3009c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3010c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3011c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3012c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3016c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3019c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3021c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3031c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
3033c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3034c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3035c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
3036c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3037c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
3038c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
3039c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3040c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3041c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3042c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
3043c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
3050fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
3053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dstType - destination datatype
3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
3057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
3059b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3060fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - the pixel transfer operations to apply
3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
3063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
3064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
3066b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3067fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
3073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
3074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3082fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
3083fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
3087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
3088fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
3089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
3090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3092fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
3093b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
3098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
3099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
3100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3104b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3106fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3107fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* shift and offset indexes */
3108fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
3109fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      }
3110fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
3111fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* Apply lookup table */
3112fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_map_ci(ctx, n, indexes);
3113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
3116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
3117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
3118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
3120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
3127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
3129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
3136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
313908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
3140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
314523e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
314623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
314723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, GLvoid *dest, const GLuint *source,
314823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking,
314923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLuint transferOps )
315023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
315123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLuint indexes[MAX_WIDTH];
315223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
315323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
315423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
315523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
315623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
315723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
315823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
315923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(indexes, source, n * sizeof(GLuint));
316023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
316123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_ci( ctx, n, indexes);
316223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
316323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
316423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_ci(ctx, n, indexes);
316523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
316623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = indexes;
316723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
316823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
316923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
317023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
317123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
317223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
317323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
317423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
317523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLubyte) source[i];
317623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
317723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
317823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
317923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
318023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
318123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
318223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
318323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
318423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLbyte) indexes[i];
318523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
318623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
318723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
318823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
318923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
319023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
319123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
319223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
319323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLushort) indexes[i];
319423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
319523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
319623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
319723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
319823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
319923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
320023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
320123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
320223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
320323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
320423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
320523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLshort) indexes[i];
320623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
320723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
320823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
320923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
321023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
321123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
321223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
321323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
321423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
321523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
321623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
321723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLuint) indexes[i];
321823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
321923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
322023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
322123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
322223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
322323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
322423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
322523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
322623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
322723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
322823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
322923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLint) indexes[i];
323023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
323123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
323223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
323323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
323423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
323523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
323623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
323723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
323823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
323923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
324023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
324123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLfloat) indexes[i];
324223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
324323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
324423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
324523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
324623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
324723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
324823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
324908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
325023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
325123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
325223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
325323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
325423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3256fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
3257fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
3259fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
3260fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
3261fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
3262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dstType - destination datatype
3263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
3264fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
3265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
3266b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3267fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - apply offset/bias/lookup ops?
3268fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3269fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
3271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
3272fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
3273b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           const struct gl_pixelstore_attrib *srcPacking,
3274fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                           GLuint transferOps )
3275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
3277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
3279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
3281fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
3282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
3283fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
3284fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3285fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3286fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
3287fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
3288fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3289fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   /* only shift and offset apply to stencil */
3290fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
3291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
3293fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
3294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
3295fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 &&
3296fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       srcType == GL_UNSIGNED_BYTE &&
3297fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       dstType == GL_UNSIGNED_BYTE) {
3298fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3299fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3300fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 &&
3301fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            srcType == GL_UNSIGNED_INT &&
3302fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            dstType == GL_UNSIGNED_INT &&
3303b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            !srcPacking->SwapBytes) {
3304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3306fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
3307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
3308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
3309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
3310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
3311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
3312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3314b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3315fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3316fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3317fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
3319179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3321fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
3323fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
3324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
3325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
3327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
3328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3329fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3330fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3331fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3332fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
3333fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
3334fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
3335fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3336fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
3337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3339fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3340fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3341fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3342fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3343fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
3344fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3345fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
3346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3351fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
3353fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3354fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3355fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
335608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
3357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3359fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3360fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3361fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         GLenum dstType, GLvoid *dest, const GLstencil *source,
336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         const struct gl_pixelstore_attrib *dstPacking )
336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLstencil stencil[MAX_WIDTH];
336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul       ctx->Pixel.MapStencilFlag) {
337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(stencil, source, n * sizeof(GLstencil));
337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_stencil( ctx, n, stencil );
337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.MapStencilFlag) {
337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_stencil( ctx, n, stencil );
338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = stencil;
338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLubyte) source[i];
339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
340523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLbyte) source[i];
340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLushort) source[i];
341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
342123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
342623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLshort) source[i];
342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
343323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
343823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLuint) source[i];
343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
344523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
345023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLint) source[i];
345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
345723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
346223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLfloat) source[i];
346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
346423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
346523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
346623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
346723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
346823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
346923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BITMAP:
347023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (dstPacking->LsbFirst) {
347123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
347223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 0;
347323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
347423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
347523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 0)
347623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
347723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
347823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift++;
347923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 8) {
348023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 0;
348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
348223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
348323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
348423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
348523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
348623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
348723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 7;
348823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
348923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
349023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 7)
349123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
349223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
349323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift--;
349423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift < 0) {
349523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 7;
349623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
349723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
349823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
349923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
350023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
350123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
350208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
350323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
350423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
350523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
350623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3509e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
3511e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul                         const struct gl_pixelstore_attrib *srcPacking )
3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3519e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = BYTE_TO_FLOAT(src[i]);
3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3528e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UBYTE_TO_FLOAT(src[i]);
3529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
3533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
3536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3537e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = SHORT_TO_FLOAT(src[i]);
3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
3542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
3545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3546e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = USHORT_TO_FLOAT(src[i]);
3547fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3555e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = INT_TO_FLOAT(src[i]);
3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3564e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UINT_TO_FLOAT(src[i]);
3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3569e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         MEMCPY(dest, source, n * sizeof(GLfloat));
3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
357208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3577e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul   /* apply depth scale and bias and clamp to [0,1] */
3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3581e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3582e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         dest[i] = CLAMP(d, 0.0F, 1.0F);
3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values.  The values are floats in [0,1].
359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */
359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
3593b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, const GLfloat *depthSpan,
359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking )
359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLfloat depthCopy[MAX_WIDTH];
359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 ||
359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                                   ctx->Pixel.DepthScale != 1.0;
360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (bias_or_scale) {
360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      GLuint i;
360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      for (i = 0; i < n; i++) {
360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat d;
360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         depthCopy[i] = CLAMP(d, 0.0F, 1.0F);
360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      depthSpan = depthCopy;
361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_USHORT( depthSpan[i] );
363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_INT( depthSpan[i] );
367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = depthSpan[i];
368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
369308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
369723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
369823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
369923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
370023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul/*
3701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data.  Apply byteswapping, byte flipping (bitmap).
3702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block.
3703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3725b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3726b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
3736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
3737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
3740b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth);
3741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
3742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
3743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
3744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
3745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
3747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
3748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
3749b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
3750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
3751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
3752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
3753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
3754b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
3755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
3757b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
3758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
3760b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
3761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
3763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
3766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3768