image.c revision 7a6b71ef2944bae1718e8167b2faaceb8422071c
16dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
26dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \file image.c
36dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Image handling.
46dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */
5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
87a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Version:  6.1
95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
107a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
327a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
33c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
363c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
378a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
405e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Compute ceiling of integer quotient of A divided by B. */
4427558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
4527558a160a9fe91745728d7626995cd88f8fe339Brian Paul
4627558a160a9fe91745728d7626995cd88f8fe339Brian Paul
476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
4964a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *
506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array.
516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of bytes.
526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \todo try this trick to flip bytes someday:
546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \code
5564a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
5664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
5764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \endcode
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
60b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
61b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
6664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul      b = (GLuint) p[i];        /* words are often faster than bytes */
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array.
846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words.
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
86b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
87b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
101b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
102b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type.
1196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type.
1216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
1236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum.
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
125b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
1447eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
1457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul	 return sizeof(GLhalfNV);
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel
1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types.
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
156b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type )
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
1737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
1747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul	 return sizeof(GLhalfNV);
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
182c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
184c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
186c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
188c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
192c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
201c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
202c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
203c5b995066020191982b2315fc45d05e068eee761Brian Paul          return sizeof(GLushort);
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format.
2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a 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;
248c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
249c5b995066020191982b2315fc45d05e068eee761Brian Paul         return 2;
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair.
2586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
2616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given.
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
264b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
266b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
2847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
2857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         return comps * sizeof(GLhalfNV);
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
295c450d57991628318696ee7a2bd052f91f480cda3Brian Paul            return sizeof(GLushort);
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
314c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
315c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
316c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (format == GL_YCBCR_MESA)
317c5b995066020191982b2315fc45d05e068eee761Brian Paul            return sizeof(GLushort);
318c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
319c5b995066020191982b2315fc45d05e068eee761Brian Paul            return -1;
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type.
3286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
3306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
3316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
3336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise.
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
335b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
336b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type )
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
3507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            case GL_HALF_FLOAT_NV:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3592a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
3717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            case GL_HALF_FLOAT_NV:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
3773d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul      case GL_BGR:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
3867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            case GL_HALF_FLOAT_NV:
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
4067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            case GL_HALF_FLOAT_NV:
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
419c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
420c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
421c5b995066020191982b2315fc45d05e068eee761Brian Paul             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
422c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_TRUE;
423c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
424c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_FALSE;
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
4326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
4336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the address of a pixel in an image (actually a volume).
4346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing.
4366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param image start of image data.
4386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
4396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height.
4406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
4416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type.
4426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes
4436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img which image in the volume (0 for 1D or 2D images)
4446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param row of pixel in the image
4456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param column of pixel in the image
4466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error.
4486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the \p packing information calculates the number of pixel/bytes
4506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * per row/image and refers it.
4516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib.
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
454b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
456b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
457b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
458b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
493b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
499b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
517551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      GLint topOfImage;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
519b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
533551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert) {
534551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         /* set pixel_addr to the last row */
535551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = bytes_per_row * (height - 1);
536551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes_per_row = -bytes_per_row;
537551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
538551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      else {
539551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = 0;
540551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
541551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
545551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul                 + topOfImage
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
5546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Compute the stride between image rows.
5566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes
5586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
5596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
5606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type.
5616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the stride in bytes for the given parameters.
5636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Computes the number of bytes per pixel and row and compensates for alignment.
5656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib.
567ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
568ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
569ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
570ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
571ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
572ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
573ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
574ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
575551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      GLint bytes;
576ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
577551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = (width + 7) / 8;
578ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
579ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
580551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = (packing->RowLength + 7) / 8;
581551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
582551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert) {
583551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         /* negate the bytes per row (negative row stride) */
584551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = -bytes;
585ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
586551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      return bytes;
587ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
588ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
589ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
590b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
591fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      GLint bytesPerRow, remainder;
592ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
593ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
594ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
595fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
596ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
597ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
598fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
599ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
600fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      remainder = bytesPerRow % packing->Alignment;
601fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      if (remainder > 0)
602fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow += (packing->Alignment - remainder);
603551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert)
604551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytesPerRow = -bytesPerRow;
605fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      return bytesPerRow;
606ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
607ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
608ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
609ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
6106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
611ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
612ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
613d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given
614d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type.
615d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */
616d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint
617d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
618d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLint width, GLint height,
619d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLenum format, GLenum type )
620d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{
621d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(packing);
622d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(type != GL_BITMAP);
623d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
624d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   {
625d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
626d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      GLint bytesPerRow, bytesPerImage, remainder;
627d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
628d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (bytesPerPixel <= 0)
629d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         return -1;  /* error */
630d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->RowLength == 0) {
631d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * width;
632d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
633d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else {
634d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
635d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
636d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      remainder = bytesPerRow % packing->Alignment;
637d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (remainder > 0)
638d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow += (packing->Alignment - remainder);
639d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
640d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->ImageHeight == 0)
641d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * height;
642d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else
643d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * packing->ImageHeight;
644d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
645d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      return bytesPerImage;
646d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   }
647d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul}
648d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
649d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
650d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/*
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6547c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6557c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
6567c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
658959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
6597c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
6607c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
6617c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
6627c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
6637c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
6647c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
6657c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
6667c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
6677c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
6687c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
6697c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
6707c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
6717c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
6727c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6817c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6827c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
6837c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
6857c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
6867c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
6877c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
6887c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
6917c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
6927c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
6937c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
6947c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
6967c652d77220610ecc19aaefa20876216b035e961Brian Paul
6977c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
701699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
702699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
703699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte.
704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid *
706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                     const struct gl_pixelstore_attrib *packing )
708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint bytes, row, width_in_bytes;
710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLubyte *buffer, *dst;
711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!pixels)
713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Alloc dest storage */
716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   bytes = ((width + 7) / 8 * height);
717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   buffer = (GLubyte *) MALLOC( bytes );
718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!buffer)
719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   dst = buffer;
724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
725b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      const GLubyte *src = (const GLubyte *)
726b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul         _mesa_image_address(packing, pixels, width, height,
727b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                             GL_COLOR_INDEX, GL_BITMAP, 0, row, 0);
728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!src) {
729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         FREE(buffer);
730699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return NULL;
731699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
732699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
745b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
750699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
772b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
777699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      dst += width_in_bytes;
798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   return buffer;
801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data.
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
807b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
808699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
809699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
811699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint row, width_in_bytes;
812699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   const GLubyte *src;
813fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!source)
815699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return;
816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
818699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   src = source;
819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
820b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest,
821b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                       width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!dst)
823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return;
824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
825699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
826699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
8303428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
835699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
844699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
846699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
847699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
848699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
849699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
851699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
852699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
853699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
854699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
855699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
856699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
858699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
859699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
861699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
862699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
863699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
865699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
866699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
868699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
869699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
870699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
872699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
873699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
875699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
876699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
877699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
878699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
879699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
880699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
881699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
882699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
884699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
885699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
886699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
887699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
889699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      src += width_in_bytes;
890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul}
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
894833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul/**
895833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * Apply various pixel transfer operations to an array of RGBA pixels
896833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * as indicated by the transferOps bitmask
897833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */
898833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paulvoid
899833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul_mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps,
900833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                              GLuint n, GLfloat rgba[][4])
901833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul{
902833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* scale & bias */
903833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_SCALE_BIAS_BIT) {
904833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_scale_and_bias_rgba(ctx, n, rgba,
905833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
906833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
907833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
908833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
909833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
910833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* color map lookup */
911833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_MAP_COLOR_BIT) {
912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_map_rgba( ctx, n, rgba );
913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_COLOR_TABLE lookup */
915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_COLOR_TABLE_BIT) {
916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->ColorTable, n, rgba);
917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* convolution */
919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_CONVOLUTION_BIT) {
920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      /* this has to be done in the calling code */
921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_scale_and_bias_rgba(ctx, n, rgba,
926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[RCOMP],
927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[GCOMP],
928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[BCOMP],
929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[ACOMP],
930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[RCOMP],
931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[GCOMP],
932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[BCOMP],
933833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[ACOMP]);
934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->PostConvolutionColorTable, n, rgba);
938833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
939833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* color matrix transform */
940833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
941833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_transform_rgba(ctx, n, rgba);
942833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
943833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
944833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
945833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->PostColorMatrixColorTable, n, rgba);
946833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
947833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* update histogram count */
948833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_HISTOGRAM_BIT) {
949833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
950833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
951833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* update min/max values */
952833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_MIN_MAX_BIT) {
953833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
954833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
9554923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul   /* clamping to [0,1] */
956833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_CLAMP_BIT) {
957833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      GLuint i;
958833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      for (i = 0; i < n; i++) {
959833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
960833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
961833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
962833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
963833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
964833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
965833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul}
966833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
967833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
968833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
96996385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/*
97096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified
97196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking.  Used by glReadPixels,
97296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc.
97396385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */
974116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid
9758cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_float( GLcontext *ctx,
976116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint n, CONST GLfloat rgbaIn[][4],
977b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLenum dstFormat, GLenum dstType,
978b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLvoid *dstAddr,
979b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            const struct gl_pixelstore_attrib *dstPacking,
980116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint transferOps )
981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{
982b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
983116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat luminance[MAX_WIDTH];
98494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul   const GLfloat (*rgba)[4];
985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLuint i;
986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
987116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   if (transferOps) {
988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* make copy of incoming data */
98947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4);  /* mac 32k limitation */
99047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgbaCopy, return);  /* mac 32k limitation */
99147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
992833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_memcpy(rgbaCopy, rgbaIn, n * 4 * sizeof(GLfloat));
99394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgbaCopy);
99494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      rgba = (const GLfloat (*)[4]) rgbaCopy;
995833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
996833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) {
997833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
998833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         return;
999116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
100047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
1001116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1002116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   else {
1003116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* use incoming data, not a copy */
100494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      rgba = (const GLfloat (*)[4]) rgbaIn;
1005116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1006ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
1007b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
100894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      /* compute luminance values */
10094923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      if (ctx->ClampFragmentColors) {
10104923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         for (i = 0; i < n; i++) {
10114923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
10124923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
10134923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         }
10144923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      }
10154923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      else {
10164923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         for (i = 0; i < n; i++) {
10174923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
10184923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         }
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1020116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1022116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /*
1023116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
1024116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    */
1025b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   switch (dstType) {
1026116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE:
1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1028b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1029b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1030116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1033116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1034116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1040116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
109508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_BYTE:
1100116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1101b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLbyte *dst = (GLbyte *) dstAddr;
1102b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1106116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1107116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
116708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT:
1172116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1173b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1174b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1178116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1179116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(luminance[i]);
1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
124008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1242b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps);
1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1245116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1247116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_SHORT:
1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1249b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLshort *dst = (GLshort *) dstAddr;
1250b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1254116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1255116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
131508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1317b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1320116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1321116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1322116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT:
1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1324b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1325b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1329116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1330116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
139108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1393b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1396116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1397116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1398116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_INT:
1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1400b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLint *dst = (GLint *) dstAddr;
1401b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1405116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1406116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
146708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1469b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1472116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1473116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1474116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_FLOAT:
1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1476b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLfloat *dst = (GLfloat *) dstAddr;
1477b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][RCOMP];
1481116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1482116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1483116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][GCOMP];
1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][BCOMP];
1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][ACOMP];
1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = luminance[i];
1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1499116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1500116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = luminance[i];
1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1505116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
1509116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1510116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1525116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
1529116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1530116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1536116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
1538116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
1539116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
1540116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1541116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
154308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1545b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1548116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1549116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
15507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
15517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
15527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            GLhalfNV *dst = (GLhalfNV *) dstAddr;
15537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            switch (dstFormat) {
15547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RED:
15557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
15577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_GREEN:
15597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
15617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BLUE:
15637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
15657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_ALPHA:
15677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
15697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_LUMINANCE:
15717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(luminance[i]);
15737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_LUMINANCE_ALPHA:
15757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
15777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
15787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RGB:
15817eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15827eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
15837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
15847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
15857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15877eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RGBA:
15887eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15897eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
15907eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
15917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
15927eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
15937eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15947eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15957eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BGR:
15967eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
15987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
15997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
16007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BGRA:
16037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
16047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
16057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
16067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
16077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
16087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_ABGR_EXT:
16117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
16127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
16137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
16147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
16157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
16167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               default:
16197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
16207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
16217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            if (dstPacking->SwapBytes) {
16227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
16237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
16247eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
16257eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
1626116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1627b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1628b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1629116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1630116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
1632116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1637b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1638b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1641116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
1642116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1647b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1648b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1652116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1657b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1658b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1661116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1662116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1667881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1668b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1670116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1672116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1673116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1676881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1677881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1678881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1679881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
1680881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1681881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
1682881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1683881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1684881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1685881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1686881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1687881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1688881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) <<  4)
1689881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1690881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
1691881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
1692881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1693881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1694116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1695116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1696881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1697b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1698116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1699116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1701116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1702116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1704116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1705881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1706881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1707881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1708881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
1709881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1710881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
1711881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1712881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1713881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1714881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1715881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1716881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1717881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
1718881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1719881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1720881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
1721881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1722881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1723116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1724116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1725881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1726b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1727116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1730116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1731116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1733116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1734881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1735881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1736881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1737881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
1738881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1739881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
1740881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1741881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1742881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1743881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1744881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1745881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1746881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
1747881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
1748881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
1749881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
1750881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1751881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1752116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1753116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1754881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1755b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1756116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1759116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1760116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1762116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1763881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1764881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1765881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1766881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
1767881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1768881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
1769881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1770881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1771881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1772881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1773881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1774881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1775881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
1776881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
1777881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
1778881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
1779881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1780881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1781116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1782116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1783b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1784b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1785116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1786116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1787116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1788116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1789116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1792b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1793b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1795116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1797116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1798116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1801b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1802b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1804116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
1805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1806116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1807116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
1812b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1813b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1815116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1817116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1818116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1821b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1822b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1823116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1824116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1826116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1827116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1830b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1831b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1833116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
1834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1835116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1836116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1839116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1840116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
1841b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1842b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1843116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1844116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1845116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1846116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1847116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1850b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1851b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1853116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1855116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1856116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1859b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1860b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1862116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
1863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1864116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
1865116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
1870b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1871b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1875116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1876116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1879b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1880b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1884116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1885116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1888b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1889b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
1892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1893116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
1894116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      default:
18998cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1904699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
1905699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address
1906699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type.
1907699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops.
1908699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct.
1909699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D()
19106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context
1911699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         n - number of pixels in the span
1912699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         rgba - the pixels
1913699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         format - dest packing format
19146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *         type - dest packing data type
1915699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         destination - destination packing address
1916699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         packing - pixel packing parameters
1917699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         transferOps - bitmask of IMAGE_*_BIT operations to apply
1918699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
1919699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid
19208cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_chan( GLcontext *ctx,
1921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLuint n, CONST GLchan srcRgba[][4],
1922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLenum dstFormat, GLenum dstType,
1923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLvoid *dstAddr,
1924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           const struct gl_pixelstore_attrib *dstPacking,
1925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLuint transferOps)
1926699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
1927cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul   ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0);
1928699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1929699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Test for optimized case first */
1930699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
1931699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1932699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
1933699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1934699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
1935699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1936b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLuint i;
1937699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLchan *dest = (GLchan *) dstAddr;
1938699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i = 0; i < n; i++) {
1939699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[0] = srcRgba[i][RCOMP];
1940699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[1] = srcRgba[i][GCOMP];
1941699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[2] = srcRgba[i][BCOMP];
1942699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest += 3;
1943699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1944699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1945aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) {
1946aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /* common simple case */
1947aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLuint i;
1948aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLubyte *dest = (GLubyte *) dstAddr;
1949aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      for (i = 0; i < n; i++) {
1950aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]);
1951aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]);
1952aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]);
1953aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]);
1954aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest += 4;
1955aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      }
1956aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   }
1957699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else {
1958699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* general solution */
1959699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLuint i;
196047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
196147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
196247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
1963699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      assert(n <= MAX_WIDTH);
1964699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* convert color components to floating point */
196594f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      for (i = 0; i < n; i++) {
1966699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
1967699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
1968699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
1969699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
1970699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
19718cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul      _mesa_pack_rgba_span_float(ctx, n, (const GLfloat (*)[4]) rgba,
1972699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstFormat, dstType, dstAddr,
1973699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstPacking, transferOps);
197447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
1975699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1976699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
1977699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
20137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2142959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2147959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
21517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
21527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
21537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            GLuint i;
21547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            const GLhalfNV *s = (const GLhalfNV *) src;
21557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            if (unpack->SwapBytes) {
21567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               for (i = 0; i < n; i++) {
21577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  GLhalfNV value = s[i];
21587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  SWAP2BYTE(value);
21597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(value);
21607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               }
21617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
21627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            else {
21637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               for (i = 0; i < n; i++)
21647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
21657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
21667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
21677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
216908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
21876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        srcType - data type of incoming data
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
22197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2222a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2223a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2224a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2226a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2228a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2230a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2231a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2232a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2234a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
2235a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
22575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      case GL_LUMINANCE:
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
226801429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul         redIndex = greenIndex = blueIndex = alphaIndex = 0;
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
231908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcFormat in extract float data");
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
23987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
23997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLhalfNV, _mesa_half_to_float);
24007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLhalfNV, _mesa_half_to_float);
24017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLhalfNV, _mesa_half_to_float);
24027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfNV, _mesa_half_to_float);
24037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
25863041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
25873041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
25883041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
25893041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
25973041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
25983041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
25993041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26003041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
26103041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
26113041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
26123041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26133041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
26213041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
26223041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26233041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
26243041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2629c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2635a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2636a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2637a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2638a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2646a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2647a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2648a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2649a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
267908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract float data");
2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2687fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
268894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Return GLchan values in the specified dest image format.
268994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * This is used by glDrawPixels and glTexImage?D().
26906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context
2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
26956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *         srcType - source image  data type
2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2697b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *         srcPacking - pixel unpacking parameters
2698fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
27038cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_chan( GLcontext *ctx,
2704699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint n, GLenum dstFormat, GLchan dest[],
2705699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLenum srcFormat, GLenum srcType,
2706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const GLvoid *source,
2707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const struct gl_pixelstore_attrib *srcPacking,
2708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint transferOps )
2709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
27115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
27397eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2742a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2743a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2744a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2746a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2748a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2750a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2751a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2752a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2755aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   if (transferOps == 0 ){
2756aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      if (srcType == CHAN_TYPE) {
2757aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2758aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGBA) {
2759aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
2760aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2761aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2762aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGB) {
2763aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2764aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2765aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2766aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2767aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2768aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2769aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2770aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2771aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2772aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2773aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2774aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2775aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2777aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2778aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2779aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
2780aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2781aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2782aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2783aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2784aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2785aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2786aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2787aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2788aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2789aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2790aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2791aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2792aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2793aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2795aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         }
2796aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == srcFormat) {
2797aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            GLint comps = _mesa_components_in_format(srcFormat);
2798aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            assert(comps > 0);
2799aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            MEMCPY( dest, source, n * comps * sizeof(GLchan) );
2800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2803aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /*
2804aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * Common situation, loading 8bit RGBA/RGB source images
2805aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * into 16/32 bit destination. (OSMesa16/32)
2806aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       */
2807aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      else if (srcType == GL_UNSIGNED_BYTE) {
2808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2820aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2821aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2822aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2823aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2824aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2825aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2826aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2827aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2828aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2829aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2830aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2831aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = UBYTE_TO_CHAN(src[3]);
2832aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2833aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2834aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2835aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2836aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul             }
2837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2838aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2839aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2840aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2841aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2842aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2843aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2844aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2845aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2846aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2847aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2848aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2849aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2850aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2851aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2852aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2853aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2854aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2855aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2856aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2857aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2858aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2859aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2860aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2861aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2862aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2863aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2870179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
287547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
287647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
2877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2878b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2889b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2891fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2892fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2893fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2894fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2895fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2896fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2897c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2900699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2901c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2902c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2903699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
290547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2906c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2910179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
2913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
2914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          * with color indexes.
2915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          */
2916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
2917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* non-color index data */
2920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2921b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2922c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2923c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
29244923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      /* Need to clamp if returning GLubytes or GLushorts */
292596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT
2926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      transferOps |= IMAGE_CLAMP_BIT;
292796385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif
2928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if (transferOps) {
2930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
2931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
2932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
29425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
297208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
297347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2974276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* Now return the GLchan data in the requested dstFormat */
2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2981699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
29846532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
2985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2990699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
29936532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
2994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2999699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
30026532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
3003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
3008699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
30116532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
3012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
3017699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
3020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
3021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
3022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
30236532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
3024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
3028699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
3031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
3032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
30336532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
3034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
303747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
3038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
304294f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul/**
304394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
304494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * instead of GLchan.
304594f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul */
3046c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
30478cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_float( GLcontext *ctx,
3048c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
3049c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
3050c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
3051b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                               const struct gl_pixelstore_attrib *srcPacking,
30524923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul                               GLuint transferOps )
3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
3054c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
30555e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
3056c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
3057c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
3058c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
3059c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
3060c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
3061c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3062c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
3063c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
3064c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
3065c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
3066c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
3067c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
3068c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
3069c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
3070c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
3071c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
3073c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
3077c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3080c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
3081c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
3082c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
30837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
3084c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
3085c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3086c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3088c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3091c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3092c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
3101c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
310347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
310447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
3108c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
3109c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
3112c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3117b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3119fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
3120fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
3121fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
3122fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
3123fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3124fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3125c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3126c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3127c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
3128699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
3129c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
3131699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
313347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3136c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
3138c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3140833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
3141833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3142833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          * with color indexes.
3143833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          */
3144833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3145c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3146c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
3147833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* non-color index data */
3148c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
3149b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3152833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if (transferOps) {
3153833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3154833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
3155833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
3157c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
3158c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3159c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
3160c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
31655e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3170c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
31958cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()");
319647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3200fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      /* Now pack results in the requested dstFormat */
3201c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3205c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
3211c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3212c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3213c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3214c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
3215c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3216c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3217c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3218c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3219c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
3220c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3221c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3222c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3223c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
3224c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3225c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3226c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3227c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3228c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
3229c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3230c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3231c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3232c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
3233c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3234c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3235c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3236c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3237c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
3238c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3239c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3240c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
3241c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
3242c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3243c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
3244c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
3245c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3246c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3247c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3248c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
3249c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3250c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3251c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
3252c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3253c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
3254c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
3255c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3256c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3257c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
325847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
3259c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
3260c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
3261c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3262c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
3265fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
3268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
32706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        dstType - destination data type
3271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
3272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
3273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
3274b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3275fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - the pixel transfer operations to apply
3276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
3279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
3280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
3281b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3282fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
3286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
3287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
32917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
3296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3298fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
3299fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
3303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
3304fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3308fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
3309b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
3310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
3314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
3315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
3316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
3317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
3318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3320b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3322fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3323fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* shift and offset indexes */
3324fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
3325fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      }
3326fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
3327fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* Apply lookup table */
3328fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_map_ci(ctx, n, indexes);
3329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
3332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
3333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
3334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
3336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
3343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
3345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
3352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
335508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
3356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
336123e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
336223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
336323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, GLvoid *dest, const GLuint *source,
336423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking,
336523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLuint transferOps )
336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLuint indexes[MAX_WIDTH];
336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(indexes, source, n * sizeof(GLuint));
337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_ci( ctx, n, indexes);
337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_ci(ctx, n, indexes);
338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = indexes;
338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLubyte) source[i];
339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3400a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLbyte) source[i];
340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
340523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3409a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLushort) source[i];
341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3421a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLshort) source[i];
342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
342623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3433a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLuint) source[i];
343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
343823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3445a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLint) source[i];
344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3457a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLfloat) source[i];
345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
346223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
34647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul   case GL_HALF_FLOAT_NV:
34657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
34667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLhalfNV *dst = (GLhalfNV *) dest;
34677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
34687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i = 0; i < n; i++) {
34697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
34707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
34717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
34727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
34737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
34747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
34757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
347623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
347708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
347823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
347923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
348023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3483fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
3484fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3485fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
3486fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
3487fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
34896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        dstType - destination data type
3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
3493b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3494fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - apply offset/bias/lookup ops?
3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
3498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
3499fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
3500b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           const struct gl_pixelstore_attrib *srcPacking,
3501fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                           GLuint transferOps )
3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3505fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
3506fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
35107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul          srcType == GL_HALF_FLOAT_NV ||
3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
3515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3517fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   /* only shift and offset apply to stencil */
3518fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
3522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
3523fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 &&
3524fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       srcType == GL_UNSIGNED_BYTE &&
3525fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       dstType == GL_UNSIGNED_BYTE) {
3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3528fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 &&
3529fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            srcType == GL_UNSIGNED_INT &&
3530fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            dstType == GL_UNSIGNED_INT &&
3531b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            !srcPacking->SwapBytes) {
3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
3535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
3536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
3537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3542b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3544fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3545fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
3547179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
3552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
3555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
3572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
3581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
358408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
359023e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
359123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
359223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         GLenum dstType, GLvoid *dest, const GLstencil *source,
359323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         const struct gl_pixelstore_attrib *dstPacking )
359423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLstencil stencil[MAX_WIDTH];
359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul       ctx->Pixel.MapStencilFlag) {
360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(stencil, source, n * sizeof(GLstencil));
360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_stencil( ctx, n, stencil );
360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.MapStencilFlag) {
360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_stencil( ctx, n, stencil );
360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = stencil;
361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLubyte) source[i];
362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLbyte) source[i];
363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLushort) source[i];
364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLshort) source[i];
365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLuint) source[i];
366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLint) source[i];
367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLfloat) source[i];
369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
369323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
36977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul   case GL_HALF_FLOAT_NV:
36987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
36997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLhalfNV *dst = (GLhalfNV *) dest;
37007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
37017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i=0;i<n;i++) {
37022c9f50dd4acc65ddfeb8e3fde98137711167e579Brian Paul            dst[i] = _mesa_float_to_half( (float) source[i] );
37037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
37047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
37057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
37067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
37077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
37087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
370923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BITMAP:
371023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (dstPacking->LsbFirst) {
371123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
371223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 0;
371323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
371423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
371523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 0)
371623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
371723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
371823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift++;
371923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 8) {
372023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 0;
372123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
372223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
372323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
372423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
372523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
372623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
372723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 7;
372823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
372923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
373023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 7)
373123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
373223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
373323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift--;
373423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift < 0) {
373523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 7;
373623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
373723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
373823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
373923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
374023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
374123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
374208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
374323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
374423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
374523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
374623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3747fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3748e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
3749fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
3750e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul                         const struct gl_pixelstore_attrib *srcPacking )
3751fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
3753fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
3754fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3755fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3756fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3758e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = BYTE_TO_FLOAT(src[i]);
3759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3760fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3761fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3762fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
3763fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3765fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3767e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UBYTE_TO_FLOAT(src[i]);
3768fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
3772fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3774fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
3775fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3776e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = SHORT_TO_FLOAT(src[i]);
3777fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3778fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3779fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
3781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
3784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3785e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = USHORT_TO_FLOAT(src[i]);
3786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
3790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
3793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3794e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = INT_TO_FLOAT(src[i]);
3795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
3799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3803e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UINT_TO_FLOAT(src[i]);
3804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3806fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3807fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3808e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         MEMCPY(dest, source, n * sizeof(GLfloat));
3809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
38107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      case GL_HALF_FLOAT_NV:
38117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
38127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            GLuint i;
38137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            const GLhalfNV *src = (const GLhalfNV *) source;
38147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            for (i = 0; i < n; i++) {
38157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               dest[i] = _mesa_half_to_float(src[i]);
38167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
38177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
38187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
3819fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
382008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
3821fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3825e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul   /* apply depth scale and bias and clamp to [0,1] */
3826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3829e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3830e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         dest[i] = CLAMP(d, 0.0F, 1.0F);
3831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3834fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3835fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
383723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values.  The values are floats in [0,1].
383823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */
383923e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
3840b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
384123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, const GLfloat *depthSpan,
384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking )
384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLfloat depthCopy[MAX_WIDTH];
384523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 ||
384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                                   ctx->Pixel.DepthScale != 1.0;
384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (bias_or_scale) {
385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      GLuint i;
385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      for (i = 0; i < n; i++) {
385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat d;
385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         depthCopy[i] = CLAMP(d, 0.0F, 1.0F);
385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
385723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      depthSpan = depthCopy;
385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
386523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
386623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
386723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
386823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
386923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
387023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
387123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
387223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
387323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
387423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
387523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
387623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
387723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
387823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
387923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
388023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
388123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
388223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
388323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
388423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_USHORT( depthSpan[i] );
388523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
388623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
388723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
388823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
388923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
389023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
389123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
389223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
389323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
389423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
389523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
389623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
389723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
389823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
389923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
390023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
390123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
390223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
390323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
390423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
390523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
390623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
390723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
390823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
390923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
391023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
391123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
391223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
391323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
391423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
391523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
391623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
391723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
391823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
391923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
392023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_INT( depthSpan[i] );
392123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
392223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
392323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
392423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
392523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
392623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
392723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
392823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
392923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
393023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
393123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
393223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = depthSpan[i];
393323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
393423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
393523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
393623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
393723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
393823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
39397eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul   case GL_HALF_FLOAT_NV:
39407eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
39417eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLhalfNV *dst = (GLhalfNV *) dest;
39427eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
39437eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i = 0; i < n; i++) {
39447eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            dst[i] = _mesa_float_to_half(depthSpan[i]);
39457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
39467eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
39477eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
39487eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
39497eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
39507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
395123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
395208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
395323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
395423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
395523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
395623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
39577a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
39587a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
39597a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Return all image data in a contiguous block.  This is used when we
39607a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * compile glDrawPixels, glTexImage, etc into a display list.  We
39617a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * need a copy of the data in a standard format.
3962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3984b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3985b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
3995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
3996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
3999b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth);
4000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
4001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
4002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
4003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
4004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
4005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
4006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
4007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
4008b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
4009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
4010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
4011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
4012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
4013b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
4014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
4016b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
4017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
4019b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
4020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
4022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
4023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
4024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
4025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
4026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
40276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
40286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
4029