image.c revision f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
37a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Version:  6.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
57a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
26f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
27f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \file image.c
28f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Image handling.
29f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
30f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
31f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
337a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h"
34c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
373c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
388a9507442a9811e2c4a4bac6a993e8a900c50d4dBrian Paul#include "histogram.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Compute ceiling of integer quotient of A divided by B. */
4527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
4627558a160a9fe91745728d7626995cd88f8fe339Brian Paul
4727558a160a9fe91745728d7626995cd88f8fe339Brian Paul
486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
5064a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *
516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array.
526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of bytes.
536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \todo try this trick to flip bytes someday:
556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \code
5664a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
5764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
5864a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \endcode
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
61b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
62b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
6764a23a0f9c6a08f6118f6488c191a079c43245a2Brian Paul      b = (GLuint) p[i];        /* words are often faster than bytes */
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array.
856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words.
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
87b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
88b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
102b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
103b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type.
1206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type.
1226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
1246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum.
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
126b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul	 return sizeof(GLhalfARB);
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel
1556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types.
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
157b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type )
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul	 return sizeof(GLhalfARB);
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
183c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
185c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
187c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
189c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
191c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
193c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
202c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
203c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
204c5b995066020191982b2315fc45d05e068eee761Brian Paul          return sizeof(GLushort);
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format.
2136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a bad format.
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
218b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format )
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
235070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
249c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
250c5b995066020191982b2315fc45d05e068eee761Brian Paul         return 2;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair.
2596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given.
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
265b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
267b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return comps * sizeof(GLhalfARB);
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
296c450d57991628318696ee7a2bd052f91f480cda3Brian Paul            return sizeof(GLushort);
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
315c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
316c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
317c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (format == GL_YCBCR_MESA)
318c5b995066020191982b2315fc45d05e068eee761Brian Paul            return sizeof(GLushort);
319c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
320c5b995066020191982b2315fc45d05e068eee761Brian Paul            return -1;
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type.
3296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
3316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
3326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
3346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise.
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
336b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul_mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type )
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3612a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
3803d960a0d84be0ffdd491dd37ff80bedf4a44fe92Brian Paul      case GL_BGR:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
424c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
425c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
426c5b995066020191982b2315fc45d05e068eee761Brian Paul             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
427c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_TRUE;
428c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
429c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_FALSE;
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
4376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
4386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the address of a pixel in an image (actually a volume).
4396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing.
4416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param image start of image data.
4436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
4446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height.
4456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
4466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type.
4476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes
4486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img which image in the volume (0 for 1D or 2D images)
4496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param row of pixel in the image
4506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param column of pixel in the image
4516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error.
4536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the \p packing information calculates the number of pixel/bytes
4556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * per row/image and refers it.
4566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib.
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
459b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
460b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
461b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
462b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
463b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
498b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
504b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
522551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      GLint topOfImage;
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
524b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
538551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert) {
539551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         /* set pixel_addr to the last row */
540551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = bytes_per_row * (height - 1);
541551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes_per_row = -bytes_per_row;
542551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
543551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      else {
544551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = 0;
545551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
546551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
550551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul                 + topOfImage
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
5596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
5606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Compute the stride between image rows.
5616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes
5636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
5646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
5656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type.
5666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the stride in bytes for the given parameters.
5686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Computes the number of bytes per pixel and row and compensates for alignment.
5706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
5716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib.
572ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
573ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
574ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
575ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
576ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
577ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
578ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
579ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
580551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      GLint bytes;
581ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
582551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = (width + 7) / 8;
583ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
584ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
585551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = (packing->RowLength + 7) / 8;
586551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
587551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert) {
588551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         /* negate the bytes per row (negative row stride) */
589551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes = -bytes;
590ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
591551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      return bytes;
592ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
593ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
594ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
595b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
596fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      GLint bytesPerRow, remainder;
597ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
598ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
599ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
600fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
601ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
602ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
603fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
604ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
605fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      remainder = bytesPerRow % packing->Alignment;
606fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      if (remainder > 0)
607fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow += (packing->Alignment - remainder);
608551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert)
609551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytesPerRow = -bytesPerRow;
610fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      return bytesPerRow;
611ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
612ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
613ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
614ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
6156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#if _HAVE_FULL_GL
616ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
617ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
618d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given
619d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type.
620d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */
621d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint
622d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
623d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLint width, GLint height,
624d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLenum format, GLenum type )
625d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{
626d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(packing);
627d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(type != GL_BITMAP);
628d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
629d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   {
630d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
631d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      GLint bytesPerRow, bytesPerImage, remainder;
632d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
633d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (bytesPerPixel <= 0)
634d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         return -1;  /* error */
635d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->RowLength == 0) {
636d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * width;
637d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
638d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else {
639d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
640d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
641d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      remainder = bytesPerRow % packing->Alignment;
642d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (remainder > 0)
643d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow += (packing->Alignment - remainder);
644d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
645d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->ImageHeight == 0)
646d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * height;
647d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else
648d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerImage = bytesPerRow * packing->ImageHeight;
649d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
650d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      return bytesPerImage;
651d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   }
652d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul}
653d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
654d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
655d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul/*
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6597c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6607c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
6617c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
663959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
6647c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
6657c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
6667c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
6677c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
6687c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
6697c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
6707c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
6717c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
6727c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
6737c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
6747c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
6757c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
6767c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
6777c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
683fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
6867c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
6877c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
6887c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
6907c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
6917c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
6927c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
6937c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
6967c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
6977c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
6987c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
6997c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
7017c652d77220610ecc19aaefa20876216b035e961Brian Paul
7027c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
706699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
707699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
708699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * order with row alignment = 1 byte.
709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian PaulGLvoid *
711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                     const struct gl_pixelstore_attrib *packing )
713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
714699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint bytes, row, width_in_bytes;
715699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLubyte *buffer, *dst;
716699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
717699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!pixels)
718699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
719699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
720699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Alloc dest storage */
721699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   bytes = ((width + 7) / 8 * height);
722699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   buffer = (GLubyte *) MALLOC( bytes );
723699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!buffer)
724699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return NULL;
725699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
726699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
727699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
728699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   dst = buffer;
729699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
730b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      const GLubyte *src = (const GLubyte *)
731b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul         _mesa_image_address(packing, pixels, width, height,
732b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                             GL_COLOR_INDEX, GL_BITMAP, 0, row, 0);
733699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!src) {
734699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         FREE(buffer);
735699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return NULL;
736699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
737699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
738699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
739699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
740699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
741699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
742699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
743699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
744699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
745699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
746699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
747699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
748699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
749699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
750b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
751699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
752699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
753699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
754699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
755699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
756699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
757699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
758699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
759699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
760699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
761699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
762699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
763699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
764699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
765699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
766699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
767699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
768699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
769699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
770699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
771699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
772699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
773699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
774699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
775699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
776699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
777b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul            const GLubyte *s = src;
778699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
779699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
780699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
781699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
782699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
783699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
784699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
785699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
786699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
787699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
788699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
789699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
790699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
791699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
792699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
793699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
794699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
795699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
796699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
797699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
798699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
799699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
800699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
801699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
802699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      dst += width_in_bytes;
803699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
804699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
805699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   return buffer;
806699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
807699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
810699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack bitmap data.
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
812b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
813699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
814699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
816699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   GLint row, width_in_bytes;
817699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   const GLubyte *src;
818fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
819699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (!source)
820699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      return;
821699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
822699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   width_in_bytes = CEILING( width, 8 );
823699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   src = source;
824699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   for (row = 0; row < height; row++) {
825b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *dst = (GLubyte *) _mesa_image_address( packing, dest,
826b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul                       width, height, GL_COLOR_INDEX, GL_BITMAP, 0, row, 0 );
827699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (!dst)
828699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         return;
829699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
830699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      if (packing->SkipPixels == 0) {
831699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         MEMCPY( dst, src, width_in_bytes );
832699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
833699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            flip_bytes( dst, width_in_bytes );
834699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
8353428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
836699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      else {
837699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
838699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLint i;
839699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         if (packing->LsbFirst) {
840699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
841699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
842699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
843699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
844699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
845699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
846699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
847699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
848699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
849699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 128) {
850699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 1;
851699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
852699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
853699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
854699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask << 1;
855699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
856699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
857699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
858699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
859699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
860699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
861699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
862699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
863699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
864699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
865699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
866699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         else {
867699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
868699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte dstMask = 128;
869699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            const GLubyte *s = src;
870699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            GLubyte *d = dst;
871699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            *d = 0;
872699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            for (i = 0; i < width; i++) {
873699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (*s & srcMask) {
874699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d |= dstMask;
875699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
876699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (srcMask == 1) {
877699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = 128;
878699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  s++;
879699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
880699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
881699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  srcMask = srcMask >> 1;
882699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
883699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               if (dstMask == 1) {
884699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = 128;
885699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  d++;
886699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  *d = 0;
887699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
888699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               else {
889699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                  dstMask = dstMask >> 1;
890699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               }
891699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            }
892699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         }
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
894699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      src += width_in_bytes;
895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul}
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
899833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul/**
900833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * Apply various pixel transfer operations to an array of RGBA pixels
901833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul * as indicated by the transferOps bitmask
902833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul */
903833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paulvoid
904833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul_mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLuint transferOps,
905833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                              GLuint n, GLfloat rgba[][4])
906833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul{
907833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* scale & bias */
908833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_SCALE_BIAS_BIT) {
909833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_scale_and_bias_rgba(ctx, n, rgba,
910833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.RedScale, ctx->Pixel.GreenScale,
911833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.BlueScale, ctx->Pixel.AlphaScale,
912833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.RedBias, ctx->Pixel.GreenBias,
913833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.BlueBias, ctx->Pixel.AlphaBias);
914833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
915833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* color map lookup */
916833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_MAP_COLOR_BIT) {
917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_map_rgba( ctx, n, rgba );
918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_COLOR_TABLE lookup */
920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_COLOR_TABLE_BIT) {
921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->ColorTable, n, rgba);
922833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
923833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* convolution */
924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_CONVOLUTION_BIT) {
925833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      /* this has to be done in the calling code */
926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_problem(ctx, "IMAGE_CONVOLUTION_BIT set in _mesa_apply_transfer_ops");
927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_CONVOLUTION_RED/GREEN/BLUE/ALPHA_SCALE/BIAS */
929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_CONVOLUTION_SCALE_BIAS) {
930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_scale_and_bias_rgba(ctx, n, rgba,
931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[RCOMP],
932833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[GCOMP],
933833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[BCOMP],
934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionScale[ACOMP],
935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[RCOMP],
936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[GCOMP],
937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[BCOMP],
938833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                                ctx->Pixel.PostConvolutionBias[ACOMP]);
939833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
940833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
941833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
942833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->PostConvolutionColorTable, n, rgba);
943833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
944833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* color matrix transform */
945833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
946833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_transform_rgba(ctx, n, rgba);
947833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
948833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
949833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
950833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_lookup_rgba_float(&ctx->PostColorMatrixColorTable, n, rgba);
951833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
952833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* update histogram count */
953833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_HISTOGRAM_BIT) {
954833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
955833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
956833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   /* update min/max values */
957833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_MIN_MAX_BIT) {
958833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
959833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
9604923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul   /* clamping to [0,1] */
961833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   if (transferOps & IMAGE_CLAMP_BIT) {
962833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      GLuint i;
963833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      for (i = 0; i < n; i++) {
964833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
965833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
966833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
967833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
968833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
969833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul   }
970833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul}
971833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
972833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
973833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
97496385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul/*
97596385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * Used to pack an array [][4] of RGBA GLchan colors as specified
97696385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * by the dstFormat, dstType and dstPacking.  Used by glReadPixels,
97796385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul * glGetConvolutionFilter(), etc.
97896385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul */
979116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paulvoid
9808cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_float( GLcontext *ctx,
981116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint n, CONST GLfloat rgbaIn[][4],
982b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLenum dstFormat, GLenum dstType,
983b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            GLvoid *dstAddr,
984b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            const struct gl_pixelstore_attrib *dstPacking,
985116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                            GLuint transferOps )
986116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul{
987b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   const GLint comps = _mesa_components_in_format(dstFormat);
988116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLfloat luminance[MAX_WIDTH];
98994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul   const GLfloat (*rgba)[4];
990116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   GLuint i;
991116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
992116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   if (transferOps) {
993116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* make copy of incoming data */
99447cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgbaCopy, MAX_WIDTH, 4);  /* mac 32k limitation */
99547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgbaCopy, return);  /* mac 32k limitation */
99647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
997833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      _mesa_memcpy(rgbaCopy, rgbaIn, n * 4 * sizeof(GLfloat));
99894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgbaCopy);
99994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      rgba = (const GLfloat (*)[4]) rgbaCopy;
1000833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
1001833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) {
1002833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
1003833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         return;
1004116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      }
100547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgbaCopy);  /* mac 32k limitation */
1006116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1007116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   else {
1008116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      /* use incoming data, not a copy */
100994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      rgba = (const GLfloat (*)[4]) rgbaIn;
1010116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1011ef9025a641624991113b7df2eecdf7c8e330a31cBrian Paul
1012b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
101394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      /* compute luminance values */
10144923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      if (ctx->ClampFragmentColors) {
10154923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         for (i = 0; i < n; i++) {
10164923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
10174923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
10184923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         }
10194923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      }
10204923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      else {
10214923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         for (i = 0; i < n; i++) {
10224923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
10234923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul         }
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1025116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   }
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1027116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul   /*
1028116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    * Pack/store the pixels.  Ugh!  Lots of cases!!!
1029116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul    */
1030b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul   switch (dstType) {
1031116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE:
1032116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1033b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1034b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1035116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1036116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1037116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1038116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1039116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1040116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1041116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1042116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1043116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1044116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1045116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1046116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1047116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1048116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1049116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1050116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1051116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1052116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1053116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
1054116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1055116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1056116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1057116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
1058116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1059116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1060116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1061116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1062116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1063116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1064116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1065116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1066116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1067116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1068116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1069116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1070116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1071116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1072116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1073116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1074116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1075116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1076116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1077116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1078116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1079116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1080116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1081116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1082116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1083116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1084116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1085116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1086116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1087116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1088116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1089116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1090116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1091116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1092116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1093116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
1094116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
1095116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
1096116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
1097116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1098116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1099116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
110008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1101116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1102116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1103116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1104116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_BYTE:
1105116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1106b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLbyte *dst = (GLbyte *) dstAddr;
1107b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1108116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1109116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1110116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1111116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1112116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1113116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1114116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1115116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1116116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1117116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1118116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1119116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1120116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1121116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1122116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1123116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1124116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1125116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1126116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
1127116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1128116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1129116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1130116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
1131116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1132116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1133116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1134116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1135116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1136116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1137116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1138116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1139116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1140116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1141116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1142116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1143116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1144116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1145116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1146116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1147116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1148116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1149116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1150116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1151116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1152116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1153116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1154116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1155116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1156116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1157116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1158116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1159116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1160116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1161116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1162116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1163116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1164116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1165116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
1166116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
1167116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
1168116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
1169116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1170116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1171116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
117208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1173116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1174116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1175116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1176116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT:
1177116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1178b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1179b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1180116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1181116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1182116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1183116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1184116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1185116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1186116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1187116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1188116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1189116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1190116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1191116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1192116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1193116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1194116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1195116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1196116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1197116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1198116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_USHORT(luminance[i]);
1199116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1200116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1201116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1202116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
1203116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1204116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1205116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1206116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1207116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1208116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1209116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1210116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1211116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1212116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1213116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1214116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1215116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1216116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1217116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1218116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1219116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1220116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1221116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1222116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1223116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1224116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1225116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1226116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1227116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1228116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1229116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1230116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1231116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1232116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1233116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1234116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1235116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1236116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1237116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1238116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
1239116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
1240116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1241116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1242116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1243116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1244116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
124508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1246116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1247b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1248116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps);
1249116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1250116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1251116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1252116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_SHORT:
1253116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1254b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLshort *dst = (GLshort *) dstAddr;
1255b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1256116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1257116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1258116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1259116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1260116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1261116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1262116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1263116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1264116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1265116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1266116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1267116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1268116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1269116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1270116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1271116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1272116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1273116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1274116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
1275116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1276116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1277116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1278116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1279116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1280116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1281116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1282116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1283116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1284116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1285116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1286116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1287116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1288116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1289116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1290116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1291116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1292116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1293116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1294116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1295116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1296116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1297116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1298116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1299116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1300116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1301116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1302116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1303116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1304116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1305116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1306116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1307116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1308116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1309116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1310116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1311116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1312116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1313116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1314116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1315116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1316116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1317116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1318116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1319116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
132008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1322b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1323116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1325116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1326116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1327116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT:
1328116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1329b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1330b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1331116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1332116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1333116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1334116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1335116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1336116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1337116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1338116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1339116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1340116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1341116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1342116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1343116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1344116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1345116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1346116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1347116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1348116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1349116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_UINT(luminance[i]);
1350116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1351116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1352116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1353116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1354116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1355116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1356116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1357116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1358116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1359116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1360116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1361116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1362116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1363116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1364116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1365116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1366116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1367116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1368116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1369116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1370116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1371116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1372116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1373116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1374116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1375116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1376116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1377116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1378116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1379116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1380116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1381116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1382116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1383116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1384116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1385116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1386116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1387116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1388116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1389116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1390116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1391116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1392116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1393116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1394116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1395116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
139608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1398b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1399116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1401116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1402116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1403116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_INT:
1404116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1405b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLint *dst = (GLint *) dstAddr;
1406b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1407116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1408116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1409116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1410116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1411116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1412116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1413116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1414116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1415116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1416116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1417116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1418116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1419116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1420116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1421116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1422116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1423116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1424116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1425116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = FLOAT_TO_INT(luminance[i]);
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1427116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1428116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1429116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1430116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1431116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1432116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1433116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1434116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1435116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1436116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1437116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1438116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1439116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1440116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1441116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1442116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1443116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1444116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1445116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1446116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1447116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1448116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1449116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1450116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1451116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1452116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1453116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1454116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1455116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1456116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1457116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1458116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1459116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1460116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1461116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1462116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1463116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1464116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1465116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1466116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1467116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1468116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1469116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1470116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1471116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
147208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1474b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1475116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1477116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1478116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1479116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_FLOAT:
1480116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         {
1481b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLfloat *dst = (GLfloat *) dstAddr;
1482b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            switch (dstFormat) {
1483116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RED:
1484116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1485116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][RCOMP];
1486116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1487116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_GREEN:
1488116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1489116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][GCOMP];
1490116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1491116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BLUE:
1492116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1493116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][BCOMP];
1494116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1495116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ALPHA:
1496116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1497116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = rgba[i][ACOMP];
1498116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1499116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE:
1500116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++)
1501116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i] = luminance[i];
1502116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1503116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_LUMINANCE_ALPHA:
1504116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1505116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+0] = luminance[i];
1506116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*2+1] = rgba[i][ACOMP];
1507116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1508116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1509116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGB:
1510116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1511116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][RCOMP];
1512116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1513116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][BCOMP];
1514116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1515116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1516116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_RGBA:
1517116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1518116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][RCOMP];
1519116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1520116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][BCOMP];
1521116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1522116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1523116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1524116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGR:
1525116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1526116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+0] = rgba[i][BCOMP];
1527116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+1] = rgba[i][GCOMP];
1528116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*3+2] = rgba[i][RCOMP];
1529116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1530116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1531116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_BGRA:
1532116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1533116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][BCOMP];
1534116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][GCOMP];
1535116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][RCOMP];
1536116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][ACOMP];
1537116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1538116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1539116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               case GL_ABGR_EXT:
1540116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  for (i=0;i<n;i++) {
1541116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+0] = rgba[i][ACOMP];
1542116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+1] = rgba[i][BCOMP];
1543116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+2] = rgba[i][GCOMP];
1544116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                     dst[i*4+3] = rgba[i][RCOMP];
1545116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  }
1546116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                  break;
1547116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               default:
154808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1550b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            if (dstPacking->SwapBytes) {
1551116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               _mesa_swap4( (GLuint *) dst, n * comps );
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1553116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1554116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
15567eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
1557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            GLhalfARB *dst = (GLhalfARB *) dstAddr;
15587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            switch (dstFormat) {
15597eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RED:
15607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
15627eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_GREEN:
15647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
15667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BLUE:
15687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
15707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_ALPHA:
15727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
15747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_LUMINANCE:
15767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++)
15777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i] = _mesa_float_to_half(luminance[i]);
15787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_LUMINANCE_ALPHA:
15807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15817eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
15827eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
15837eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15847eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15857eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RGB:
15867eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15877eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
15887eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
15897eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
15907eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15917eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
15927eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_RGBA:
15937eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
15947eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
15957eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
15967eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
15977eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
15987eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
15997eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16007eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BGR:
16017eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
16027eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
16037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
16047eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
16057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16077eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_BGRA:
16087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
16097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
16107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
16117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
16127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
16137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               case GL_ABGR_EXT:
16167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  for (i=0;i<n;i++) {
16177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
16187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
16197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
16207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
16217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  }
16227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  break;
16237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               default:
16247eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
16257eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
16267eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            if (dstPacking->SwapBytes) {
16277eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               _mesa_swap2( (GLushort *) dst, n * comps );
16287eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
16297eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
16307eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
1631116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1632b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1633b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1634116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1635116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1636116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
1637116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1639116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1640116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1641116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1642b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1643b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLubyte *dst = (GLubyte *) dstAddr;
1644116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1645116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1646116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
1647116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1649116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1650116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1651116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1652b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1653b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1654116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1655116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1656116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1657116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1659116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1660116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1661116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1662b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGB) {
1663b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1664116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1665116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1666116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
1667116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1669116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1670116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1671116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1672881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1673b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1674116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1675116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1676116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1677116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1678116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1680116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1681881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1682881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1683881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1684881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F)) << 12)
1685881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1686881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  4)
1687881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1688881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1689881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1690881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1691881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1692881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1693881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F)) <<  4)
1694881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1695881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) << 12)
1696881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F))      );
1697881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1698881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1699116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1700116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1701881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1702b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1703116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1704116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1705116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1706116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1707116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1709116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1710881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1711881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1712881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1713881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 15.0F))      )
1714881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
1715881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) <<  8)
1716881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1717881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1718881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1719881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1720881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1721881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1722881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 15.0F))      )
1723881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1724881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
1725881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12);
1726881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1727881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1728116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1729116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1730881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1731b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1732116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1733116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1734116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1735116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1736116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1738116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1739881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1740881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1741881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1742881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11)
1743881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
1744881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) <<  1)
1745881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1746881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1747881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1748881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1749881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1750881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1751881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F)) << 11)
1752881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  6)
1753881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  1)
1754881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F))      );
1755881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1756881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1757116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1758116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1759881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         if (dstFormat == GL_RGBA) {
1760b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1761116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1762116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1763116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1764116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1765116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1767116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1768881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_BGRA) {
1769881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1770881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1771881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][BCOMP] * 31.0F))      )
1772881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
1773881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] * 31.0F)) << 10)
1774881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1775881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1776881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1777881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1778881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            GLushort *dst = (GLushort *) dstAddr;
1779881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            for (i=0;i<n;i++) {
1780881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul               dst[i] = (((GLint) (rgba[i][ACOMP] * 31.0F))      )
1781881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  5)
1782881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][GCOMP] * 31.0F)) << 10)
1783881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul                      | (((GLint) (rgba[i][RCOMP] *  1.0F)) << 15);
1784881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul            }
1785881ec9ee6740b509e59cdcf0344c5b73f3f6fa8aBrian Paul         }
1786116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1787116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1788b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1789b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1790116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1791116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1792116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1793116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1794116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1796116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1797b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1798b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1799116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1800116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1801116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1802116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1803116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1805116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1806b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1807b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1808116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1809116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
1810116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1811116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1812116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1814116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1815116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1816116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
1817b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1818b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1819116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1820116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1821116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1822116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1823116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1825116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1826b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1827b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1828116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1829116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1830116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
1831116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1832116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1834116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1835b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1836b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1837116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1838116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
1839116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1840116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
1841116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1843116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1844116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1845116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_10_10_10_2:
1846b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1847b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1848116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1849116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1850116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1851116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1852116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1854116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1855b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1856b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1857116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1858116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1859116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
1860116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1861116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1863116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1864b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1865b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1866116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1867116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
1868116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1869116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
1870116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1871116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1872116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1873116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1874116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
1875b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         if (dstFormat == GL_RGBA) {
1876b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1877116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1878116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1879116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1880116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1881116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1882116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1883116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1884b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_BGRA) {
1885b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1886116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1887116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1888116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
1889116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1890116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1891116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1892116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1893b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul         else if (dstFormat == GL_ABGR_EXT) {
1894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            GLuint *dst = (GLuint *) dstAddr;
1895116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            for (i=0;i<n;i++) {
1896116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul               dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
1897116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1898116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
1899116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul                      | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1900116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul            }
1901116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         }
1902116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul         break;
1903116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul      default:
19048cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1909699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul/*
1910699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack the given RGBA span into client memory at 'dest' address
1911699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * in the given pixel format and type.
1912699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Optionally apply the enabled pixel transfer ops.
1913699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * Pack into memory using the given packing params struct.
1914699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul * This is used by glReadPixels and glGetTexImage?D()
19156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context
1916699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         n - number of pixels in the span
1917699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         rgba - the pixels
1918699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         format - dest packing format
19196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *         type - dest packing data type
1920699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         destination - destination packing address
1921699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         packing - pixel packing parameters
1922699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul *         transferOps - bitmask of IMAGE_*_BIT operations to apply
1923699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul */
1924699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paulvoid
19258cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_pack_rgba_span_chan( GLcontext *ctx,
1926833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLuint n, CONST GLchan srcRgba[][4],
1927833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLenum dstFormat, GLenum dstType,
1928833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLvoid *dstAddr,
1929833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           const struct gl_pixelstore_attrib *dstPacking,
1930833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul                           GLuint transferOps)
1931699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul{
1932cc22179cd855dad85a28c40416873a07e8b7cc0cBrian Paul   ASSERT((ctx->NewState & _NEW_PIXEL) == 0 || transferOps == 0);
1933699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1934699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   /* Test for optimized case first */
1935699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   if (transferOps == 0 && dstFormat == GL_RGBA && dstType == CHAN_TYPE) {
1936699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1937699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      MEMCPY(dstAddr, srcRgba, n * 4 * sizeof(GLchan));
1938699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1939699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else if (transferOps == 0 && dstFormat == GL_RGB && dstType == CHAN_TYPE) {
1940699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* common simple case */
1941b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLuint i;
1942699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLchan *dest = (GLchan *) dstAddr;
1943699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      for (i = 0; i < n; i++) {
1944699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[0] = srcRgba[i][RCOMP];
1945699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[1] = srcRgba[i][GCOMP];
1946699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest[2] = srcRgba[i][BCOMP];
1947699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         dest += 3;
1948699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
1949699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1950aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   else if (transferOps == 0 && dstFormat == GL_RGBA && dstType == GL_UNSIGNED_BYTE) {
1951aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /* common simple case */
1952aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLuint i;
1953aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      GLubyte *dest = (GLubyte *) dstAddr;
1954aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      for (i = 0; i < n; i++) {
1955aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[0] = CHAN_TO_UBYTE(srcRgba[i][RCOMP]);
1956aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[1] = CHAN_TO_UBYTE(srcRgba[i][GCOMP]);
1957aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[2] = CHAN_TO_UBYTE(srcRgba[i][BCOMP]);
1958aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest[3] = CHAN_TO_UBYTE(srcRgba[i][ACOMP]);
1959aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         dest += 4;
1960aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      }
1961aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul   }
1962699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   else {
1963699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* general solution */
1964699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      GLuint i;
196547cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
196647cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
196747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul
1968699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      assert(n <= MAX_WIDTH);
1969699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* convert color components to floating point */
197094f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul      for (i = 0; i < n; i++) {
1971699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][RCOMP] = CHAN_TO_FLOAT(srcRgba[i][RCOMP]);
1972699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][GCOMP] = CHAN_TO_FLOAT(srcRgba[i][GCOMP]);
1973699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][BCOMP] = CHAN_TO_FLOAT(srcRgba[i][BCOMP]);
1974699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         rgba[i][ACOMP] = CHAN_TO_FLOAT(srcRgba[i][ACOMP]);
1975699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      }
19768cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul      _mesa_pack_rgba_span_float(ctx, n, (const GLfloat (*)[4]) rgba,
1977699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstFormat, dstType, dstAddr,
1978699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                                 dstPacking, transferOps);
197947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
1980699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul   }
1981699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul}
1982699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1983699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
2147959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
2152959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
21577eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
21587eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            GLuint i;
2159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            const GLhalfARB *s = (const GLhalfARB *) src;
21607eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            if (unpack->SwapBytes) {
21617eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               for (i = 0; i < n; i++) {
2162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul                  GLhalfARB value = s[i];
21637eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  SWAP2BYTE(value);
21647eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(value);
21657eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               }
21667eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
21677eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            else {
21687eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               for (i = 0; i < n; i++)
21697eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
21707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
21717eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
21727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
217408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
21926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        srcType - data type of incoming data
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2206c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2207c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2208c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2209c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2227a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2228a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2229a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2231a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2233a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2235a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2236a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2237a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2239a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
2240a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
22625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      case GL_LUMINANCE:
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
227301429fa46a05cba7d2d11825facd7d8e6117dacdBrian Paul         redIndex = greenIndex = blueIndex = alphaIndex = 0;
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2286c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
232408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcFormat in extract float data");
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
2343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
2404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
2405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
2406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
2407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfARB, _mesa_half_to_float);
24087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
2529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
2530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
2531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
2532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
2536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
2554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
2555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
2556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
2557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
25913041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
25923041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
25933041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
25943041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
26023041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
26033041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
26043041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26053041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
26153041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24)       );
26163041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
26173041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26183041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
2619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
26263041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][rComp] = UBYTE_TO_FLOAT((p      ) & 0xff);
26273041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][gComp] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
26283041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][bComp] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
26293041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul               rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24)       );
2630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2637c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2638c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2640a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2641a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2642a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2643a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2651a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2652a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2653a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2654a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
268408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad srcType in extract float data");
2685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2692fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
269394f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Return GLchan values in the specified dest image format.
269494f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * This is used by glDrawPixels and glTexImage?D().
26956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx - the context
2696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
27006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *         srcType - source image  data type
2701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2702b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *         srcPacking - pixel unpacking parameters
2703fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
2704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
27088cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_chan( GLcontext *ctx,
2709699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint n, GLenum dstFormat, GLchan dest[],
2710699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLenum srcFormat, GLenum srcType,
2711699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const GLvoid *source,
2712699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              const struct gl_pixelstore_attrib *srcPacking,
2713699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul                              GLuint transferOps )
2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
27165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2744f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2747a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2748a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2749a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2751a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2753a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2755a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2756a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2757a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   if (transferOps == 0) {
2761aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      if (srcType == CHAN_TYPE) {
2762aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2763aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGBA) {
2764aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 4 * sizeof(GLchan) );
2765aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2766aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2767aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGB) {
2768aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2769aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2770aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2771aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2772aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2773aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2774aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2775aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2776aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2777aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2778aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2779aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2780aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2782aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2783aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2784aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               MEMCPY( dest, source, n * 3 * sizeof(GLchan) );
2785aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2786aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2787aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2788aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2789aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLchan *src = (const GLchan *) source;
2790aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2791aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2792aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = src[0];
2793aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = src[1];
2794aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = src[2];
2795aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2796aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2797aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2798aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2800aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         }
2801aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == srcFormat) {
2802aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            GLint comps = _mesa_components_in_format(srcFormat);
2803aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            assert(comps > 0);
2804aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            MEMCPY( dest, source, n * comps * sizeof(GLchan) );
2805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2808aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      /*
2809aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * Common situation, loading 8bit RGBA/RGB source images
2810aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       * into 16/32 bit destination. (OSMesa16/32)
2811aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul       */
2812aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul      else if (srcType == GL_UNSIGNED_BYTE) {
2813aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         if (dstFormat == GL_RGBA) {
2814aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2815aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2816aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2817aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2818aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2819aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2820aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2821aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2822aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = CHAN_MAX;
2823aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2824aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2825aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2826aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2827aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2828aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2829aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2830aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2831aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2832aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2833aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2834aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2835aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2836aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[3] = UBYTE_TO_CHAN(src[3]);
2837aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2838aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 4;
2839aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2840aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2841aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul             }
2842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2843aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul         else if (dstFormat == GL_RGB) {
2844aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            if (srcFormat == GL_RGB) {
2845aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2846aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2847aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2848aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2849aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2850aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2851aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2852aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 3;
2853aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2854aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2855aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2856aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            }
2857aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul            else if (srcFormat == GL_RGBA) {
2858aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLuint i;
2859aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               const GLubyte *src = (const GLubyte *) source;
2860aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               GLchan *dst = dest;
2861aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               for (i = 0; i < n; i++) {
2862aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[0] = UBYTE_TO_CHAN(src[0]);
2863aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[1] = UBYTE_TO_CHAN(src[1]);
2864aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst[2] = UBYTE_TO_CHAN(src[2]);
2865aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  src += 4;
2866aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul                  dst += 3;
2867aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               }
2868aeb4434563c4014a662ea334878b60d3031bb3c1Brian Paul               return;
2869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2875179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
288047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
288147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
2882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2883b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2894b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
2895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2896fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
2897fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
2898fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
2899fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
2900fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
2901fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2902c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2905699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
2906c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2907c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2908699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
2909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
291047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2911c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2915179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2917833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
2918833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
2919833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          * with color indexes.
2920833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          */
2921833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
2922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2924833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* non-color index data */
2925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2926b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
2927c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2928c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
29294923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul      /* Need to clamp if returning GLubytes or GLushorts */
293096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#if CHAN_TYPE != GL_FLOAT
2931833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      transferOps |= IMAGE_CLAMP_BIT;
293296385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul#endif
2933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2934833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if (transferOps) {
2935833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
2936833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
2937833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
2938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
29475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
2948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
297708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_chan_span()");
297847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
2979276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2983699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul      /* Now return the GLchan data in the requested dstFormat */
2984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2986699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
29896532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstRedIndex], rgba[i][RCOMP]);
2990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2995699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
2996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
29986532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstGreenIndex], rgba[i][GCOMP]);
2999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
3004699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
30076532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstBlueIndex], rgba[i][BCOMP]);
3008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
3013699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
30166532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[dstAlphaIndex], rgba[i][ACOMP]);
3017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
3022699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
3025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
3026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
3027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
30286532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
3029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
3033699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul         GLchan *dst = dest;
3034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
3035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
3036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
3037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
30386532db986883ea1a431c043126de4947465834a1Brian Paul            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
304247cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
3043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
304794f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul/**
304894f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
304994f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul * instead of GLchan.
305094f9d4c0dd2b62e01032c2b0dd9b8a25466690c2Brian Paul */
3051c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
30528cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul_mesa_unpack_color_span_float( GLcontext *ctx,
3053c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
3054c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
3055c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
3056b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                               const struct gl_pixelstore_attrib *srcPacking,
30574923e1926ad7b7eb7de017eda8e7db64d357e5c8Brian Paul                               GLuint transferOps )
3058c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
3059c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
30605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen          dstFormat == GL_LUMINANCE ||
3061c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
3062c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
3063c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
3064c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
3065c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
3066c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3067c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
3068c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
3069c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
3070c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
3071c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
3072c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
3073c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
3074c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
3075c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
3076c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
3077c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
3078c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
3079c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
3080c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3081c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
3082c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3083c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
3084c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3085c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
3086c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
3087c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
3089c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
3090c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3091c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3092c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3093c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3094c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3095c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3096c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3097c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3098c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3099c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3100c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3101c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
3102c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3103c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
3104c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
3105c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
3106c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
3107c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
310847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      DEFMARRAY(GLfloat, rgba, MAX_WIDTH, 4);  /* mac 32k limitation */
310947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      CHECKARRAY(rgba, return);  /* mac 32k limitation */
3110c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3111c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
3112c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
3113c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
3114c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3115c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
3116c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
3117c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3118c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
3119c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
3120c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
3121c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3122b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                              srcPacking);
3123c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3124fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul         if (dstFormat == GL_COLOR_INDEX
3125fa849a0e1622039bf66ef2b7506669aba8d77d91Brian Paul             && (transferOps & IMAGE_MAP_COLOR_BIT)) {
3126fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_map_ci(ctx, n, indexes);
3127fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         }
3128fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3129fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3130c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3131c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3132c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
3133699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul            /* convert to GLchan and return */
3134c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
3135c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
3136699bc7b73d2fede77d3290f66c1ec355afd0373eBrian Paul               dest[i] = (GLchan) (indexes[i] & 0xff);
3137c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
313847cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3139c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3140c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3141c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
3142c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
3143c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3144c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3145833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
3146833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3147833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          * with color indexes.
3148833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul          */
3149833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3151c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
3152833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         /* non-color index data */
3153c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
3154b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                            srcPacking->SwapBytes);
3155c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3156c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3157833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      if (transferOps) {
3158833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3159833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul      }
3160833d96aa913dcb0c5ca085cc7ebee3df90f7fbf8Brian Paul
3161c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
3162c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
3163c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
3164c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
3165c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
3166c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
3167c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3168c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3169c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
31705e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen         case GL_LUMINANCE:
3171c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3172c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3173c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3174c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3175c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
3176c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
3177c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
3178c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
3179c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
3180c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3181c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
3182c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
3183c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
3184c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
3185c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3186c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
3187c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3188c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3189c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3190c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
3191c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3192c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
3193c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
3194c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
3195c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
3196c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
3197c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
3198c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
3199c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
32008cfd08b6134e2036ddceb1facfa82e15026068a2Brian Paul            _mesa_problem(ctx, "bad dstFormat in _mesa_unpack_color_span_float()");
320147cf442c1164b6b406117fccfb8b564602741ee3Brian Paul            UNDEFARRAY(rgba);  /* mac 32k limitation */
3202c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
3203c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3204c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3205fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      /* Now pack results in the requested dstFormat */
3206c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
3207c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3209c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3210c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
3211c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3212c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3213c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3214c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3215c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
3216c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3217c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3218c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3219c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
3220c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3221c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3222c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3223c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3224c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
3225c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3226c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3227c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3228c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
3229c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3230c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3231c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3232c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3233c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
3234c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3235c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3236c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3237c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
3238c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3239c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3240c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3241c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3242c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
3243c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3244c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3245c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
3246c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
3247c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3248c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
3249c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
3250c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3251c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
3252c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3253c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
3254c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
3255c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
3256c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
3257c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
3258c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
3259c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
3260c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
3261c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
3262c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
326347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul      UNDEFARRAY(rgba);  /* mac 32k limitation */
3264c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
3265c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
3266c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3267c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
3268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
3270fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
3273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
3274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
32756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        dstType - destination data type
3276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
3277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
3278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
3279b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3280fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - the pixel transfer operations to apply
3281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
3283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
3284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
3285c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
3286b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                         const struct gl_pixelstore_attrib *srcPacking,
3287fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                         GLuint transferOps )
3288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
3290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
3291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
3292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
3293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
3294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
3295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
3296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
3297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
3298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
3301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
3302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3303fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul
3304fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
3305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
3307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
3308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
3309fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
3310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
3311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3313fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
3314b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
3315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
3319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
3320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
3321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
3322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
3323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3325b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3327fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3328fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* shift and offset indexes */
3329fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_shift_and_offset_ci(ctx, n, indexes);
3330fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      }
3331fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
3332fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         /* Apply lookup table */
3333fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         _mesa_map_ci(ctx, n, indexes);
3334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
3337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
3338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
3339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
3341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3343c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
3348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
3349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
3350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
3351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
3352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
3354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
3357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
3359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
336008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
3361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
336623e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
336723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_index_span( const GLcontext *ctx, GLuint n,
336823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, GLvoid *dest, const GLuint *source,
336923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking,
337023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLuint transferOps )
337123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
337223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLuint indexes[MAX_WIDTH];
337323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
337523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
337723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
337823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
337923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
338023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(indexes, source, n * sizeof(GLuint));
338123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
338223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_ci( ctx, n, indexes);
338323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (transferOps & IMAGE_MAP_COLOR_BIT) {
338523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_ci(ctx, n, indexes);
338623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
338723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = indexes;
338823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
338923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
339023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
339123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
339223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
339323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
339423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
339523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
339623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLubyte) source[i];
339723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
339823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
339923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
340023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
340123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
340223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
340323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
340423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3405a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLbyte) source[i];
340623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
340723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
340823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
340923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
341023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
341123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
341223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
341323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3414a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLushort) source[i];
341523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
341723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
341823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
341923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
342023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
342123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
342223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
342323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
342423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
342523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3426a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLshort) source[i];
342723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
342823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
342923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
343023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
343123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
343223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
343323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
343423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
343523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
343623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
343723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3438a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLuint) source[i];
343923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
344023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
344123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
344223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
344323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
344423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
344523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
344623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
344723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
344823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
344923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3450a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLint) source[i];
345123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
345323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
345423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
345523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
345623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
345723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
345823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
345923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
346023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
346123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
3462a51f07d5a148705c1c118dece1630972753ca349Brian Paul            dst[i] = (GLfloat) source[i];
346323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
346423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
346523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
346623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
346723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
346823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
3469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   case GL_HALF_FLOAT_ARB:
34707eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
3471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
34727eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
34737eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i = 0; i < n; i++) {
34747eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
34757eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
34767eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
34777eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
34787eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
34797eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
34807eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
348123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
348208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
348323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
348423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
348523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
348623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
3488fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
3489fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul * the pixel unpacking parameters.
3490fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
3491fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
3492fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
3493fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
34946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *        dstType - destination data type
3495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
3496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
3497fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
3498b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul *        srcPacking - pixel unpacking parameters
3499fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul *        transferOps - apply offset/bias/lookup ops?
3500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3501fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3502fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
3503fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
3504fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
3505b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           const struct gl_pixelstore_attrib *srcPacking,
3506fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul                           GLuint transferOps )
3507fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
3509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
3510fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
3511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
3512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
3513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
3514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
3515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul          srcType == GL_HALF_FLOAT_ARB ||
3516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
3517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
3519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
3520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
3521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3522fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   /* only shift and offset apply to stencil */
3523fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
3524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
3526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
3527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
3528fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   if (transferOps == 0 &&
3529fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       srcType == GL_UNSIGNED_BYTE &&
3530fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul       dstType == GL_UNSIGNED_BYTE) {
3531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
3532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3533fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul   else if (transferOps == 0 &&
3534fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            srcType == GL_UNSIGNED_INT &&
3535fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul            dstType == GL_UNSIGNED_INT &&
3536b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul            !srcPacking->SwapBytes) {
3537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
3538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
3540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
3541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
3542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
3543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
3544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
3545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
3547b92d64e150a3b1389f5a4b6cbfe57425a77f24bfBrian Paul                           srcPacking);
3548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3549fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul      if (transferOps) {
3550fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
3552179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
3553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
3556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
3557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
3558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
3560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
3561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
3566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
3567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
3568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
3570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
3573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
3577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
3578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
3579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
3580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
3581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
3582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
3586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
3587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
3588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
358908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
3590fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3591fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
359523e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
359623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul_mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
359723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         GLenum dstType, GLvoid *dest, const GLstencil *source,
359823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                         const struct gl_pixelstore_attrib *dstPacking )
359923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
360023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLstencil stencil[MAX_WIDTH];
360123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
360223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
360323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
360423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
360523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul       ctx->Pixel.MapStencilFlag) {
360623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      /* make a copy of input */
360723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      MEMCPY(stencil, source, n * sizeof(GLstencil));
360823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
360923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_shift_and_offset_stencil( ctx, n, stencil );
361023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
361123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (ctx->Pixel.MapStencilFlag) {
361223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         _mesa_map_stencil( ctx, n, stencil );
361323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
361423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      source = stencil;
361523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
361623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
361723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
361823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
361923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
362023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
362123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
362323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
362423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
362523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
362623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLubyte) source[i];
362723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
362823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
362923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
363023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
363123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (sizeof(GLstencil) == 8) {
363223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         MEMCPY( dest, source, n );
363323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
363423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
363523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
363623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
363723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
363823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLbyte) source[i];
363923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
364123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
364223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
364323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
364423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
364523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
364623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
364723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLushort) source[i];
364823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
364923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
365023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
365123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
365223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
365323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
365423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
365523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
365623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
365723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
365823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
365923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLshort) source[i];
366023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
366223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
366323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
366423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
366523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
366623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
366723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
366823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
366923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
367023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
367123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLuint) source[i];
367223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
367323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
367423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
367523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
367623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
367723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
367823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
367923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
368023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
368123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
368223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
368323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst++ = (GLint) source[i];
368423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
368523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
368623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
368723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
368823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
368923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
369023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
369123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
369223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
369323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
369423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i=0;i<n;i++) {
369523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = (GLfloat) source[i];
369623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
369723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
369823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
369923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
370023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
370123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
3702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   case GL_HALF_FLOAT_ARB:
37037eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
3704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
37057eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
37067eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i=0;i<n;i++) {
37072c9f50dd4acc65ddfeb8e3fde98137711167e579Brian Paul            dst[i] = _mesa_float_to_half( (float) source[i] );
37087eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
37097eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
37107eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
37117eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
37127eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
37137eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
371423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BITMAP:
371523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      if (dstPacking->LsbFirst) {
371623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
371723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 0;
371823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
371923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
372023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 0)
372123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
372223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
372323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift++;
372423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 8) {
372523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 0;
372623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
372723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
372823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
372923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
373023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      else {
373123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
373223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint shift = 7;
373323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
373423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
373523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift == 7)
373623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               *dst = 0;
373723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            *dst |= ((source[i] != 0) << shift);
373823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            shift--;
373923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            if (shift < 0) {
374023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               shift = 7;
374123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul               dst++;
374223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            }
374323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
374423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
374523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
374623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
374708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
374823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
374923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
375023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
375123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
3752fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
3753e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLfloat *dest,
3754fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
3755e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul                         const struct gl_pixelstore_attrib *srcPacking )
3756fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
3758fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
3759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3760fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3761fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3762fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3763e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = BYTE_TO_FLOAT(src[i]);
3764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3765fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3767fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
3768fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
3771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3772e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UBYTE_TO_FLOAT(src[i]);
3773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3774fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3775fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3776fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
3777fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3778fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3779fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
3780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3781e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = SHORT_TO_FLOAT(src[i]);
3782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
3786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
3789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3790e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = USHORT_TO_FLOAT(src[i]);
3791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
3795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
3798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3799e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = INT_TO_FLOAT(src[i]);
3800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
3804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
3805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3806fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3807fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3808e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul               dest[i] = UINT_TO_FLOAT(src[i]);
3809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3810fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3811fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3812fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3813e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         MEMCPY(dest, source, n * sizeof(GLfloat));
3814fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3815f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
38167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         {
38177eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            GLuint i;
3818f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            const GLhalfARB *src = (const GLhalfARB *) source;
38197eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            for (i = 0; i < n; i++) {
38207eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul               dest[i] = _mesa_half_to_float(src[i]);
38217eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            }
38227eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
38237eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         break;
3824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
382508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
3826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3830e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul   /* apply depth scale and bias and clamp to [0,1] */
3831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3834e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         GLfloat d = dest[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3835e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul         dest[i] = CLAMP(d, 0.0F, 1.0F);
3836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
384223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul * Pack an array of depth values.  The values are floats in [0,1].
384323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul */
384423e8d46e072669e0974d7b2c168d4770183106bdBrian Paulvoid
3845b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul_mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
384623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       GLenum dstType, const GLfloat *depthSpan,
384723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                       const struct gl_pixelstore_attrib *dstPacking )
384823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul{
384923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   GLfloat depthCopy[MAX_WIDTH];
385023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   const GLboolean bias_or_scale = ctx->Pixel.DepthBias != 0.0 ||
385123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul                                   ctx->Pixel.DepthScale != 1.0;
385223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
385323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   ASSERT(n <= MAX_WIDTH);
385423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
385523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   if (bias_or_scale) {
385623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      GLuint i;
385723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      for (i = 0; i < n; i++) {
385823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat d;
385923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         d = depthSpan[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
386023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         depthCopy[i] = CLAMP(d, 0.0F, 1.0F);
386123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
386223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      depthSpan = depthCopy;
386323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
386423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
386523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   switch (dstType) {
386623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_BYTE:
386723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
386823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLubyte *dst = (GLubyte *) dest;
386923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
387023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
387123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
387223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
387323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
387423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
387523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_BYTE:
387623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
387723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLbyte *dst = (GLbyte *) dest;
387823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
387923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
388023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
388123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
388223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
388323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
388423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_SHORT:
388523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
388623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLushort *dst = (GLushort *) dest;
388723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
388823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
388923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_USHORT( depthSpan[i] );
389023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
389123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
389223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
389323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
389423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
389523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
389623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_SHORT:
389723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
389823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLshort *dst = (GLshort *) dest;
389923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
390023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
390123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
390223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
390323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
390423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap2( (GLushort *) dst, n );
390523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
390623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
390723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
390823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_UNSIGNED_INT:
390923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
391023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint *dst = (GLuint *) dest;
391123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
391223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
391323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
391423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
391523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
391623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
391723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
391823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
391923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
392023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_INT:
392123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
392223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLint *dst = (GLint *) dest;
392323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
392423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
392523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = FLOAT_TO_INT( depthSpan[i] );
392623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
392723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
392823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
392923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
393023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
393123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
393223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   case GL_FLOAT:
393323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      {
393423e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLfloat *dst = (GLfloat *) dest;
393523e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         GLuint i;
393623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         for (i = 0; i < n; i++) {
393723e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            dst[i] = depthSpan[i];
393823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
393923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         if (dstPacking->SwapBytes) {
394023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul            _mesa_swap4( (GLuint *) dst, n );
394123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul         }
394223e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      }
394323e8d46e072669e0974d7b2c168d4770183106bdBrian Paul      break;
3944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul   case GL_HALF_FLOAT_ARB:
39457eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      {
3946f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         GLhalfARB *dst = (GLhalfARB *) dest;
39477eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         GLuint i;
39487eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         for (i = 0; i < n; i++) {
39497eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            dst[i] = _mesa_float_to_half(depthSpan[i]);
39507eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
39517eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         if (dstPacking->SwapBytes) {
39527eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul            _mesa_swap2( (GLushort *) dst, n );
39537eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul         }
39547eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      }
39557eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul      break;
395623e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   default:
395708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
395823e8d46e072669e0974d7b2c168d4770183106bdBrian Paul   }
395923e8d46e072669e0974d7b2c168d4770183106bdBrian Paul}
396023e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
396123e8d46e072669e0974d7b2c168d4770183106bdBrian Paul
39627a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/**
39637a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
39647a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * Return all image data in a contiguous block.  This is used when we
39657a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * compile glDrawPixels, glTexImage, etc into a display list.  We
39667a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul * need a copy of the data in a standard format.
3967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3989b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3990b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
4000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
4001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
4002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
4003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
4004b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      GLubyte *destBuffer = (GLubyte *) MALLOC(bytesPerRow * height * depth);
4005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
4006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
4007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
4008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
4009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
4010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
4011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
4012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
4013b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
4014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
4015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
4016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
4017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
4018b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
4019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
4021b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
4022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
4024b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
4025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
4026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
4027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
4028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
4029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
4030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
4031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
40326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
40336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#endif
4034