image.c revision c29714dccb664562958cf36cdedee9c4377585d2
1c29714dccb664562958cf36cdedee9c4377585d2Brian Paul/* $Id: image.c,v 1.35 2000/06/30 22:12:00 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Version:  3.3
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
7276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h"
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else
31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
34c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul#include "imaging.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
36fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images.
46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format.
47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc)
48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current
49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values!
50fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
51279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = {
52fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   1,            /* Alignment */
53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* RowLength */
54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipPixels */
55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipRows */
56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* ImageHeight */
57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipImages */
58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE,     /* SwapBytes */
59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE      /* LsbFirst */
60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul};
61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
64fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
67b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
68b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = (GLuint) p[i];
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
90b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
91b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
105b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
106b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype.
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP.
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum.
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
128b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
154b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes.
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);
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type.
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format.
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
211b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format )
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
228070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type.
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
252b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
254b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLshort);
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal.
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal.
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
310b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
311b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type )
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3332a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume).
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'.
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  image - start of image data
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         width, height - size of image
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - image format
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - pixel component type
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - the pixelstore attributes
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         img - which image in the volume (0 for 1D or 2D images)
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         row, column - location of pixel in the image
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  address of pixel at (image,row,column) in image or NULL if error.
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
410b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
412b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
413b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
414b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
449b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
455b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
474b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
501ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given
502ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type.
503ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
504ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
505ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
506ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (width + 7) / 8;
513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (packing->RowLength + 7) / 8;
517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
520ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
522b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
523fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      GLint bytesPerRow, remainder;
524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
527fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
530fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
532fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      remainder = bytesPerRow % packing->Alignment;
533fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      if (remainder > 0)
534fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow += (packing->Alignment - remainder);
535fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul      return bytesPerRow;
536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
537ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
538ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
539ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
540ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
541ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5457c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5467c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
5477c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
549959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
5507c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
5517c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
5527c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
5537c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
5547c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
5557c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
5567c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
5577c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
5587c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
5597c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
5607c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
5617c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
5627c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
5637c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5737c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5747c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
5757c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
5777c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
5787c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
5797c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
5807c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
5837c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
5847c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
5857c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
5867c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
5887c652d77220610ecc19aaefa20876216b035e961Brian Paul
5897c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type.
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops.
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct.
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D()
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  ctx - the context
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         n - number of pixels in the span
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         rgba - the pixels
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - dest packing format
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - dest packing datatype
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         destination - destination packing address
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - pixel packing parameters
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         applyTransferOps - apply scale/bias/lookup-table ops?
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
609b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
610c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_pack_rgba_span( GLcontext *ctx,
611179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                      GLuint n, CONST GLubyte srcRgba[][4],
612b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      GLenum format, GLenum type, GLvoid *destination,
613b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      const struct gl_pixelstore_attrib *packing,
614b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      GLboolean applyTransferOps )
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
616179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
617179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        ctx->Pixel.MapColorFlag ||
618179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
619179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        ctx->Pixel.ScaleOrBiasRGBApcm ||
620a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul                        ctx->Pixel.ColorTableEnabled ||
621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
622c29714dccb664562958cf36cdedee9c4377585d2Brian Paul                        ctx->Pixel.PostConvolutionColorTableEnabled ||
6231a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.MinMaxEnabled ||
6241a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.HistogramEnabled);
625fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Test for optimized case first */
627fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
6283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
629179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul      MEMCPY( destination, srcRgba, n * 4 * sizeof(GLubyte) );
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
631fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) {
6323428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
6333428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLint i;
6343428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLubyte *dest = (GLubyte *) destination;
6353428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      for (i = 0; i < n; i++) {
636179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         dest[0] = srcRgba[i][RCOMP];
637179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         dest[1] = srcRgba[i][GCOMP];
638179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         dest[2] = srcRgba[i][BCOMP];
6393428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest += 3;
6403428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
6413428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul   }
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
643fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* general solution */
644179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul      GLfloat rgba[MAX_WIDTH][4], luminance[MAX_WIDTH];
64564b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat rscale = 1.0F / 255.0F;
64664b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat gscale = 1.0F / 255.0F;
64764b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat bscale = 1.0F / 255.0F;
64864b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat ascale = 1.0F / 255.0F;
649b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint comps = _mesa_components_in_format(format);
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint i;
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
65298b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul      assert(n <= MAX_WIDTH);
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* convert color components to floating point */
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0;i<n;i++) {
656179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         rgba[i][RCOMP] = srcRgba[i][RCOMP] * rscale;
657179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         rgba[i][GCOMP] = srcRgba[i][GCOMP] * gscale;
658179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         rgba[i][BCOMP] = srcRgba[i][BCOMP] * bscale;
659179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         rgba[i][ACOMP] = srcRgba[i][ACOMP] * ascale;
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Apply scale, bias and lookup-tables if enabled.
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (applyTransferOps) {
666179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         /* scale & bias */
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.ScaleOrBiasRGBA) {
668179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_scale_and_bias_rgba( ctx, n, rgba );
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
670a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         /* color map lookup */
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.MapColorFlag) {
672179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_rgba( ctx, n, rgba );
673179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         }
674a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         /* GL_COLOR_TABLE lookup */
675a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         if (ctx->Pixel.ColorTableEnabled) {
676a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
677a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         }
678a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         /* XXX convolution here */
679c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
680c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
681c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
682c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
683c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* color matrix transform */
684179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
685179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul             ctx->Pixel.ScaleOrBiasRGBApcm) {
686179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
687179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul         }
688a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
689a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
690a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
6921a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
6931a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         if (ctx->Pixel.HistogramEnabled) {
6941a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
6951a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
696a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul         /* XXX min/max here */
697c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.MinMaxEnabled) {
6981a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
699c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->MinMax.Sink)
700c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               return;
701c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) {
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         for (i=0;i<n;i++) {
706179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            luminance[i] = CLAMP( sum, 0.0F, 1.0F );
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Pack/store the pixels.  Ugh!  Lots of cases!!!
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      switch (type) {
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE:
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
721179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
725179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
729179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
733179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(luminance[i]);
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
742179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
747179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
748179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
749179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
754179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
755179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
756179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
757179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
762179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
763179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
764179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
769179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
770179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
771179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
772179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
777179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
778179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
779179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
780179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
784b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_BYTE:
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLbyte *dst = (GLbyte *) destination;
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
794179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
798179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
802179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
806179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(luminance[i]);
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
815179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
820179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
821179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
822179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
827179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
828179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
829179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
830179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
835179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
836179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
837179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
842179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
843179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
844179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
845179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
849179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
850179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
851179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
852179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
856b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_SHORT:
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
866179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
870179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
874179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
878179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(luminance[i]);
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
887179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
892179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
893179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
894179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
899179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
900179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
901179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
902179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
907179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
908179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
909179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
914179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
915179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
916179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
917179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
922179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_USHORT(rgba[i][ACOMP]);
923179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_USHORT(rgba[i][BCOMP]);
924179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
925179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
929b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
932b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap2( (GLushort *) dst, n * comps);
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_SHORT:
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLshort *dst = (GLshort *) destination;
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
942179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
946179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
950179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
954179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(luminance[i]);
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
963179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
968179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
969179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
970179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
975179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
976179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
977179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
978179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
983179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
984179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
985179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
990179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
991179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
992179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
993179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
997179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
998179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
999179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1000179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1004b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1007b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap2( (GLushort *) dst, n * comps );
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_INT:
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1017179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1021179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1025179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1029179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(luminance[i]);
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1038179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1043179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1044179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1045179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1050179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1051179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1052179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1053179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1058179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1059179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1060179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1065179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1066179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1067179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1068179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1073179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1074179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1075179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1076179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1080b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1083b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap4( (GLuint *) dst, n * comps );
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_INT:
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLint *dst = (GLint *) destination;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1093179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1097179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1101179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1105179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(luminance[i]);
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1114179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1119179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1120179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1121179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1126179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1127179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1128179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1129179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1134179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1135179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1136179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1141179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1142179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1143179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1144179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1149179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1150179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1151179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1152179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1156b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
1159b7d076fc96ac27117421653a043d00a95f789d24Brian Paul		  _mesa_swap4( (GLuint *) dst, n * comps );
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_FLOAT:
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLfloat *dst = (GLfloat *) destination;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1169179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = rgba[i][RCOMP];
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1173179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = rgba[i][GCOMP];
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1177179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = rgba[i][BCOMP];
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1181179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i] = rgba[i][ACOMP];
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = luminance[i];
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = luminance[i];
1190179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*2+1] = rgba[i][ACOMP];
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1195179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = rgba[i][RCOMP];
1196179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = rgba[i][GCOMP];
1197179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = rgba[i][BCOMP];
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1202179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = rgba[i][RCOMP];
1203179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = rgba[i][GCOMP];
1204179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = rgba[i][BCOMP];
1205179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = rgba[i][ACOMP];
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1210179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+0] = rgba[i][BCOMP];
1211179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+1] = rgba[i][GCOMP];
1212179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*3+2] = rgba[i][RCOMP];
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1217179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = rgba[i][BCOMP];
1218179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = rgba[i][GCOMP];
1219179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = rgba[i][RCOMP];
1220179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = rgba[i][ACOMP];
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1225179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+0] = rgba[i][ACOMP];
1226179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+1] = rgba[i][BCOMP];
1227179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+2] = rgba[i][GCOMP];
1228179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        dst[i*4+3] = rgba[i][RCOMP];
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1232b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
1235b7d076fc96ac27117421653a043d00a95f789d24Brian Paul		  _mesa_swap4( (GLuint *) dst, n * comps );
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_3_3_2:
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
124383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F)) << 5)
1244179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 2)
124583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 3.0F))     );
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_2_3_3_REV:
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
125383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 7.0F))     )
1254179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 7.0F)) << 3)
125583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 3.0F)) << 5);
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5:
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
126383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1264179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
126583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 31.0F))      );
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5_REV:
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
127383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1274179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 63.0F)) <<  5)
127583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 11);
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4:
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
128383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F)) << 12)
1284179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  8)
128583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  4)
1286179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][ACOMP] * 15.0F))      );
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
129483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 15.0F))      )
1295179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 15.0F)) <<  4)
129683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 15.0F)) <<  8)
1297179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][ACOMP] * 15.0F)) << 12);
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_5_5_1:
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
130583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F)) << 11)
1306179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  6)
130783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 31.0F)) <<  1)
1308179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][ACOMP] *  1.0F))      );
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
131683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLint) (rgba[i][RCOMP] * 31.0F))      )
1317179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][GCOMP] * 31.0F)) <<  5)
131883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLint) (rgba[i][BCOMP] * 31.0F)) << 10)
1319179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLint) (rgba[i][ACOMP] *  1.0F)) << 15);
1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8:
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
132783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24)
1328179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
132983aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1330179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
133683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 24)
1337179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
133883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 255.0F)) <<  8)
1339179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] * 255.0F))      );
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1345179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                  dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24)
134683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1347179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
134883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 255.0F))      );
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8_REV:
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
135683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][RCOMP] * 255.0F))      )
1357179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
135883aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 255.0F)) << 16)
1359179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
136583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][BCOMP] * 255.0F))      )
1366179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) <<  8)
136783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 16)
1368179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] * 255.0F)) << 24);
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1374179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                  dst[i] = (((GLuint) (rgba[i][ACOMP] * 255.0F))      )
137583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 255.0F)) <<  8)
1376179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 255.0F)) << 16)
137783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 255.0F)) << 24);
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_10_10_10_2:
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
138583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 22)
1386179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
138783aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) <<  2)
1388179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
139483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 22)
1395179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 12)
139683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) <<  2)
1397179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] *    3.0F))      );
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1403179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                  dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F)) << 22)
140483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 12)
1405179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) <<  2)
140683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] *    3.0F))      );
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_2_10_10_10_REV:
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
141483aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][RCOMP] * 1023.0F))      )
1415179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
141683aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 20)
1417179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
142383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                  dst[i] = (((GLuint) (rgba[i][BCOMP] * 1023.0F))      )
1424179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 10)
142583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] * 1023.0F)) << 20)
1426179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][ACOMP] *    3.0F)) << 30);
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1432179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                  dst[i] = (((GLuint) (rgba[i][ACOMP] * 1023.0F))      )
143383aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][BCOMP] * 1023.0F)) << 10)
1434179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                         | (((GLuint) (rgba[i][GCOMP] * 1023.0F)) << 20)
143583aeeb0967a5ea4b6942fd255871537026d360c4Brian Paul                         | (((GLuint) (rgba[i][RCOMP] *    3.0F)) << 30);
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         default:
1440b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            gl_problem( ctx, "bad type in _mesa_pack_rgba_span" );
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1446179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul
1447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
1469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
1470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
1471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
1473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
1475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
1476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
1482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
1485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
1487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
1488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
1493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
1494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
1498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
1507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
1508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
1512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
1521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
1529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
1537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
1540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
1554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
1571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
1574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
1591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
1605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
1608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1609959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1614959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
1615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract_uint_indexes");
1620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
1628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
1629c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
1633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
1634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
1637c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
1638c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - datatype of incoming data
1639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
1641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
1642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
1644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
1645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
1646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
1648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
1649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
1650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
1652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
1653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
1654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
1655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
1656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
1657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
1658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
1659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
1661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
1662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
1665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
1672a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
1673a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
1674a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
1675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
1676a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
1677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
1678a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
1679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1680a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
1681a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
1682a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
1683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1684a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
1685a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
1686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
1687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
1688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
1698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
1700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
1704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
1705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE:
1708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
1709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
1713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
1714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
1715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
1716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
1718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
1723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
1730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
1731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
1737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
1740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
1744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
1745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
1749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
1753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
1754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcFormat in extract float data");
1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2080a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2081a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2082a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2083a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2091a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2092a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2093a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2094a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract float data");
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters.  Apply any enabled pixel transfer
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled.
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format.
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D().
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input:  ctx - the context
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcType - source image  datatype
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         unpacking - pixel unpacking parameters
2145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         applyTransferOps - apply scale/bias/lookup-table ops?
2146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2149c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2150c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_ubyte_color_span( GLcontext *ctx,
2151c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLuint n, GLenum dstFormat, GLubyte dest[],
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLenum srcFormat, GLenum srcType,
2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               const GLvoid *source,
2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               const struct gl_pixelstore_attrib *unpacking,
2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLboolean applyTransferOps )
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2157c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
2158c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE ||
2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2161c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2162c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2163c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2188a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2189a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2190a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2192a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2194a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2196a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2197a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2198a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2200250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul   /* this is intended for RGBA mode only */
2201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   assert(ctx->Visual->RGBAflag);
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
2204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                        ctx->Pixel.MapColorFlag ||
2205250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2206179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul                        ctx->Pixel.ScaleOrBiasRGBApcm ||
2207a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul                        ctx->Pixel.ColorTableEnabled ||
2208c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
2209c29714dccb664562958cf36cdedee9c4377585d2Brian Paul                        ctx->Pixel.PostConvolutionColorTableEnabled ||
22101a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.MinMaxEnabled ||
22111a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.HistogramEnabled);
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) {
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstFormat == GL_RGBA) {
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGBA) {
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY( dest, source, n * 4 * sizeof(GLubyte) );
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGB) {
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *src = (const GLubyte *) source;
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *dst = dest;
2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[3] = 255;
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 3;
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 4;
2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else if (dstFormat == GL_RGB) {
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGB) {
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY( dest, source, n * 3 * sizeof(GLubyte) );
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGBA) {
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *src = (const GLubyte *) source;
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *dst = dest;
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 4;
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 3;
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2254b09a4cd913e2de612fddf5411185a257da35647cBrian Paul      else if (dstFormat == srcFormat) {
2255b7d076fc96ac27117421653a043d00a95f789d24Brian Paul         GLint comps = _mesa_components_in_format(srcFormat);
2256b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         assert(comps > 0);
2257b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         MEMCPY( dest, source, n * comps * sizeof(GLubyte) );
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2263179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul   /* general solution begins here */
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLfloat rgba[MAX_WIDTH][4];
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2269c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2270b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2273c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2274c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2275c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2276c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2277c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2278c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                              unpacking);
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2283c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (applyTransferOps) {
2284c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.MapColorFlag) {
2285c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_map_ci(ctx, n, indexes);
2286c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2287c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2288c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_shift_and_offset_ci(ctx, n, indexes);
2289c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2290c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* convert to GLubyte and return */
2294c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2295c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2296c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               dest[i] = (GLubyte) (indexes[i] & 0xff);
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2298c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2302179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                            unpacking->SwapBytes);
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (applyTransferOps) {
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* scale and bias colors */
2311c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.ScaleOrBiasRGBA) {
2312c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_scale_and_bias_rgba(ctx, n, rgba);
2313c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2314a5f4cae20a5d47bf5e0f8d1aa35650d16391097dBrian Paul            /* color map lookup */
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (ctx->Pixel.MapColorFlag) {
2316179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul               _mesa_map_rgba(ctx, n, rgba);
2317250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul            }
2318c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2319c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2320c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2321c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (applyTransferOps) {
2322c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2323c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.ColorTableEnabled) {
2324c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2325c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2326c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* XXX convolution here */
2327c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2328c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
2329c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2330c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2331c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2332c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2333c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul             ctx->Pixel.ScaleOrBiasRGBApcm) {
2334c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2335c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2336c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2337c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
2338c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2339c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
23401a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
23411a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         if (ctx->Pixel.HistogramEnabled) {
23421a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
23431a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2344c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* XXX min/max here */
2345c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.MinMaxEnabled) {
23461a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2348c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* clamp to [0,1] */
2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      {
2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE:
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_problem(ctx, "bad dstFormat in _mesa_unpack_ubyte_span()");
2401276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now return the GLubyte data in the requested dstFormat */
2406fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstRedIndex] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstGreenIndex] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstBlueIndex] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstAlphaIndex] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2468c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paulvoid
2469c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul_mesa_unpack_float_color_span( GLcontext *ctx,
2470c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLuint n, GLenum dstFormat, GLfloat dest[],
2471c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               GLenum srcFormat, GLenum srcType,
2472c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const GLvoid *source,
2473c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                               const struct gl_pixelstore_attrib *unpacking,
24747a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul                               GLboolean applyTransferOps, GLboolean clamp )
2475c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul{
2476c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(dstFormat == GL_ALPHA ||
2477c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE ||
2478c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2479c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_INTENSITY ||
2480c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGB ||
2481c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_RGBA ||
2482c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          dstFormat == GL_COLOR_INDEX);
2483c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2484c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcFormat == GL_RED ||
2485c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_GREEN ||
2486c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BLUE ||
2487c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ALPHA ||
2488c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE ||
2489c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2490c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_INTENSITY ||
2491c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGB ||
2492c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGR ||
2493c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_RGBA ||
2494c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_BGRA ||
2495c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_ABGR_EXT ||
2496c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcFormat == GL_COLOR_INDEX);
2497c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2498c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   ASSERT(srcType == GL_BITMAP ||
2499c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2500c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_BYTE ||
2501c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2502c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_SHORT ||
2503c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT ||
2504c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_INT ||
2505c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_FLOAT ||
2506c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2507c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2508c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2509c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2510c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2511c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2512c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2513c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2514c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2515c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2516c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2517c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2518c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2519c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* this is intended for RGBA mode only */
2520c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   assert(ctx->Visual->RGBAflag);
2521c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2522c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
2523c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.MapColorFlag ||
2524c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2525c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.ScaleOrBiasRGBApcm ||
2526c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.ColorTableEnabled ||
2527c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
2528c29714dccb664562958cf36cdedee9c4377585d2Brian Paul                        ctx->Pixel.PostConvolutionColorTableEnabled ||
25291a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.MinMaxEnabled ||
25301a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul                        ctx->Pixel.HistogramEnabled);
2531c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2532c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   /* general solution, no special cases, yet */
2533c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   {
2534c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLfloat rgba[MAX_WIDTH][4];
2535c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstComponents;
2536c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2537c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2538c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2539c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2540c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* source & dest image formats should have been error checked by now */
2541c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(dstComponents > 0);
2542c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2543c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /*
2544c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * Extract image data and convert to RGBA floats
2545c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2546c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      assert(n <= MAX_WIDTH);
2547c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (srcFormat == GL_COLOR_INDEX) {
2548c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint indexes[MAX_WIDTH];
2549c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2550c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                              unpacking);
2551c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2552c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (applyTransferOps) {
2553c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.MapColorFlag) {
2554c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_map_ci(ctx, n, indexes);
2555c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2556c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2557c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_shift_and_offset_ci(ctx, n, indexes);
2558c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2559c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2560c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2561c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (dstFormat == GL_COLOR_INDEX) {
2562c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* convert to GLubyte and return */
2563c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            GLuint i;
2564c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            for (i = 0; i < n; i++) {
2565c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               dest[i] = (GLubyte) (indexes[i] & 0xff);
2566c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2567c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2568c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2569c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         else {
2570c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Convert indexes to RGBA */
2571c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
2572c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2573c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2574c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      else {
2575c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2576c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul                            unpacking->SwapBytes);
2577c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2578c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (applyTransferOps) {
2579c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* scale and bias colors */
2580c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.ScaleOrBiasRGBA) {
2581c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_scale_and_bias_rgba(ctx, n, rgba);
2582c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2583c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* color map lookup */
2584c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            if (ctx->Pixel.MapColorFlag) {
2585c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul               _mesa_map_rgba(ctx, n, rgba);
2586c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            }
2587c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2588c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2589c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2590c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (applyTransferOps) {
2591c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_COLOR_TABLE lookup */
2592c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.ColorTableEnabled) {
2593c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
2594c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2595c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* XXX convolution here */
2596c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
2597c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
2598c29714dccb664562958cf36cdedee9c4377585d2Brian Paul            _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
2599c29714dccb664562958cf36cdedee9c4377585d2Brian Paul         }
2600c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* color matrix transform */
2601c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2602c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul             ctx->Pixel.ScaleOrBiasRGBApcm) {
2603c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_transform_rgba(ctx, n, rgba);
2604c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2605c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
2606c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
2607c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
2608c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
26091a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         /* update histogram count */
26101a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         if (ctx->Pixel.HistogramEnabled) {
26111a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
26121a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul         }
2613c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         /* XXX min/max here */
2614c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         if (ctx->Pixel.MinMaxEnabled) {
26151a1cf7ed75d799bbda34399ddab7949b8c06686eBrian Paul            _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
2616c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2617c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2618c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2619c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* clamp to [0,1] */
26207a39d2f833807f8defd2304b0ff180944c23ea0cBrian Paul      if (clamp) {
2621c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2622c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2623c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2624c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2625c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2626c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2627c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2628c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2629c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2630c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now determine which color channels we need to produce.
2631c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       * And determine the dest index (offset) within each color tuple.
2632c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul       */
2633c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      switch (dstFormat) {
2634c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_ALPHA:
2635c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 0;
2636c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2637c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2638c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2639c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE:
2640c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2641c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2642c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2643c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2644c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_LUMINANCE_ALPHA:
2645c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = 0;
2646c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 1;
2647c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2648c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = -1;
2649c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2650c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_INTENSITY:
2651c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstIntensityIndex = 0;
2652c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2653c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = -1;
2654c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2655c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGB:
2656c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2657c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2658c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2659c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2660c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2661c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         case GL_RGBA:
2662c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstRedIndex = 0;
2663c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstGreenIndex = 1;
2664c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstBlueIndex = 2;
2665c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstAlphaIndex = 3;
2666c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2667c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            break;
2668c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         default:
2669c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_span()");
2670c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            return;
2671c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2672c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2673c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      /* Now pack results in teh requested dstFormat */
2674c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstRedIndex >= 0) {
2675c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2676c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2677c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2678c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstRedIndex] = rgba[i][RCOMP];
2679c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2680c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2681c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2682c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2683c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstGreenIndex >= 0) {
2684c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2685c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2686c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2687c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstGreenIndex] = rgba[i][GCOMP];
2688c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2689c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2690c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2691c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2692c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstBlueIndex >= 0) {
2693c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2694c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2695c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2696c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstBlueIndex] = rgba[i][BCOMP];
2697c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2698c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2699c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2700c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2701c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstAlphaIndex >= 0) {
2702c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2703c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2704c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2705c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[dstAlphaIndex] = rgba[i][ACOMP];
2706c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2707c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2708c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2709c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2710c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstIntensityIndex >= 0) {
2711c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2712c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2713c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstIntensityIndex == 0);
2714c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstComponents == 1);
2715c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2716c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Intensity comes from red channel */
2717c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[i] = rgba[i][RCOMP];
2718c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2719c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2720c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2721c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      if (dstLuminanceIndex >= 0) {
2722c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLfloat *dst = dest;
2723c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         GLuint i;
2724c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         assert(dstLuminanceIndex == 0);
2725c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         for (i = 0; i < n; i++) {
2726c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            /* Luminance comes from red channel */
2727c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst[0] = rgba[i][RCOMP];
2728c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul            dst += dstComponents;
2729c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul         }
2730c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul      }
2731c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul   }
2732c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul}
2733c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2734c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2735c397a6b28351ad97f996f913cfe9266b9f9096f6Brian Paul
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and applyTransferOps is true.
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dstType - destination datatype
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        unpacking - pixel unpacking parameters
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        applyTransferOps - apply offset/bias/lookup ops?
2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         const struct gl_pixelstore_attrib *unpacking,
2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLboolean applyTransferOps )
2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
2769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
2780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
2782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
2783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
2784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
2786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
2788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
2790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
2793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                           unpacking);
2794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (applyTransferOps) {
2796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* shift and offset indexes */
2798179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (ctx->Pixel.MapColorFlag) {
2801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Apply lookup table */
2802179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_map_ci(ctx, n, indexes);
2803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
2807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
2808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
2809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
2810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
2811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
2814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
2818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
2819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
2820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
2823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
2827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
2828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
2830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_index_span");
2831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
2838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
2839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * and applyTransferOps is true.
2840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
2841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
2842fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
2843fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
2844fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dstType - destination datatype
2845fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
2846fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
2847fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
2848fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        unpacking - pixel unpacking parameters
2849fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        applyTransferOps - apply offset/bias/lookup ops?
2850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
2851fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
2852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
2853fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
2854fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
2855fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           const struct gl_pixelstore_attrib *unpacking,
2856fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLboolean applyTransferOps )
2857fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
2858fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
2859fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2860fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
2861fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2862fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
2863fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
2864fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
2865fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
2866fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
2868fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
2869fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
2870fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2871fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2873fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
2874fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
2875fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
2876fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
2877fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       && dstType == GL_UNSIGNED_BYTE) {
2878fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
2879fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2880fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
2881fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
2882fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
2883fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2884fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
2885fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
2886fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
2887fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
2888fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
2889fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
2890fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2891fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
2892fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           unpacking);
2893fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2894fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (applyTransferOps) {
2895fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2896fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
2897179870a5b806a3ee84cb56fa20c3a003f9fc5b97Brian Paul            _mesa_shift_and_offset_ci(ctx, n, indexes);
2898fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2899fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2900fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
2901fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
2902fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
2903fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2904fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
2905fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
2906fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2907fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2908fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2909fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2910fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
2911fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
2912fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
2913fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
2914fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
2915fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
2916fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
2917fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
2918fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2919fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2920fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2921fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
2922fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
2923fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
2924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
2925fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
2926fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
2927fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2928fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2929fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2930fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
2931fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
2932fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2933fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
2934fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
2935fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2936fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2937fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
2938fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2939fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2940fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2941fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
2942fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest,
2943fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
2944fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         const struct gl_pixelstore_attrib *unpacking,
2945fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLboolean applyTransferOps )
2946fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
2947fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *depth = MALLOC(n * sizeof(GLfloat));
2948fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!depth)
2949fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return;
2950fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2951fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
2952fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
2953fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2954fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2955fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
2956fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2957fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = BYTE_TO_FLOAT(src[i]);
2958fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2959fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2960fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2961fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
2962fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2963fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2964fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
2965fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2966fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UBYTE_TO_FLOAT(src[i]);
2967fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2968fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2969fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2970fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
2971fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2972fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2973fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
2974fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2975fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = SHORT_TO_FLOAT(src[i]);
2976fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2977fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2978fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
2980fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2981fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2982fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
2983fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = USHORT_TO_FLOAT(src[i]);
2985fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2986fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2988fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
2989fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2990fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2991fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
2992fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2993fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = INT_TO_FLOAT(src[i]);
2994fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2995fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2996fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2997fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
2998fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2999fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
3000fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
3001fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
3002fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UINT_TO_FLOAT(src[i]);
3003fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3004fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3005fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3006fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
3007fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         MEMCPY(depth, source, n * sizeof(GLfloat));
3008fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
3009fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
3010fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         gl_problem(NULL, "bad type in _mesa_unpack_depth_span()");
30113c8299c77967611db138169c56a7c6a1c0086d1cBrian Paul         FREE(depth);
3012fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
3013fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3014fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3015fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3016fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* apply depth scale and bias */
3017fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
3018fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3019fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3020fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
3021fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3022fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3023fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3024fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* clamp depth values to [0,1] and convert from floats to integers */
3025fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   {
3026ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      const GLfloat zs = ctx->Visual->DepthMaxF;
3027fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
3028fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
3029ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs);
3030fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3031fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3032fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3033fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   FREE(depth);
3034fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
3035fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3036fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3037fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3038fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
3039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data.  Apply byteswapping, byte flipping (bitmap).
3040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block.
3041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
3042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
3043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
3044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
3045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
3046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
3047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
3048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
3049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
3051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
3052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
3054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
3055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
3057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
3058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
3059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
3060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
3061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
3063b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
3064b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
3065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
3066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
3067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
3068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
3069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
3070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
3071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
3072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
3073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
3074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
3075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
3078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth);
3079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
3080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
3081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
3082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
3083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
3084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
3085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
3086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
3087b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
3088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
3089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
3090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
3091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
3092b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
3093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
3095b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
3096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
3098b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
3099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
3100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
3101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
3102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
3103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
3104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
3105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
3106fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3107fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3108fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
3109fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
3110fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * order with row alignment = 1 byte.
3111fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
3112fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLvoid *
3113fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
3114fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     const struct gl_pixelstore_attrib *packing )
3115fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
3116fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint bytes, row, width_in_bytes;
3117fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLubyte *buffer, *dst;
3118fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3119fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!pixels)
3120fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return NULL;
3121fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3122fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* Alloc dest storage */
3123fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   bytes = ((width + 7) / 8 * height);
3124fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   buffer = (GLubyte *) MALLOC( bytes );
3125fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!buffer)
3126fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return NULL;
3127fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3128fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3129fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   width_in_bytes = CEILING( width, 8 );
3130fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   dst = buffer;
3131fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (row = 0; row < height; row++) {
3132b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      GLubyte *src = _mesa_image_address( packing, pixels, width, height,
3133b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
3134b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          0, row, 0 );
3135fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (!src) {
3136fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         FREE(buffer);
3137fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return NULL;
3138fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3139fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3140fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (packing->SkipPixels == 0) {
3141fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         MEMCPY( dst, src, width_in_bytes );
3142fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (packing->LsbFirst) {
3143b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            flip_bytes( dst, width_in_bytes );
3144fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3145fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3146fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      else {
3147fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
3148fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         GLint i;
3149fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (packing->LsbFirst) {
3150fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
3151fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte dstMask = 128;
3152fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *s = src;
3153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *d = dst;
3154fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            *d = 0;
3155fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < width; i++) {
3156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (*s & srcMask) {
3157fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d |= dstMask;
3158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (srcMask == 128) {
3160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = 1;
3161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  s++;
3162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3163fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
3164fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = srcMask << 1;
3165fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3166fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (dstMask == 1) {
3167fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = 128;
3168fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  d++;
3169fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d = 0;
3170fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3171fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
3172fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = dstMask >> 1;
3173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3175fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         else {
3177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
3178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte dstMask = 128;
3179fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *s = src;
3180fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *d = dst;
3181fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            *d = 0;
3182fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < width; i++) {
3183fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (*s & srcMask) {
3184fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d |= dstMask;
3185fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3186fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (srcMask == 1) {
3187fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = 128;
3188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  s++;
3189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3190fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
3191fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = srcMask >> 1;
3192fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3193fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (dstMask == 1) {
3194fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = 128;
3195fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  d++;
3196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d = 0;
3197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3198fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
3199fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = dstMask >> 1;
3200fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
3201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
3202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
3203fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
3204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      dst += width_in_bytes;
3205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
3206fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
3207fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   return buffer;
3208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
32097c652d77220610ecc19aaefa20876216b035e961Brian Paul
32107c652d77220610ecc19aaefa20876216b035e961Brian Paul
32117c652d77220610ecc19aaefa20876216b035e961Brian Paul/*
32127c652d77220610ecc19aaefa20876216b035e961Brian Paul * Pack bitmap data.
32137c652d77220610ecc19aaefa20876216b035e961Brian Paul */
32147c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
32157c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
32167c652d77220610ecc19aaefa20876216b035e961Brian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
32177c652d77220610ecc19aaefa20876216b035e961Brian Paul{
32187c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLint row, width_in_bytes;
32197c652d77220610ecc19aaefa20876216b035e961Brian Paul   const GLubyte *src;
32207c652d77220610ecc19aaefa20876216b035e961Brian Paul
32217c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (!source)
32227c652d77220610ecc19aaefa20876216b035e961Brian Paul      return;
32237c652d77220610ecc19aaefa20876216b035e961Brian Paul
32247c652d77220610ecc19aaefa20876216b035e961Brian Paul   width_in_bytes = CEILING( width, 8 );
32257c652d77220610ecc19aaefa20876216b035e961Brian Paul   src = source;
32267c652d77220610ecc19aaefa20876216b035e961Brian Paul   for (row = 0; row < height; row++) {
3227b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      GLubyte *dst = _mesa_image_address( packing, dest, width, height,
3228b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
3229b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          0, row, 0 );
32307c652d77220610ecc19aaefa20876216b035e961Brian Paul      if (!dst)
32317c652d77220610ecc19aaefa20876216b035e961Brian Paul         return;
32327c652d77220610ecc19aaefa20876216b035e961Brian Paul
32337c652d77220610ecc19aaefa20876216b035e961Brian Paul      if (packing->SkipPixels == 0) {
32347c652d77220610ecc19aaefa20876216b035e961Brian Paul         MEMCPY( dst, src, width_in_bytes );
32357c652d77220610ecc19aaefa20876216b035e961Brian Paul         if (packing->LsbFirst) {
3236b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            flip_bytes( dst, width_in_bytes );
32377c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
32387c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
32397c652d77220610ecc19aaefa20876216b035e961Brian Paul      else {
32407c652d77220610ecc19aaefa20876216b035e961Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
32417c652d77220610ecc19aaefa20876216b035e961Brian Paul         GLint i;
32427c652d77220610ecc19aaefa20876216b035e961Brian Paul         if (packing->LsbFirst) {
32437c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
32447c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte dstMask = 128;
32457c652d77220610ecc19aaefa20876216b035e961Brian Paul            const GLubyte *s = src;
32467c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte *d = dst;
32477c652d77220610ecc19aaefa20876216b035e961Brian Paul            *d = 0;
32487c652d77220610ecc19aaefa20876216b035e961Brian Paul            for (i = 0; i < width; i++) {
32497c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (*s & srcMask) {
32507c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d |= dstMask;
32517c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32527c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (srcMask == 128) {
32537c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = 1;
32547c652d77220610ecc19aaefa20876216b035e961Brian Paul                  s++;
32557c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32567c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
32577c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = srcMask << 1;
32587c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32597c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (dstMask == 1) {
32607c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = 128;
32617c652d77220610ecc19aaefa20876216b035e961Brian Paul                  d++;
32627c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d = 0;
32637c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32647c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
32657c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = dstMask >> 1;
32667c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32677c652d77220610ecc19aaefa20876216b035e961Brian Paul            }
32687c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
32697c652d77220610ecc19aaefa20876216b035e961Brian Paul         else {
32707c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
32717c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte dstMask = 128;
32727c652d77220610ecc19aaefa20876216b035e961Brian Paul            const GLubyte *s = src;
32737c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte *d = dst;
32747c652d77220610ecc19aaefa20876216b035e961Brian Paul            *d = 0;
32757c652d77220610ecc19aaefa20876216b035e961Brian Paul            for (i = 0; i < width; i++) {
32767c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (*s & srcMask) {
32777c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d |= dstMask;
32787c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32797c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (srcMask == 1) {
32807c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = 128;
32817c652d77220610ecc19aaefa20876216b035e961Brian Paul                  s++;
32827c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32837c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
32847c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = srcMask >> 1;
32857c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32867c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (dstMask == 1) {
32877c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = 128;
32887c652d77220610ecc19aaefa20876216b035e961Brian Paul                  d++;
32897c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d = 0;
32907c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32917c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
32927c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = dstMask >> 1;
32937c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
32947c652d77220610ecc19aaefa20876216b035e961Brian Paul            }
32957c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
32967c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
32977c652d77220610ecc19aaefa20876216b035e961Brian Paul      src += width_in_bytes;
32987c652d77220610ecc19aaefa20876216b035e961Brian Paul   }
32997c652d77220610ecc19aaefa20876216b035e961Brian Paul}
3300