image.c revision 250069dbb443f26f4dcc409c9c873019a5f50f9d
1250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul/* $Id: image.c,v 1.25 2000/04/08 18:57:45 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"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
35fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
44fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * These are the image packing parameters for Mesa's internal images.
45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * That is, _mesa_unpack_image() returns image data in this format.
46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * When we execute image commands (glDrawPixels, glTexImage, etc)
47fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * from within display lists we have to be sure to set the current
48fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * unpacking params to these values!
49fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
50279d9e3ea7551332d5639b514e004ee66c37d08bBrian Paulconst struct gl_pixelstore_attrib _mesa_native_packing = {
51fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   1,            /* Alignment */
52fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* RowLength */
53fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipPixels */
54fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipRows */
55fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* ImageHeight */
56fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   0,            /* SkipImages */
57fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE,     /* SwapBytes */
58fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GL_FALSE      /* LsbFirst */
59fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul};
60fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
61fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
62fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
63fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
66b7d076fc96ac27117421653a043d00a95f789d24Brian Paulstatic void
67b7d076fc96ac27117421653a043d00a95f789d24Brian Paulflip_bytes( GLubyte *p, GLuint n )
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = (GLuint) p[i];
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
89b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
90b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
104b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
105b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype.
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP.
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum.
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
127b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_type( GLenum type )
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
153b7d076fc96ac27117421653a043d00a95f789d24Brian Paul * Same as _mesa_sizeof_packed_type() but we also accept the
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes.
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
156b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_sizeof_packed_type( GLenum type )
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type.
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format.
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
210b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_components_in_format( GLenum format )
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
227070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type.
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
251b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLint _mesa_bytes_per_pixel( GLenum format, GLenum type )
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
253b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLshort);
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal.
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal.
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
309b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
310b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_is_legal_format_and_type( GLenum format, GLenum type )
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume).
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'.
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  image - start of image data
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         width, height - size of image
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - image format
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - pixel component type
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - the pixelstore attributes
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         img - which image in the volume (0 for 1D or 2D images)
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         row, column - location of pixel in the image
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  address of pixel at (image,row,column) in image or NULL if error.
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
408b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
409b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_image_address( const struct gl_pixelstore_attrib *packing,
410b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     const GLvoid *image, GLsizei width,
411b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLsizei height, GLenum format, GLenum type,
412b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
447b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
453b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
472b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
499ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * Compute the stride between image rows (in bytes) for the given
500ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul * pixel packing parameters and image width, format and type.
501ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
502ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
503ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
504ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
505ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
506ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
507ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
508ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* BITMAP data */
509ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
510ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (width + 7) / 8;
511ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
512ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
513ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
514ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = (packing->RowLength + 7) / 8;
515ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
516ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
517ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
518ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
519ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
520b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
521ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
522ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
523ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
524ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = bytesPerPixel * width;
525ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
526ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
527ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
528ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         GLint bytes = bytesPerPixel * packing->RowLength;
529ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return bytes;
530ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
531ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
532ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
533ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
534ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
535ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
536ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5407c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5417c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
5427c652d77220610ecc19aaefa20876216b035e961Brian Paul                              const struct gl_pixelstore_attrib *unpacking )
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
544959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap( 32, 32, pattern, unpacking );
5457c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (ptrn) {
5467c652d77220610ecc19aaefa20876216b035e961Brian Paul      /* Convert pattern from GLubytes to GLuints and handle big/little
5477c652d77220610ecc19aaefa20876216b035e961Brian Paul       * endian differences
5487c652d77220610ecc19aaefa20876216b035e961Brian Paul       */
5497c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLubyte *p = ptrn;
5507c652d77220610ecc19aaefa20876216b035e961Brian Paul      GLint i;
5517c652d77220610ecc19aaefa20876216b035e961Brian Paul      for (i = 0; i < 32; i++) {
5527c652d77220610ecc19aaefa20876216b035e961Brian Paul         dest[i] = (p[0] << 24)
5537c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[1] << 16)
5547c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[2] <<  8)
5557c652d77220610ecc19aaefa20876216b035e961Brian Paul                 | (p[3]      );
5567c652d77220610ecc19aaefa20876216b035e961Brian Paul         p += 4;
5577c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
5587c652d77220610ecc19aaefa20876216b035e961Brian Paul      FREE(ptrn);
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Pack polygon stipple into user memory given current pixel packing
566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * settings.
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
5687c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
5697c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
5707c652d77220610ecc19aaefa20876216b035e961Brian Paul                            const struct gl_pixelstore_attrib *packing )
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
5727c652d77220610ecc19aaefa20876216b035e961Brian Paul   /* Convert pattern from GLuints to GLubytes to handle big/little
5737c652d77220610ecc19aaefa20876216b035e961Brian Paul    * endian differences.
5747c652d77220610ecc19aaefa20876216b035e961Brian Paul    */
5757c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLubyte ptrn[32*4];
576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint i;
577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (i = 0; i < 32; i++) {
5787c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
5797c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
5807c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
5817c652d77220610ecc19aaefa20876216b035e961Brian Paul      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
5837c652d77220610ecc19aaefa20876216b035e961Brian Paul
5847c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type.
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops.
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct.
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D()
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  ctx - the context
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         n - number of pixels in the span
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         rgba - the pixels
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - dest packing format
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - dest packing datatype
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         destination - destination packing address
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - pixel packing parameters
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         applyTransferOps - apply scale/bias/lookup-table ops?
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
604b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
605b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_pack_rgba_span( const GLcontext *ctx,
606b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      GLuint n, CONST GLubyte rgba[][4],
607b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      GLenum format, GLenum type, GLvoid *destination,
608b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      const struct gl_pixelstore_attrib *packing,
609b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                      GLboolean applyTransferOps )
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
611fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA || ctx->Pixel.MapColorFlag);
612fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Test for optimized case first */
614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
6153428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      MEMCPY( destination, rgba, n * 4 * sizeof(GLubyte) );
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
618fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) {
6193428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
6203428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLint i;
6213428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLubyte *dest = (GLubyte *) destination;
6223428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      for (i = 0; i < n; i++) {
62398b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul         dest[0] = rgba[i][RCOMP];
62498b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul         dest[1] = rgba[i][GCOMP];
62598b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul         dest[2] = rgba[i][BCOMP];
6263428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest += 3;
6273428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
6283428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul   }
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
630fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* general solution */
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat red[MAX_WIDTH], green[MAX_WIDTH], blue[MAX_WIDTH];
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat alpha[MAX_WIDTH], luminance[MAX_WIDTH];
63364b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat rscale = 1.0F / 255.0F;
63464b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat gscale = 1.0F / 255.0F;
63564b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat bscale = 1.0F / 255.0F;
63664b7da799fe82f566706f8b6771b9d12477e4373Brian Paul      const GLfloat ascale = 1.0F / 255.0F;
637b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint comps = _mesa_components_in_format(format);
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint i;
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
64098b607b57da6f7d2ae6e02906c1ae72cd1c3f311Brian Paul      assert(n <= MAX_WIDTH);
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* convert color components to floating point */
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0;i<n;i++) {
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         red[i]   = rgba[i][RCOMP] * rscale;
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         green[i] = rgba[i][GCOMP] * gscale;
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         blue[i]  = rgba[i][BCOMP] * bscale;
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         alpha[i] = rgba[i][ACOMP] * ascale;
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Apply scale, bias and lookup-tables if enabled.
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (applyTransferOps) {
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.ScaleOrBiasRGBA) {
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_scale_and_bias_color( ctx, n, red, green, blue, alpha );
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.MapColorFlag) {
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_map_color( ctx, n, red, green, blue, alpha );
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) {
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         for (i=0;i<n;i++) {
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            GLfloat sum = red[i] + green[i] + blue[i];
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            luminance[i] = CLAMP( sum, 0.0F, 1.0F );
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Pack/store the pixels.  Ugh!  Lots of cases!!!
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      switch (type) {
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE:
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(red[i]);
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(green[i]);
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(blue[i]);
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(alpha[i]);
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(luminance[i]);
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_UBYTE(alpha[i]);
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UBYTE(red[i]);
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UBYTE(green[i]);
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UBYTE(blue[i]);
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(red[i]);
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(green[i]);
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(blue[i]);
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]);
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UBYTE(blue[i]);
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UBYTE(green[i]);
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UBYTE(red[i]);
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(blue[i]);
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(green[i]);
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(red[i]);
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]);
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(alpha[i]);
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(blue[i]);
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(green[i]);
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(red[i]);
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
742b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_BYTE:
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLbyte *dst = (GLbyte *) destination;
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(red[i]);
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(green[i]);
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(blue[i]);
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(alpha[i]);
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(luminance[i]);
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_BYTE(alpha[i]);
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_BYTE(red[i]);
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_BYTE(green[i]);
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_BYTE(blue[i]);
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(red[i]);
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(green[i]);
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(blue[i]);
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]);
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_BYTE(blue[i]);
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_BYTE(green[i]);
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_BYTE(red[i]);
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(blue[i]);
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(green[i]);
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(red[i]);
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]);
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(alpha[i]);
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(blue[i]);
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(green[i]);
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(red[i]);
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
814b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_SHORT:
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(red[i]);
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(green[i]);
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(blue[i]);
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(alpha[i]);
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(luminance[i]);
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_USHORT(alpha[i]);
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_USHORT(red[i]);
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_USHORT(green[i]);
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_USHORT(blue[i]);
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(red[i]);
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(green[i]);
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(blue[i]);
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]);
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_USHORT(blue[i]);
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_USHORT(green[i]);
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_USHORT(red[i]);
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(blue[i]);
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(green[i]);
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(red[i]);
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]);
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(alpha[i]);
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(blue[i]);
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(green[i]);
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(red[i]);
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
887b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
890b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap2( (GLushort *) dst, n * comps);
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_SHORT:
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLshort *dst = (GLshort *) destination;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(red[i]);
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(green[i]);
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(blue[i]);
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(alpha[i]);
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(luminance[i]);
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_SHORT(alpha[i]);
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_SHORT(red[i]);
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_SHORT(green[i]);
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_SHORT(blue[i]);
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(red[i]);
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(green[i]);
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(blue[i]);
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]);
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_SHORT(blue[i]);
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_SHORT(green[i]);
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_SHORT(red[i]);
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(blue[i]);
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(green[i]);
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(red[i]);
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]);
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(alpha[i]);
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(blue[i]);
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(green[i]);
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(red[i]);
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
962b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
965b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap2( (GLushort *) dst, n * comps );
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_INT:
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(red[i]);
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(green[i]);
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(blue[i]);
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(alpha[i]);
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(luminance[i]);
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_UINT(alpha[i]);
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UINT(red[i]);
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UINT(green[i]);
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UINT(blue[i]);
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(red[i]);
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(green[i]);
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(blue[i]);
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(alpha[i]);
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UINT(blue[i]);
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UINT(green[i]);
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UINT(red[i]);
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(blue[i]);
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(green[i]);
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(red[i]);
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(alpha[i]);
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(alpha[i]);
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(blue[i]);
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(green[i]);
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(red[i]);
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1038b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1041b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                  _mesa_swap4( (GLuint *) dst, n * comps );
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_INT:
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLint *dst = (GLint *) destination;
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(red[i]);
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(green[i]);
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(blue[i]);
1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(alpha[i]);
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(luminance[i]);
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_INT(alpha[i]);
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_INT(red[i]);
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_INT(green[i]);
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_INT(blue[i]);
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(red[i]);
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(green[i]);
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(blue[i]);
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(alpha[i]);
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_INT(blue[i]);
1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_INT(green[i]);
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_INT(red[i]);
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(blue[i]);
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(green[i]);
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(red[i]);
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(alpha[i]);
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(alpha[i]);
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(blue[i]);
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(green[i]);
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(red[i]);
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1114b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
1117b7d076fc96ac27117421653a043d00a95f789d24Brian Paul		  _mesa_swap4( (GLuint *) dst, n * comps );
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_FLOAT:
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLfloat *dst = (GLfloat *) destination;
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = red[i];
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = green[i];
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = blue[i];
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = alpha[i];
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = luminance[i];
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = luminance[i];
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = alpha[i];
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = red[i];
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = green[i];
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = blue[i];
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = red[i];
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = green[i];
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = blue[i];
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = alpha[i];
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = blue[i];
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = green[i];
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = red[i];
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = blue[i];
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = green[i];
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = red[i];
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = alpha[i];
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = alpha[i];
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = blue[i];
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = green[i];
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = red[i];
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1190b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     gl_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
1193b7d076fc96ac27117421653a043d00a95f789d24Brian Paul		  _mesa_swap4( (GLuint *) dst, n * comps );
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_3_3_2:
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 7.0F)) << 5)
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 7.0F)) << 2)
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 3.0F))     );
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_2_3_3_REV:
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 7.0F))     )
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 7.0F)) << 3)
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 3.0F)) << 5);
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5:
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F)) << 11)
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 63.0F)) <<  5)
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F))      );
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5_REV:
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F))      )
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 63.0F)) <<  5)
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) << 11);
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4:
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 15.0F)) << 12)
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 15.0F)) <<  8)
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 15.0F)) <<  4)
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] * 15.0F))      );
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 15.0F))      )
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 15.0F)) <<  4)
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 15.0F)) <<  8)
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] * 15.0F)) << 12);
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_5_5_1:
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F)) << 11)
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 31.0F)) <<  6)
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) <<  1)
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] *  1.0F))      );
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F))      )
1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 31.0F)) <<  5)
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) << 10)
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] *  1.0F)) << 15);
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8:
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 255.0F)) << 24)
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) <<  8)
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F))      );
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 255.0F)) << 24)
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) <<  8)
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F))      );
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 255.0F)) << 24)
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) << 16)
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F))      );
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8_REV:
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 255.0F))      )
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) << 16)
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F)) << 24);
1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 255.0F))      )
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) << 16)
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F)) << 24);
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 255.0F))      )
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) <<  8)
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) << 24);
1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_10_10_10_2:
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 1023.0F)) << 22)
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 12)
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) <<  2)
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F))      );
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 1023.0F)) << 22)
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 12)
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 1023.0F)) <<  2)
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F))      );
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 1023.0F)) << 22)
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 12)
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) <<  2)
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   *    3.0F))      );
1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_2_10_10_10_REV:
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 1023.0F))      )
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 10)
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 20)
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F)) << 30);
1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 1023.0F))      )
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 10)
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 1023.0F)) << 20)
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F)) << 30);
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 1023.0F))      )
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 10)
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 20)
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   *    3.0F)) << 30);
1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         default:
1398b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            gl_problem( ctx, "bad type in _mesa_pack_rgba_span" );
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP2BYTE(VALUE)			\
1405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[1];			\
1409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = tmp;				\
1410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define SWAP4BYTE(VALUE)			\
1413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {						\
1414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *bytes = (GLubyte *) &(VALUE);	\
1415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte tmp = bytes[0];			\
1416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[0] = bytes[3];			\
1417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[3] = tmp;				\
1418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      tmp = bytes[1];				\
1419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[1] = bytes[2];			\
1420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytes[2] = tmp;				\
1421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_uint_indexes(GLuint n, GLuint indexes[],
1426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
1427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     const struct gl_pixelstore_attrib *unpack )
1428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   assert(srcFormat == GL_COLOR_INDEX);
1430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
1432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
1433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
1439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BITMAP:
1442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *ubsrc = (GLubyte *) src;
1444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->LsbFirst) {
1445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 128) {
1450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 1;
1451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask << 1;
1455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
1461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
1463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  if (mask == 1) {
1464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = 128;
1465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     ubsrc++;
1466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  else {
1468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                     mask = mask >> 1;
1469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  }
1470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *s = (const GLubyte *) src;
1478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLbyte *s = (const GLbyte *) src;
1486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++)
1487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               indexes[i] = s[i];
1488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *s = (const GLushort *) src;
1494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLushort value = s[i];
1497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLshort *s = (const GLshort *) src;
1511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLshort value = s[i];
1514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP2BYTE(value);
1515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1524c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *s = (const GLuint *) src;
1528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLuint value = s[i];
1531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1542c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLint *s = (const GLint *) src;
1545c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1546c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLint value = s[i];
1548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = value;
1550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  indexes[i] = s[i];
1555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLfloat *s = (const GLfloat *) src;
1562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (unpack->SwapBytes) {
1563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
1564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  GLfloat value = s[i];
1565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  SWAP4BYTE(value);
1566959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) value;
1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
1568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1569c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else {
1570c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++)
1571959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul                  indexes[i] = (GLuint) s[i];
1572c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
1576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract_uint_indexes");
1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
1584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This function extracts floating point RGBA values from arbitrary
1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image data.  srcFormat and srcType are the format and type parameters
1586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
1587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
1589c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * implements the "Conversion to floating point", "Conversion to RGB",
1590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and "Final Expansion to RGBA" operations.
1591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
1592c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  n - number of pixels
1593c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        rgba - output colors
1594c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcFormat - format of incoming data
1595c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - datatype of incoming data
1596c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        src - source data pointer
1597c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        swapBytes - perform byteswapping of incoming data?
1598c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
1599c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void
1600c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulextract_float_rgba(GLuint n, GLfloat rgba[][4],
1601c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
1602c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                   GLboolean swapBytes)
1603c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
1604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint redIndex, greenIndex, blueIndex, alphaIndex;
1605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint stride;
1606c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint rComp, bComp, gComp, aComp;
1607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1608c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
1609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
1611c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
1612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
1614c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
1615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
1617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT);
1620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_UNSIGNED_BYTE ||
1622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
1623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
1626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
1628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
1629a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
1630a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
1631a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
1633a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
1634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
1635a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
1637a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
1638a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
1639a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1641a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul   rComp = gComp = bComp = aComp = -1;
1642a0020435f58baef6a67d3c073b62ea6b1d143af1Brian Paul
1643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcFormat) {
1644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RED:
1645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1649c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_GREEN:
1650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 0;
1651c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = blueIndex = alphaIndex = -1;
1652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BLUE:
1655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = alphaIndex = -1;
1657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ALPHA:
1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = -1;
1661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
1662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE:
1665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_LUMINANCE_ALPHA:
1670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = greenIndex = blueIndex = 0;
1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 1;
1672c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 2;
1673c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INTENSITY:
1675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = blueIndex = alphaIndex = -1;
1677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 1;
1678c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGB:
1680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
1683c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1684c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
1685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGR:
1687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
1688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = -1;
1691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 3;
1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1693c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_RGBA:
1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 0;
1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 2;
1697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
1698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 0;
1699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
1700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 2;
1701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
1702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BGRA:
1705c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 2;
1706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 1;
1707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 0;
1708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 3;
1709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 2;
1710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 1;
1711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 0;
1712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 3;
1713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_ABGR_EXT:
1716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         redIndex = 3;
1717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         greenIndex = 2;
1718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         blueIndex = 1;
1719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         alphaIndex = 0;
1720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rComp = 3;
1721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gComp = 2;
1722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         bComp = 1;
1723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         aComp = 0;
1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         stride = 4;
1725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcFormat in extract float data");
1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION)		\
1733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if ((INDEX) < 0) {							\
1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = DEFAULT;					\
1737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
1739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (swapBytes) {						\
1740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         TYPE value = s[INDEX];						\
1744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (sizeof(TYPE) == 2) {					\
1745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP2BYTE(value);						\
1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (sizeof(TYPE) == 4) {					\
1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            SWAP4BYTE(value);						\
1749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }								\
1750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(value);		\
1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }									\
1754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {								\
1755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      const TYPE *s = (const TYPE *) src;				\
1756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint i;								\
1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (i = 0; i < n; i++) {						\
1758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]);		\
1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         s += stride;							\
1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }									\
1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
1762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   switch (srcType) {
1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE:
1765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1766c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
1768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
1769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_BYTE:
1771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT:
1777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
1781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_SHORT:
1783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
1787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT:
1789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
1792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_INT:
1795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLint, INT_TO_FLOAT);
1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLint, INT_TO_FLOAT);
1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_FLOAT:
1801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(redIndex,   RCOMP, 0.0F, GLfloat, (GLfloat));
1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
1803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(blueIndex,  BCOMP, 0.0F, GLfloat, (GLfloat));
1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
1805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_3_3_2:
1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 5)      ) * (1.0F / 7.0F);
1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p     ) & 0x3) * (1.0F / 3.0F);
1815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_BYTE_2_3_3_REV:
1820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         {
1821c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *ubsrc = (const GLubyte *) src;
1822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte p = ubsrc[i];
1825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p     ) & 0x7) * (1.0F / 7.0F);
1826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
1827c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 6)      ) * (1.0F / 3.0F);
1828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1831c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5:
1833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1844c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1845c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_6_5_REV:
1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][RCOMP] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][GCOMP] = ((p >>  5) & 0x3f) * (1.0F / 63.0F);
1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][BCOMP] = ((p >> 11)       ) * (1.0F / 31.0F);
1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][ACOMP] = 1.0F;
1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4:
1883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1884c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0xf) * (1.0F / 15.0F);
1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  4) & 0xf) * (1.0F / 15.0F);
1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  8) & 0xf) * (1.0F / 15.0F);
1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 12)      ) * (1.0F / 15.0F);
1929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_5_5_5_1:
1933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
1940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
1942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1947c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p >> 11)       ) * (1.0F / 31.0F);
1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  6) & 0x1f) * (1.0F / 31.0F);
1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >>  1) & 0x1f) * (1.0F / 31.0F);
1953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p      ) & 0x1)  * (1.0F /  1.0F);
1954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP2BYTE(p);
1964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
1967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
1968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLushort *ussrc = (const GLushort *) src;
1972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLushort p = ussrc[i];
1975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x1f) * (1.0F / 31.0F);
1976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >>  5) & 0x1f) * (1.0F / 31.0F);
1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 15)       ) * (1.0F /  1.0F);
1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8:
1983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
1984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
1990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
1991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
1992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
1993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
1999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_8_8_8_8_REV:
2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
2027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_10_10_10_2:
2031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2037a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2038a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2039a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2040a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2048a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][rComp] = ((p >> 22)        ) * (1.0F / 1023.0F);
2049a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
2050a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][bComp] = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F);
2051a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul               rgba[i][aComp] = ((p      ) & 0x3  ) * (1.0F /    3.0F);
2052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      case GL_UNSIGNED_INT_2_10_10_10_REV:
2056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (swapBytes) {
2057c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               SWAP4BYTE(p);
2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2063c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLuint *uisrc = (const GLuint *) src;
2070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i ++) {
2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint p = uisrc[i];
2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][rComp] = ((p      ) & 0x3ff) * (1.0F / 1023.0F);
2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
2076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               rgba[i][aComp] = ((p >> 30)        ) * (1.0F /    3.0F);
2077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      default:
2081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_problem(NULL, "bad srcType in extract float data");
2082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         break;
2083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color image data from a client buffer according to
2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters.  Apply any enabled pixel transfer
2091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled.
2092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return GLubyte values in the specified dest image format.
2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels and glTexImage?D().
2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input:  ctx - the context
2095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         n - number of pixels in the span
2096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dstFormat - format of destination color array
2097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         dest - the destination color array
2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcFormat - source image format
2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         srcType - source image  datatype
2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         source - source image pointer
2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         unpacking - pixel unpacking parameters
2102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *         applyTransferOps - apply scale/bias/lookup-table ops?
2103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * XXX perhaps expand this to process whole images someday.
2105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_ubyte_color_span( const GLcontext *ctx,
2108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLuint n, GLenum dstFormat, GLubyte dest[],
2109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLenum srcFormat, GLenum srcType,
2110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               const GLvoid *source,
2111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               const struct gl_pixelstore_attrib *unpacking,
2112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               GLboolean applyTransferOps )
2113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstFormat == GL_ALPHA ||
2115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE ||
2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_LUMINANCE_ALPHA ||
2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_INTENSITY ||
2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGB ||
2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_RGBA ||
2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstFormat == GL_COLOR_INDEX);
2121c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2122c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcFormat == GL_RED ||
2123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_GREEN ||
2124c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BLUE ||
2125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ALPHA ||
2126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE ||
2127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_LUMINANCE_ALPHA ||
2128c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_INTENSITY ||
2129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGB ||
2130c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGR ||
2131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_RGBA ||
2132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_BGRA ||
2133c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_ABGR_EXT ||
2134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcFormat == GL_COLOR_INDEX);
2135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2136c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2137c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT ||
2144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2145a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2146a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2147a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2149a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2150c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2151a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2153a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2154a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2155a5f618a291e67e74c56df235d45c3eb967ebb41fBrian Paul          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2157250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul   /* this is intended for RGBA mode only */
2158fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   assert(ctx->Visual->RGBAflag);
2159c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2160c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
2161fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                        ctx->Pixel.MapColorFlag ||
2162250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2163250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul                        ctx->Pixel.ScaleOrBiasRGBApcm);
2164c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2165c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /* Try simple cases first */
2166c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) {
2167c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstFormat == GL_RGBA) {
2168c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGBA) {
2169c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY( dest, source, n * 4 * sizeof(GLubyte) );
2170c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2171c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2172c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGB) {
2173c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2174c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *src = (const GLubyte *) source;
2175c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *dst = dest;
2176c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2177c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2178c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2179c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2180c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[3] = 255;
2181c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 3;
2182c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 4;
2183c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2184c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2185c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2186c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2187c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else if (dstFormat == GL_RGB) {
2188c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (srcFormat == GL_RGB) {
2189c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY( dest, source, n * 3 * sizeof(GLubyte) );
2190c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2191c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2192c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else if (srcFormat == GL_RGBA) {
2193c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLuint i;
2194c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            const GLubyte *src = (const GLubyte *) source;
2195c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            GLubyte *dst = dest;
2196c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            for (i = 0; i < n; i++) {
2197c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[0] = src[0];
2198c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[1] = src[1];
2199c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst[2] = src[2];
2200c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               src += 4;
2201c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               dst += 3;
2202c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2203c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            return;
2204c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2205c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2206b09a4cd913e2de612fddf5411185a257da35647cBrian Paul      else if (dstFormat == srcFormat) {
2207b7d076fc96ac27117421653a043d00a95f789d24Brian Paul         GLint comps = _mesa_components_in_format(srcFormat);
2208b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         assert(comps > 0);
2209b09a4cd913e2de612fddf5411185a257da35647cBrian Paul         MEMCPY( dest, source, n * comps * sizeof(GLubyte) );
2210c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return;
2211c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2212c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2213c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2214c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2215c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2216c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* general solution */
2217c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLfloat rgba[MAX_WIDTH][4];
2218c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstComponents;
2219c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstRedIndex, dstGreenIndex, dstBlueIndex, dstAlphaIndex;
2220c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint dstLuminanceIndex, dstIntensityIndex;
2221c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2222b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      dstComponents = _mesa_components_in_format( dstFormat );
2223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* source & dest image formats should have been error checked by now */
2224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(dstComponents > 0);
2225c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2226c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2227c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * Extract image data and convert to RGBA floats
2228c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2229c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2230c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (srcFormat == GL_COLOR_INDEX) {
2231c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint indexes[MAX_WIDTH];
2232c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
2233c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                              unpacking);
2234c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2235c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         /* shift and offset indexes */
2236c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         gl_shift_and_offset_ci(ctx, n, indexes);
2237c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2238c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (dstFormat == GL_COLOR_INDEX) {
2239c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (applyTransferOps) {
2240c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               if (ctx->Pixel.MapColorFlag) {
2241c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  /* Apply lookup table */
2242c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  gl_map_ci(ctx, n, indexes);
2243c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2244c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2245c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2246c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2247c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2248c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2249c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2250c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* convert to GLubyte and return */
2251c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
2252c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2253c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2254c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dest[i] = (GLubyte) (indexes[i] & 0xff);
2255c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2256c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2257c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2258c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         else {
2259c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Convert indexes to RGBA */
2260c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_map_ci_to_rgba_float(ctx, n, indexes, rgba);
2261c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2262c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2263c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      else {
2264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         extract_float_rgba(n, rgba, srcFormat, srcType, source,
2265c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                            unpacking->SwapBytes);
2266c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2267c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (applyTransferOps) {
2268c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* scale and bias colors */
2269250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul            _mesa_scale_and_bias_rgba_float(ctx, n, rgba);
2270c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2271c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* color table lookup */
2272c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (ctx->Pixel.MapColorFlag) {
2273250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul               _mesa_map_rgba_float(ctx, n, rgba);
2274250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul            }
2275250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul
2276250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul            if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
2277250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul                ctx->Pixel.ScaleOrBiasRGBApcm) {
2278250069dbb443f26f4dcc409c9c873019a5f50f9dBrian Paul               _mesa_transform_rgba(ctx, n, rgba);
2279c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2280c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2281c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2282c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2283c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2284c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2285b09a4cd913e2de612fddf5411185a257da35647cBrian Paul       * XXX This is where more color table lookups, convolution,
2286b09a4cd913e2de612fddf5411185a257da35647cBrian Paul       * histograms, minmax, color matrix, etc would take place if
2287b09a4cd913e2de612fddf5411185a257da35647cBrian Paul       * implemented.
2288b09a4cd913e2de612fddf5411185a257da35647cBrian Paul       * See figure 3.7 in the OpenGL 1.2 specification for more info.
2289c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2290c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2291c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2292c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* clamp to [0,1] */
2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      {
2294c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2295c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2296c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F);
2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F);
2298c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F);
2299c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F);
2300c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2301c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2302c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2303c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now determine which color channels we need to produce.
2304c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * And determine the dest index (offset) within each color tuple.
2305c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2306c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstFormat) {
2307c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_ALPHA:
2308c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 0;
2309c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2310c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2311c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE:
2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2314c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2315c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2316c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2317c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_LUMINANCE_ALPHA:
2318c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = 0;
2319c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 1;
2320c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = -1;
2321c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = -1;
2322c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_INTENSITY:
2324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstIntensityIndex = 0;
2325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = dstGreenIndex = dstBlueIndex = dstAlphaIndex = -1;
2326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = -1;
2327c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGB:
2329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2330c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2331c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = dstLuminanceIndex = dstIntensityIndex = -1;
2333c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2334c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_RGBA:
2335c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstRedIndex = 0;
2336c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstGreenIndex = 1;
2337c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstBlueIndex = 2;
2338c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstAlphaIndex = 3;
2339c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dstLuminanceIndex = dstIntensityIndex = -1;
2340c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2341c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
2342c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_problem(ctx, "bad dstFormat in _mesa_unpack_ubyte_span()");
2343276988ec96a48d4ee5c28c0a2da3aa2b5ee0bbeaBrian Paul            return;
2344c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2345c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2346c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2347c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* Now return the GLubyte data in the requested dstFormat */
2348fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2349c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstRedIndex >= 0) {
2350c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2351c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2352c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2353c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstRedIndex] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2354c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2356c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2358c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstGreenIndex >= 0) {
2359c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2360c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2361c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2362c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstGreenIndex] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
2363c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2366c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2367c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstBlueIndex >= 0) {
2368c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2369c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2370c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstBlueIndex] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
2372c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2373c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2374c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstAlphaIndex >= 0) {
2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[dstAlphaIndex] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2384c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstIntensityIndex >= 0) {
2386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstIntensityIndex == 0);
2389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstComponents == 1);
2390c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2391c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Intensity comes from red channel */
2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2396c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (dstLuminanceIndex >= 0) {
2397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLubyte *dst = dest;
2398c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         GLuint i;
2399c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         assert(dstLuminanceIndex == 0);
2400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (i = 0; i < n; i++) {
2401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Luminance comes from red channel */
2402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst[0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
2403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += dstComponents;
2404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2406c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2407c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2411c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2412c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack a row of color index data from a client buffer according to
2413c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and applyTransferOps is true.
2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
2416c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *
2417c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Args:  ctx - the context
2418c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        n - number of pixels
2419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dstType - destination datatype
2420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        dest - destination array
2421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        srcType - source pixel type
2422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        source - source data pointer
2423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        unpacking - pixel unpacking parameters
2424c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *        applyTransferOps - apply offset/bias/lookup ops?
2425c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid
2427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum dstType, GLvoid *dest,
2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLenum srcType, const GLvoid *source,
2430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         const struct gl_pixelstore_attrib *unpacking,
2431c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                         GLboolean applyTransferOps )
2432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2433c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(srcType == GL_BITMAP ||
2434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_BYTE ||
2435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_BYTE ||
2436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_SHORT ||
2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_SHORT ||
2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_UNSIGNED_INT ||
2439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_INT ||
2440c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          srcType == GL_FLOAT);
2441c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
2443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_SHORT ||
2444c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul          dstType == GL_UNSIGNED_INT);
2445c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
2447c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   /*
2449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    * Try simple cases first
2450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul    */
2451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
2452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       && dstType == GL_UNSIGNED_BYTE) {
2453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
2454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
2456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
2457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
2458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
2460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /*
2461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       * general solution
2462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul       */
2463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLuint indexes[MAX_WIDTH];
2464c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(n <= MAX_WIDTH);
2465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2466c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
2467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                           unpacking);
2468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (applyTransferOps) {
2470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* shift and offset indexes */
2472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_shift_and_offset_ci(ctx, n, indexes);
2473c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         if (ctx->Pixel.MapColorFlag) {
2476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* Apply lookup table */
2477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_map_ci(ctx, n, indexes);
2478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2480c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      /* convert to dest type */
2482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      switch (dstType) {
2483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_BYTE:
2484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
2485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLubyte *dst = (GLubyte *) dest;
2486c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2488c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
2489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_SHORT:
2493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            {
2494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint *dst = (GLuint *) dest;
2495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               GLuint i;
2496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               for (i = 0; i < n; i++) {
2497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
2498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul               }
2499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         case GL_UNSIGNED_INT:
2502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
2503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            break;
2504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         default:
2505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_index_span");
2506c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2507c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/*
2512fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack a row of stencil data from a client buffer according to
2513fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
2514fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * and applyTransferOps is true.
2515fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * This is (or will be) used by glDrawPixels
2516fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *
2517fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Args:  ctx - the context
2518fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        n - number of pixels
2519fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dstType - destination datatype
2520fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        dest - destination array
2521fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        srcType - source pixel type
2522fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        source - source data pointer
2523fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        unpacking - pixel unpacking parameters
2524fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul *        applyTransferOps - apply offset/bias/lookup ops?
2525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
2526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
2527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
2528fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum dstType, GLvoid *dest,
2529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLenum srcType, const GLvoid *source,
2530fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           const struct gl_pixelstore_attrib *unpacking,
2531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           GLboolean applyTransferOps )
2532fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
2533fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(srcType == GL_BITMAP ||
2534fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_BYTE ||
2535fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_BYTE ||
2536fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_SHORT ||
2537fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_SHORT ||
2538fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_UNSIGNED_INT ||
2539fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_INT ||
2540fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          srcType == GL_FLOAT);
2541fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2542fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   ASSERT(dstType == GL_UNSIGNED_BYTE ||
2543fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_SHORT ||
2544fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul          dstType == GL_UNSIGNED_INT);
2545fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2546fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
2547fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2548fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /*
2549fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    * Try simple cases first
2550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul    */
2551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
2552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       && dstType == GL_UNSIGNED_BYTE) {
2553fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLubyte));
2554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2555fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
2556fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
2557fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      MEMCPY(dest, source, n * sizeof(GLuint));
2558fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2559fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   else {
2560fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /*
2561fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       * general solution
2562fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul       */
2563fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint indexes[MAX_WIDTH];
2564fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      assert(n <= MAX_WIDTH);
2565fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2566fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
2567fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                           unpacking);
2568fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2569fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (applyTransferOps) {
2570fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
2571fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* shift and offset indexes */
2572fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            gl_shift_and_offset_ci(ctx, n, indexes);
2573fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2574fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2575fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (ctx->Pixel.MapStencilFlag) {
2576fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            /* Apply stencil lookup table */
2577fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint mask = ctx->Pixel.MapStoSsize - 1;
2578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2579fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i=0;i<n;i++) {
2580fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               indexes[i] = ctx->Pixel.MapStoS[ indexes[i] & mask ];
2581fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2582fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2583fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2584fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2585fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      /* convert to dest type */
2586fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      switch (dstType) {
2587fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_BYTE:
2588fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
2589fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLubyte *dst = (GLubyte *) dest;
2590fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
2591fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
2592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLubyte) (indexes[i] & 0xff);
2593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2595fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2596fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_SHORT:
2597fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            {
2598fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint *dst = (GLuint *) dest;
2599fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               GLuint i;
2600fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               for (i = 0; i < n; i++) {
2601fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dst[i] = (GLushort) (indexes[i] & 0xffff);
2602fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2603fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2604fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2605fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         case GL_UNSIGNED_INT:
2606fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            MEMCPY(dest, indexes, n * sizeof(GLuint));
2607fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            break;
2608fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         default:
2609fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            gl_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
2610fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2611fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2612fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
2613fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2614fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2615fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2616fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
2617fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest,
2618fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLenum srcType, const GLvoid *source,
2619fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         const struct gl_pixelstore_attrib *unpacking,
2620fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                         GLboolean applyTransferOps )
2621fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
2622fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLfloat *depth = MALLOC(n * sizeof(GLfloat));
2623fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!depth)
2624fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return;
2625fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2626fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   switch (srcType) {
2627fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_BYTE:
2628fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2629fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2630fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
2631fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2632fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = BYTE_TO_FLOAT(src[i]);
2633fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2634fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2635fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2636fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_BYTE:
2637fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2638fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2639fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLubyte *src = (const GLubyte *) source;
2640fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2641fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UBYTE_TO_FLOAT(src[i]);
2642fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2643fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2644fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2645fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_SHORT:
2646fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2647fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2648fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLshort *src = (const GLshort *) source;
2649fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2650fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = SHORT_TO_FLOAT(src[i]);
2651fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2652fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2653fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2654fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_SHORT:
2655fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2656fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2657fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLushort *src = (const GLushort *) source;
2658fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2659fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = USHORT_TO_FLOAT(src[i]);
2660fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2661fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2662fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2663fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_INT:
2664fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2665fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2666fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLint *src = (const GLint *) source;
2667fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2668fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = INT_TO_FLOAT(src[i]);
2669fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2670fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2671fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2672fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_UNSIGNED_INT:
2673fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         {
2674fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLuint i;
2675fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            const GLuint *src = (const GLuint *) source;
2676fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < n; i++) {
2677fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               depth[i] = UINT_TO_FLOAT(src[i]);
2678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2680fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2681fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      case GL_FLOAT:
2682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         MEMCPY(depth, source, n * sizeof(GLfloat));
2683fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         break;
2684fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      default:
2685fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         gl_problem(NULL, "bad type in _mesa_unpack_depth_span()");
2686fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return;
2687fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2689fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2690fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* apply depth scale and bias */
2691fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
2692fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
2693fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
2694fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         depth[i] = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
2695fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2696fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2697fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2698fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* clamp depth values to [0,1] and convert from floats to integers */
2699fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   {
2700ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      const GLfloat zs = ctx->Visual->DepthMaxF;
2701fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      GLuint i;
2702fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      for (i = 0; i < n; i++) {
2703ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         dest[i] = (GLdepth) (CLAMP(depth[i], 0.0F, 1.0F) * zs);
2704fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2705fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2706fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2707fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   FREE(depth);
2708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
2709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2710fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
2713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Unpack image data.  Apply byteswapping, byte flipping (bitmap).
2714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return all image data in a contiguous block.
2715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */
2716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulvoid *
2717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul_mesa_unpack_image( GLsizei width, GLsizei height, GLsizei depth,
2718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    GLenum format, GLenum type, const GLvoid *pixels,
2719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                    const struct gl_pixelstore_attrib *unpack )
2720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{
2721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLint bytesPerRow, compsPerRow;
2722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   GLboolean flipBytes, swap2, swap4;
2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (!pixels)
2725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* not necessarily an error */
2726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (width <= 0 || height <= 0 || depth <= 0)
2728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return NULL;  /* generate error later */
2729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   if (format == GL_BITMAP) {
2731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = (width + 7) >> 3;
2732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = !unpack->LsbFirst;
2733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = swap4 = GL_FALSE;
2734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = 0;
2735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   else {
2737b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
2738b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint components = _mesa_components_in_format(format);
2739c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint bytesPerComp;
2740c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (bytesPerPixel <= 0 || components <= 0)
2741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* bad format or type.  generate error later */
2742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerRow = bytesPerPixel * width;
2743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      bytesPerComp = bytesPerPixel / components;
2744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      flipBytes = GL_FALSE;
2745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
2746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
2747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      compsPerRow = components * width;
2748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      assert(compsPerRow >= width);
2749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2750c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   {
2752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *destBuffer = MALLOC(bytesPerRow * height * depth);
2753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLubyte *dst;
2754c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      GLint img, row;
2755c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      if (!destBuffer)
2756c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         return NULL;   /* generate GL_OUT_OF_MEMORY later */
2757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul
2758c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      dst = destBuffer;
2759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      for (img = 0; img < depth; img++) {
2760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         for (row = 0; row < height; row++) {
2761b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            const GLvoid *src = _mesa_image_address(unpack, pixels,
2762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul                               width, height, format, type, img, row, 0);
2763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            MEMCPY(dst, src, bytesPerRow);
2764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            /* byte flipping/swapping */
2765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            if (flipBytes) {
2766b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               flip_bytes((GLubyte *) dst, bytesPerRow);
2767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap2) {
2769b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap2((GLushort*) dst, compsPerRow);
2770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2771c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            else if (swap4) {
2772b7d076fc96ac27117421653a043d00a95f789d24Brian Paul               _mesa_swap4((GLuint*) dst, compsPerRow);
2773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            }
2774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul            dst += bytesPerRow;
2775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul         }
2776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      }
2777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul      return destBuffer;
2778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul   }
2779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul}
2780fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2781fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2782fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul/*
2783fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
2784fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * order with row alignment = 1 byte.
2785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul */
2786fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLvoid *
2787fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
2788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                     const struct gl_pixelstore_attrib *packing )
2789fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
2790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLint bytes, row, width_in_bytes;
2791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GLubyte *buffer, *dst;
2792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!pixels)
2794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return NULL;
2795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2796fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   /* Alloc dest storage */
2797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   bytes = ((width + 7) / 8 * height);
2798fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   buffer = (GLubyte *) MALLOC( bytes );
2799fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   if (!buffer)
2800fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      return NULL;
2801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2802fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   width_in_bytes = CEILING( width, 8 );
2804fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   dst = buffer;
2805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   for (row = 0; row < height; row++) {
2806b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      GLubyte *src = _mesa_image_address( packing, pixels, width, height,
2807b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
2808b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          0, row, 0 );
2809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (!src) {
2810fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         FREE(buffer);
2811fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         return NULL;
2812fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2813fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2814fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      if (packing->SkipPixels == 0) {
2815fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         MEMCPY( dst, src, width_in_bytes );
2816fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (packing->LsbFirst) {
2817b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            flip_bytes( dst, width_in_bytes );
2818fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2819fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2820fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      else {
2821fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
2822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         GLint i;
2823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         if (packing->LsbFirst) {
2824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
2825fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte dstMask = 128;
2826fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *s = src;
2827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *d = dst;
2828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            *d = 0;
2829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < width; i++) {
2830fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (*s & srcMask) {
2831fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d |= dstMask;
2832fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2833fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (srcMask == 128) {
2834fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = 1;
2835fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  s++;
2836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2837fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
2838fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = srcMask << 1;
2839fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2840fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (dstMask == 1) {
2841fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = 128;
2842fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  d++;
2843fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d = 0;
2844fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2845fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
2846fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = dstMask >> 1;
2847fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2848fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2849fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         else {
2851fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
2852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte dstMask = 128;
2853fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *s = src;
2854fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            GLubyte *d = dst;
2855fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            *d = 0;
2856fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            for (i = 0; i < width; i++) {
2857fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (*s & srcMask) {
2858fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d |= dstMask;
2859fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2860fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (srcMask == 1) {
2861fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = 128;
2862fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  s++;
2863fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2864fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
2865fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  srcMask = srcMask >> 1;
2866fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               if (dstMask == 1) {
2868fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = 128;
2869fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  d++;
2870fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  *d = 0;
2871fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2872fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               else {
2873fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul                  dstMask = dstMask >> 1;
2874fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul               }
2875fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul            }
2876fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul         }
2877fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      }
2878fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      dst += width_in_bytes;
2879fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   }
2880fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2881fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   return buffer;
2882fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
28837c652d77220610ecc19aaefa20876216b035e961Brian Paul
28847c652d77220610ecc19aaefa20876216b035e961Brian Paul
28857c652d77220610ecc19aaefa20876216b035e961Brian Paul/*
28867c652d77220610ecc19aaefa20876216b035e961Brian Paul * Pack bitmap data.
28877c652d77220610ecc19aaefa20876216b035e961Brian Paul */
28887c652d77220610ecc19aaefa20876216b035e961Brian Paulvoid
28897c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
28907c652d77220610ecc19aaefa20876216b035e961Brian Paul                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
28917c652d77220610ecc19aaefa20876216b035e961Brian Paul{
28927c652d77220610ecc19aaefa20876216b035e961Brian Paul   GLint row, width_in_bytes;
28937c652d77220610ecc19aaefa20876216b035e961Brian Paul   const GLubyte *src;
28947c652d77220610ecc19aaefa20876216b035e961Brian Paul
28957c652d77220610ecc19aaefa20876216b035e961Brian Paul   if (!source)
28967c652d77220610ecc19aaefa20876216b035e961Brian Paul      return;
28977c652d77220610ecc19aaefa20876216b035e961Brian Paul
28987c652d77220610ecc19aaefa20876216b035e961Brian Paul   width_in_bytes = CEILING( width, 8 );
28997c652d77220610ecc19aaefa20876216b035e961Brian Paul   src = source;
29007c652d77220610ecc19aaefa20876216b035e961Brian Paul   for (row = 0; row < height; row++) {
2901b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      GLubyte *dst = _mesa_image_address( packing, dest, width, height,
2902b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          GL_COLOR_INDEX, GL_BITMAP,
2903b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                                          0, row, 0 );
29047c652d77220610ecc19aaefa20876216b035e961Brian Paul      if (!dst)
29057c652d77220610ecc19aaefa20876216b035e961Brian Paul         return;
29067c652d77220610ecc19aaefa20876216b035e961Brian Paul
29077c652d77220610ecc19aaefa20876216b035e961Brian Paul      if (packing->SkipPixels == 0) {
29087c652d77220610ecc19aaefa20876216b035e961Brian Paul         MEMCPY( dst, src, width_in_bytes );
29097c652d77220610ecc19aaefa20876216b035e961Brian Paul         if (packing->LsbFirst) {
2910b7d076fc96ac27117421653a043d00a95f789d24Brian Paul            flip_bytes( dst, width_in_bytes );
29117c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
29127c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
29137c652d77220610ecc19aaefa20876216b035e961Brian Paul      else {
29147c652d77220610ecc19aaefa20876216b035e961Brian Paul         /* handling SkipPixels is a bit tricky (no pun intended!) */
29157c652d77220610ecc19aaefa20876216b035e961Brian Paul         GLint i;
29167c652d77220610ecc19aaefa20876216b035e961Brian Paul         if (packing->LsbFirst) {
29177c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
29187c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte dstMask = 128;
29197c652d77220610ecc19aaefa20876216b035e961Brian Paul            const GLubyte *s = src;
29207c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte *d = dst;
29217c652d77220610ecc19aaefa20876216b035e961Brian Paul            *d = 0;
29227c652d77220610ecc19aaefa20876216b035e961Brian Paul            for (i = 0; i < width; i++) {
29237c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (*s & srcMask) {
29247c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d |= dstMask;
29257c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29267c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (srcMask == 128) {
29277c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = 1;
29287c652d77220610ecc19aaefa20876216b035e961Brian Paul                  s++;
29297c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29307c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
29317c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = srcMask << 1;
29327c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29337c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (dstMask == 1) {
29347c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = 128;
29357c652d77220610ecc19aaefa20876216b035e961Brian Paul                  d++;
29367c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d = 0;
29377c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29387c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
29397c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = dstMask >> 1;
29407c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29417c652d77220610ecc19aaefa20876216b035e961Brian Paul            }
29427c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
29437c652d77220610ecc19aaefa20876216b035e961Brian Paul         else {
29447c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
29457c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte dstMask = 128;
29467c652d77220610ecc19aaefa20876216b035e961Brian Paul            const GLubyte *s = src;
29477c652d77220610ecc19aaefa20876216b035e961Brian Paul            GLubyte *d = dst;
29487c652d77220610ecc19aaefa20876216b035e961Brian Paul            *d = 0;
29497c652d77220610ecc19aaefa20876216b035e961Brian Paul            for (i = 0; i < width; i++) {
29507c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (*s & srcMask) {
29517c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d |= dstMask;
29527c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29537c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (srcMask == 1) {
29547c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = 128;
29557c652d77220610ecc19aaefa20876216b035e961Brian Paul                  s++;
29567c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29577c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
29587c652d77220610ecc19aaefa20876216b035e961Brian Paul                  srcMask = srcMask >> 1;
29597c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29607c652d77220610ecc19aaefa20876216b035e961Brian Paul               if (dstMask == 1) {
29617c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = 128;
29627c652d77220610ecc19aaefa20876216b035e961Brian Paul                  d++;
29637c652d77220610ecc19aaefa20876216b035e961Brian Paul                  *d = 0;
29647c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29657c652d77220610ecc19aaefa20876216b035e961Brian Paul               else {
29667c652d77220610ecc19aaefa20876216b035e961Brian Paul                  dstMask = dstMask >> 1;
29677c652d77220610ecc19aaefa20876216b035e961Brian Paul               }
29687c652d77220610ecc19aaefa20876216b035e961Brian Paul            }
29697c652d77220610ecc19aaefa20876216b035e961Brian Paul         }
29707c652d77220610ecc19aaefa20876216b035e961Brian Paul      }
29717c652d77220610ecc19aaefa20876216b035e961Brian Paul      src += width_in_bytes;
29727c652d77220610ecc19aaefa20876216b035e961Brian Paul   }
29737c652d77220610ecc19aaefa20876216b035e961Brian Paul}
2974