image.c revision 3041d05bbcccfddba01a1eeaba01e5da0e1e99af
13041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul/* $Id: image.c,v 1.51 2001/01/02 22:02:51 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * Version:  3.5
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul * Copyright (C) 1999-2000  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++) {
623699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLubyte *src = _mesa_image_address( packing, pixels, width, height,
624699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
625699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                          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;
643699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            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;
670699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            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++) {
718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLubyte *dst = _mesa_image_address( packing, dest, width, height,
719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                          0, row, 0 );
721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!dst)
722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return;
723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
7293428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      src += width_in_bytes;
789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
790116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul}
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
792116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid
795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul_mesa_pack_float_rgba_span( GLcontext *ctx,
796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint n, CONST GLfloat rgbaIn[][4],
797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLenum dstFormat, GLenum dstType,
798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLvoid *dstAddr,
799b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            const struct gl_pixelstore_attrib *dstPacking,
800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint transferOps )
801116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{
802b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat luminance[MAX_WIDTH];
804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat (*rgba)[4];
805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLuint i;
806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   if (transferOps) {
808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* make copy of incoming data */
809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      GLfloat rgbaCopy[MAX_WIDTH][4];
810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][0] = rgbaIn[i][0];
812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][1] = rgbaIn[i][1];
813116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][2] = rgbaIn[i][2];
814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         rgbaCopy[i][3] = rgbaIn[i][3];
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
817116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaCopy;
818ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* scale & bias */
820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_SCALE_BIAS_BIT) {
82145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
82245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
82345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
82445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
82545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color map lookup */
828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_map_rgba( ctx, n, rgba );
830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_COLOR_TABLE lookup */
832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_TABLE_BIT) {
833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* convolution */
836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_CONVOLUTION_BIT) {
837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         /* this has to be done in the calling code */
838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
83945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
84045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
84145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         _mesa_scale_and_bias_rgba(ctx, n, rgba,
84245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[RCOMP],
84345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[GCOMP],
84445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[BCOMP],
84545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionScale[ACOMP],
84645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[RCOMP],
84745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[GCOMP],
84845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[BCOMP],
84945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.PostConvolutionBias[ACOMP]);
85045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul      }
851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* color matrix transform */
856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_transform_rgba(ctx, n, rgba);
858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* update histogram count */
864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_HISTOGRAM_BIT) {
865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* min/max here */
868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      if (transferOps & IMAGE_MIN_MAX_BIT) {
869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         if (ctx->MinMax.Sink)
871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            return;
872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   else {
875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* use incoming data, not a copy */
876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      rgba = (GLfloat (*)[4]) rgbaIn;
877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
878ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /* XXX clamp rgba to [0,1]? */
880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
882b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      for (i = 0; i < n; i++) {
884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
885116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         luminance[i] = CLAMP(sum, 0.0F, 1.0F);
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /*
890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    */
892b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   switch (dstType) {
893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE:
894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
895b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
896b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
904116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
905116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
906116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
907116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
908116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
909116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
910116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
911116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
912116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
913116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
914116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
915116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
916116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
917116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
918116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
919116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
920116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
921116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
922116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
923116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
924116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
925116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
926116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
927116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
928116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
929116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
930116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
931116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
932116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
933116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
934116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
935116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
936116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
937116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
938116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
939116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
940116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
941116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
942116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
943116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
944116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
945116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
946116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
947116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
948116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
949116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
950116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
951116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
952116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
953116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
954116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
955116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
956116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
957116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
958116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
959116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
960116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
961116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
962116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
963116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
964116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
965116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
966116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_BYTE:
967116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
968b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLbyte *dst = (GLbyte *) dstAddr;
969b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
970116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
971116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
972116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
973116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
975116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
977116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
978116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
982116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
984116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
989116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
994116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
995116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
996116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
997116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
998116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1000116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1009116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1011116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1012116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1013116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1014116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1015116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1016116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1017116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1018116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1019116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1021116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1033116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT:
1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1040b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1041b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(luminance[i]);
1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1109b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps);
1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_SHORT:
1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1116b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLshort *dst = (GLshort *) dstAddr;
1117b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1184b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT:
1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1191b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1192b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1260b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_INT:
1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1267b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLint *dst = (GLint *) dstAddr;
1268b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1324116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1336b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_FLOAT:
1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1343b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLfloat *dst = (GLfloat *) dstAddr;
1344b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][RCOMP];
1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][GCOMP];
1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][BCOMP];
1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][ACOMP];
1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = luminance[i];
1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = luminance[i];
1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1400116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1412b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1418b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1419b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1428b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1429b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1438b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1439b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1448b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1449b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1458881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1459b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1467881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1468881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1469881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1470881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
1471881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1472881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
1473881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1474881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1475881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1476881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1477881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1478881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1479881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) <<  4)
1480881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1481881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
1482881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
1483881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1484881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1487881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1488b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1496881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1497881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1498881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1499881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
1500881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1501881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
1502881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1503881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1504881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1505881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1506881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1507881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1508881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
1509881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1510881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1511881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
1512881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1513881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1516881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1517b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1525881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1526881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1527881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1528881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
1529881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1530881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
1531881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1532881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1533881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1534881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1535881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1536881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1537881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
1538881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
1539881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
1540881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
1541881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1542881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1544116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1545881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1546b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1550116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1551116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1553116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1554881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1555881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1556881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1557881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
1558881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1559881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
1560881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1561881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1562881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1563881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1564881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1565881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1566881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
1567881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
1568881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
1569881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
1570881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1571881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1572116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1573116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1574b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1575b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1576116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1577116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1578116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1579116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1580116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1582116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1583b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1584b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1585116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1586116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1587116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1588116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1589116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1591116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1592b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1593b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1594116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1595116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
1596116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1597116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1598116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1600116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1601116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1602116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
1603b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1604b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1605116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1606116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1607116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1608116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1609116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1611116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1612b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1613b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1614116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1615116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1616116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1617116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1618116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1620116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1621b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1622b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1623116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1624116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
1625116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1627116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1633b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1638116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1641b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1642b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1643116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1650b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1651b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1653116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1658116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
1661b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1662b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1663116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1668116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1670b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1671b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1679b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1680b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1681116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1682116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
1683116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1684116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
1685116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1686116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1687116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1688116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1689116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      default:
1690116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         gl_problem(ctx, "bad type in _mesa_pack_float_rgba_span");
1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1695179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul
1696699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
1697699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address
1698699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type.
1699699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops.
1700699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct.
1701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D()
1702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Input:  ctx - the context
1703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         n - number of pixels in the span
1704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         rgba - the pixels
1705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         format - dest packing format
1706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         type - dest packing datatype
1707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         destination - destination packing address
1708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         packing - pixel packing parameters
1709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         transferOps - bitmask of IMAGE_*_BIT operations to apply
1710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
1711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid
1712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_rgba_span( GLcontext *ctx,
1713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint n, CONST GLchan srcRgba[][4],
1714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLenum dstFormat, GLenum dstType,
1715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLvoid *dstAddr,
1716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      const struct gl_pixelstore_attrib *dstPacking,
1717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                      GLuint transferOps)
1718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
17199499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   ASSERT((ctx->NewState & _NEW_PIXEL) == 0);
1720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Test for optimized case first */
1722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
1723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
1725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
1727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLint i;
1729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLchan *dest = (GLchan *) dstAddr;
1730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i = 0; i < n; i++) {
1731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[0] = srcRgba[i][RCOMP];
1732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[1] = srcRgba[i][GCOMP];
1733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[2] = srcRgba[i][BCOMP];
1734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest += 3;
1735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else {
1738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* general solution */
1739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLfloat rgba[MAX_WIDTH][4];
1740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLuint i;
1741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      assert(n <= MAX_WIDTH);
1742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* convert color components to floating point */
1743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i=0;i<n;i++) {
1744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
1745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
1746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
1747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
1748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      _mesa_pack_float_rgba_span(ctx, n, (const GLfloat (*)[4]) rgba,
1750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstFormat, dstType, dstAddr,
1751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstPacking, transferOps);
1752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
1754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1918959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1923959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract_uint_indexes");
1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - datatype of incoming data
1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
1981a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
1982a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
1983a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
1985a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
1987a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1989a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
1990a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
1991a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1993a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
1994a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
20165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      case GL_LUMINANCE:
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcFormat in extract float data");
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23403041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
23413041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23423041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23433041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23513041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
23523041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23533041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23543041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23643041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
23653041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23663041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23673041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
23753041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
23763041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
23773041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
23783041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2389a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2390a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2391a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2392a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2400a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2401a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2402a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2403a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract float data");
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2442fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format.
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D().
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input:  ctx - the context
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcType - source image  datatype
2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2452b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *         srcPacking - pixel unpacking parameters
2453fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2458699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_chan_color_span( GLcontext *ctx,
2459699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint n, GLenum dstFormat, GLchan dest[],
2460699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLenum srcFormat, GLenum srcType,
2461699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const GLvoid *source,
2462699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const struct gl_pixelstore_attrib *srcPacking,
2463699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint transferOps )
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
24665e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2496a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2497a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2498a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2500a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2502a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2504a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2505a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2506a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2508250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul   /* this is intended for RGBA mode only */
2509b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   assert(ctx->Visual.RGBAflag);
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2512699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && srcType == CHAN_TYPE) {
2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstFormat == GL_RGBA) {
2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGBA) {
2515699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGB) {
2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2520699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLchan *src = (const GLchan *) source;
2521699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLchan *dst = dest;
2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2526699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dst[3] = CHAN_MAX;
2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 3;
2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 4;
2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else if (dstFormat == GL_RGB) {
2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGB) {
2535699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGBA) {
2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2540699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLchan *src = (const GLchan *) source;
2541699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLchan *dst = dest;
2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 4;
2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 3;
2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2552b09a4cd913e2de612fddf5411185a257da35647cBrian Paul      else if (dstFormat == srcFormat) {
2553b7d076fc96ac27117421653a043d00a95f789d24Brian Paul         GLint comps = _mesa_components_in_format(srcFormat);
2554b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         assert(comps > 0);
2555699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dest, source, n * comps * sizeof(GLchan) );
2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2561179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLfloat rgba[MAX_WIDTH][4];
2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2568b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2579b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2581fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2582fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2583fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2584fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2585fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2586fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2590699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2592c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2593699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2595c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2599179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2604b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2606fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
2607fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
260845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
260945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
261045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
261145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
261245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
2613fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2614fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
2615fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
2616fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2618c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2620fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
2621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2622fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
2623c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2624c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2625fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
2626fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
2627ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul            /* this has to be done in the calling code */
2628fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
262945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
263045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
263145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
263245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
263345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
263445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
263545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
263645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
263745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
263845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
263945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
264045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
2641c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2642fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
2643c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2644c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2646fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2649c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2650fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
2651c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2652c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
26531a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
2654fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
26551a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
26561a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2657fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
2658fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
26591a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* clamp to [0,1] */
2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      {
2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
26835e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
2713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            gl_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
2714276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* Now return the GLchan data in the requested dstFormat */
2719fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[dstRedIndex] = FLOAT_TO_CHAN(rgba[i][RCOMP]);
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[dstGreenIndex] = FLOAT_TO_CHAN(rgba[i][GCOMP]);
2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[dstBlueIndex] = FLOAT_TO_CHAN(rgba[i][BCOMP]);
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
2748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[dstAlphaIndex] = FLOAT_TO_CHAN(rgba[i][ACOMP]);
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
2757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
2763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[i] = FLOAT_TO_CHAN(rgba[i][RCOMP]);
2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
2768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
2773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            dst[0] = FLOAT_TO_CHAN(rgba[i][RCOMP]);
2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2781c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
2782c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx,
2783c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
2784c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
2785c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
2786b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                               const struct gl_pixelstore_attrib *srcPacking,
2787fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                               GLuint transferOps, GLboolean clamp )
2788c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
2789c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
27905e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2791c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2792c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
2793c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
2794c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
2795c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
2796c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2797c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
2798c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
2799c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
2800c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
2801c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
2802c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2803c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
2804c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
2805c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
2806c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
2807c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
2808c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
2809c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
2810c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2811c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
2812c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2813c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
2814c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2815c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
2816c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
2817c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
2818c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
2819c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2820c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2821c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2822c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2823c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2824c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2825c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2826c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2827c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2828c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2829c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2830c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2831c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2832c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* this is intended for RGBA mode only */
2833b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   assert(ctx->Visual.RGBAflag);
2834c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2835c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
2836c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
2837c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLfloat rgba[MAX_WIDTH][4];
2838c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
2839c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2840c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2841c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2842c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2843c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
2844c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
2845c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2846c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
2847c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
2848c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2849c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
2850c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
2851c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
2852c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2853b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2854c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2855fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2856fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2857fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2858fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2859fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2860fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2861c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2862c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2863c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
2864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2865c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2866c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2868c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2869c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2870c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2871c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
2872c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
2873c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2874c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2875c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2876c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
2877c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2878b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2879c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2880fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* scale and bias colors */
2881fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
288245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
288345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
288445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
288545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
288645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                   ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
2887fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2888fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* color map lookup */
2889fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MAP_COLOR_BIT) {
2890fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_rgba(ctx, n, rgba);
2891c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2892c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2893c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
2895c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2896fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
2897c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2898c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2899fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* convolution */
2900fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_CONVOLUTION_BIT) {
2901fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            /* XXX to do */
2902fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
290345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
290445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
290545015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul            _mesa_scale_and_bias_rgba(ctx, n, rgba,
290645015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[RCOMP],
290745015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[GCOMP],
290845015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[BCOMP],
290945015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionScale[ACOMP],
291045015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[RCOMP],
291145015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[GCOMP],
291245015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[BCOMP],
291345015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul                                      ctx->Pixel.PostConvolutionBias[ACOMP]);
291445015e4d79d63183f6d9c4e4fad655921e07b0abBrian Paul         }
2915c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2916fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
2917c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2918c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2919c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2920fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
2921c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2922c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2923c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2924fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
2925c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2926c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
29271a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
2928fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_HISTOGRAM_BIT) {
29291a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
29301a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2931fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* min/max here */
2932fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_MIN_MAX_BIT) {
29331a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2934c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2935c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2936c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2937c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* clamp to [0,1] */
29387a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul      if (clamp) {
2939c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2940c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2941c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2942c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2943c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2944c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2945c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2946c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2947c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2948c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
2949c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
2950c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2951c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
2952c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
2953c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
2954c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2955c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2956c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
29575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2958c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2959c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2960c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2961c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2962c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
2963c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2964c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
2965c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2966c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2967c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2968c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
2969c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
2970c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2971c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
2972c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2973c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
2974c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2975c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2976c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2977c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2978c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2979c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
2980c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2981c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2982c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2983c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
2984c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2985c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2986c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
2987fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()");
2988c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2989c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2990c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2991fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      /* Now pack results in the requested dstFormat */
2992c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
2993c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2994c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2995c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2996c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
2997c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2998c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2999c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3000c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3001c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
3002c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3003c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3004c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3005c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
3006c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3007c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3008c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3009c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3010c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
3011c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3012c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3013c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3014c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
3015c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3016c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3017c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3018c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3019c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
3020c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3021c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3022c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3023c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
3024c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3025c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3026c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3027c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3028c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
3029c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3030c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3031c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
3032c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
3033c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3034c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
3035c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
3036c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3037c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3038c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3039c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
3040c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3041c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3042c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
3043c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3044c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
3045c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3047c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3049c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3052c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
3057fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
3060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dstType - destination datatype
3063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
3064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
3066b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3067fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - the pixel transfer operations to apply
3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
3073b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3074fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
3082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
3083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
3087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
3088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3089fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
3090fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
3093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
3095fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3099fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
3100b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
3106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
3107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
3108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
3109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3111b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3113fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3114fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* shift and offset indexes */
3115fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
3116fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      }
3117fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
3118fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* Apply lookup table */
3119fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_map_ci(ctx, n, indexes);
3120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
3123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
3124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
3125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
3127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
3134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
3136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
3143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
3146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_index_span");
3147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
3154fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3155fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
3156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
3157fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
3158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
3159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dstType - destination datatype
3160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
3161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
3162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
3163b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3164fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - apply offset/bias/lookup ops?
3165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3167fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
3168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
3169fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
3170b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           const struct gl_pixelstore_attrib *srcPacking,
3171fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                           GLuint transferOps )
3172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
3174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3175fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
3176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
3178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
3179fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
3180fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
3181fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3182fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3183fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
3184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
3185fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3186fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   /* only shift and offset apply to stencil */
3187fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
3188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
3190fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
3191fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
3192fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 &&
3193fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       srcType == GL_UNSIGNED_BYTE &&
3194fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       dstType == GL_UNSIGNED_BYTE) {
3195fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3197fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 &&
3198fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            srcType == GL_UNSIGNED_INT &&
3199fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            dstType == GL_UNSIGNED_INT &&
3200b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            !srcPacking->SwapBytes) {
3201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3203fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
3204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
3205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
3206fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
3207fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
3208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
3209fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3210fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3211b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3212fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3213fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3214fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3215fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
3216179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3217fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3218fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3219fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
3220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
3221fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
3222fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3223fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
3224fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
3225fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3226fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3227fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3228fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3229fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
3230fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
3231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
3232fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3233fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
3234fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3235fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3236fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3237fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3238fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3239fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3240fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
3241fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3242fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
3243fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3244fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3245fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3246fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3248fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3249fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
3250fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3251fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3252fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
3253fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
3254fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3255fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3256fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3257fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3259fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3260fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3261fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest,
3262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
3263b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3264fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3266fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *depth = MALLOC(n * sizeof(GLfloat));
3267fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!depth)
3268fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return;
3269fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
3271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
3272fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3273fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3274fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = BYTE_TO_FLOAT(src[i]);
3277fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3279fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3280fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
3281fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3282fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3283fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3284fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3285fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UBYTE_TO_FLOAT(src[i]);
3286fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3287fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3288fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3289fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
3290fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
3293fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = SHORT_TO_FLOAT(src[i]);
3295fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3297fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3298fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
3299fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3300fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
3302fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3303fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = USHORT_TO_FLOAT(src[i]);
3304fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3305fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3306fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3307fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
3308fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3309fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3310fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
3311fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = INT_TO_FLOAT(src[i]);
3313fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3315fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3316fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
3317fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3318fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3319fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3321fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UINT_TO_FLOAT(src[i]);
3322fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3323fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3324fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         MEMCPY(depth, source, n * sizeof(GLfloat));
3327fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3328fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
3329fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         gl_problem(NULL, "bad type in _mesa_unpack_depth_span()");
33303c8299c77967611db138169c56a7c6a1c0086d1cBrian Paul         FREE(depth);
3331fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3332fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3333fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3334fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3335fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* apply depth scale and bias */
3336fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3339fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3340fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3341fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3342fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3343fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* clamp depth values to [0,1] and convert from floats to integers */
3344fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   {
3345b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      const GLfloat zs = ctx->Visual.DepthMaxF;
3346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3347fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3348ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs);
3349fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3351fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3352fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   FREE(depth);
3353fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3354fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3355fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3356fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data.  Apply byteswapping, byte flipping (bitmap).
3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block.
3360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3382b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3383b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
3393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
3394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
3397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth);
3398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
3399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
3400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
3401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
3402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
3404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
3405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
3406b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
3407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
3408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
3409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
3410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
3411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
3412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
3414b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
3415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
3417b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
3418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
3420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
3423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3425