image.c revision 3428162e27c5937291a3ea16d4cd339728ee7f52
13428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul/* $Id: image.c,v 1.8 1999/10/22 10:59:15 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
5afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Version:  3.1
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Copyright (C) 1999  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
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef PC_HEADER
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "all.h"
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#else
32485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#ifndef XFree86Server
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <assert.h>
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <stdlib.h>
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include <string.h>
36485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#else
37485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#include "GL/xf86glx.h"
38485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell#endif
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "context.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "mmath.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "pixel.h"
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "types.h"
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#ifdef XFree86Server
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "GL/xf86glx.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#endif
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the 8 bits in each byte of the given array.
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_flip_bytes( GLubyte *p, GLuint n )
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = (GLuint) p[i];
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a = ((b & 0x01) << 7) |
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x02) << 5) |
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x04) << 3) |
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x08) << 1) |
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x10) >> 1) |
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x20) >> 3) |
67afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x40) >> 5) |
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	  ((b & 0x80) >> 7);
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (GLubyte) a;
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_swap2( GLushort *p, GLuint n )
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i;
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_swap4( GLuint *p, GLuint n )
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   register GLuint i, a, b;
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<n;i++) {
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the size, in bytes, of the given GL datatype.
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return 0 if GL_BITMAP.
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if invalid type enum.
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_sizeof_type( GLenum type )
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Same as gl_sizeof_packed_type() but we also accept the
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * packed pixel format datatypes.
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_sizeof_packed_type( GLenum type )
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLshort);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLuint);
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the number of components in a GL enum pixel type.
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format.
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_components_in_format( GLenum format )
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX1_EXT:
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX2_EXT:
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX4_EXT:
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX8_EXT:
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX12_EXT:
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX16_EXT:
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 4;
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return bytes per pixel for given format and type
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return -1 if bad format or type.
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLint gl_bytes_per_pixel( GLenum format, GLenum type )
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint comps = gl_components_in_format( format );
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGB || format == GL_BGR)
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLshort);
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Test if the given pixel format and type are legal.
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return GL_TRUE for legal, GL_FALSE for illegal.
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLboolean gl_is_legal_format_and_type( GLenum format, GLenum type )
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGR:
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return the address of a pixel in an image (actually a volume).
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pixel unpacking/packing parameters are observed according to 'packing'.
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  image - start of image data
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         width, height - size of image
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - image format
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - pixel component type
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - the pixelstore attributes
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         img - which image in the volume (0 for 1D or 2D images)
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         row, column - location of pixel in the image
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  address of pixel at (image,row,column) in image or NULL if error.
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLvoid *gl_pixel_addr_in_image( const struct gl_pixelstore_attrib *packing,
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                const GLvoid *image, GLsizei width,
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                GLsizei height, GLenum format, GLenum type,
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                GLint img, GLint row, GLint column )
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skiprows = packing->SkipRows;
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skipimages = packing->SkipImages;
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_comp = gl_sizeof_packed_type( type );
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (bytes_per_comp<0) {
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      comp_per_pixel = gl_components_in_format( format );
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (comp_per_pixel<0 && type != GL_BITMAP) {
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_pixel = gl_bytes_per_pixel( format, type );
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Allocate a new gl_image.  All fields are initialized to zero.
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *alloc_image( void )
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
486bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   return CALLOC_STRUCT(gl_image);
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Allocate a new gl_image with the error flag set.
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *alloc_error_image( GLint width, GLint height,
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                           GLint depth, GLenum format,
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                           GLenum type )
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image = alloc_image();
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = depth;
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Format = format;
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Type = type;
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->ErrorFlag = GL_TRUE;
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Free a gl_image.
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_free_image( struct gl_image *image )
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image->Data) {
518bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE(image->Data);
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
520bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   FREE(image);
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Do error checking on an image.  If there's an error, register it and
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * return GL_TRUE, else return GL_FALSE.
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen GerlachGLboolean gl_image_error_test( GLcontext *ctx, const struct gl_image *image,
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                               const char *msg )
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!image) {
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_OUT_OF_MEMORY, msg );
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return GL_TRUE;
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image->Width <= 0 || image->Height <= 0 || image->Depth <= 0) {
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_error( ctx, GL_INVALID_VALUE, msg );
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return GL_TRUE;
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
540351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   else if (!gl_is_legal_format_and_type(image->Format, image->Type)) {
541351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      return GL_TRUE;
542351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   }
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return GL_FALSE;
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a depth-buffer image storing values as GLshort, GLuint, or GLfloats.
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  type - datatype of src depth image
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return pointer to a new gl_image structure.
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Notes:  if the source image type is GLushort then the gl_image will
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * also store GLushorts.  If the src image type is GLuint then the gl_image
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * will also store GLuints.  For all other src image types the gl_image
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * will store GLfloats.  The integer cases can later be optimized.
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_depth_image( GLcontext *ctx, GLenum type, GLint width, GLint height,
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    const GLvoid *pixels,
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    const struct gl_pixelstore_attrib *packing)
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image;
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *fDst;
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLushort *sDst;
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLuint *iDst;
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j;
571351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   GLboolean errorType;
572351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul
573351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   errorType = type != GL_BYTE &&
574351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_BYTE &&
575351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_SHORT &&
576351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_SHORT &&
577351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_INT &&
578351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_INT &&
579351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_FLOAT;
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   image = alloc_image();
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = 1;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Components = 1;
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Format = GL_DEPTH_COMPONENT;
588351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      if (errorType) {
589351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Type = type;
590351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Data = NULL;
591351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      }
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (type==GL_UNSIGNED_SHORT) {
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Type = GL_UNSIGNED_SHORT;
594bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         image->Data = MALLOC( width * height * sizeof(GLushort));
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (type==GL_UNSIGNED_INT) {
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Type = GL_UNSIGNED_INT;
598bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         image->Data = MALLOC( width * height * sizeof(GLuint));
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else {
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Type = GL_FLOAT;
602bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         image->Data = MALLOC( width * height * sizeof(GLfloat));
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->RefCount = 0;
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!image->Data)
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return image;
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
612351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   if (errorType)
613351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      return image;
614351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   fDst = (GLfloat *) image->Data;
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   sDst = (GLushort *) image->Data;
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   iDst = (GLuint *) image->Data;
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<height;i++) {
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvoid *src = gl_pixel_addr_in_image( packing, pixels,
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            width, height,
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            GL_DEPTH_COMPONENT, type,
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            0, i, 0 );
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!src) {
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return image;
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      switch (type) {
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_BYTE:
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_FLOAT);
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            for (j=0; j<width; j++) {
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               *fDst++ = BYTE_TO_FLOAT(((GLbyte*)src)[j]);
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE:
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_FLOAT);
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            for (j=0; j<width; j++) {
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               *fDst++ = UBYTE_TO_FLOAT(((GLubyte*)src)[j]);
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT:
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_UNSIGNED_SHORT);
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            MEMCPY( sDst, src, width * sizeof(GLushort) );
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_swap2( sDst, width );
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            sDst += width;
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_SHORT:
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_FLOAT);
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0;j<width;j++) {
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLshort value = ((GLshort*)src)[j];
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  value = ((value >> 8) & 0xff) | ((value&0xff) << 8);
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *fDst++ = SHORT_TO_FLOAT(value);
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0;j<width;j++) {
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *fDst++ = SHORT_TO_FLOAT(((GLshort*)src)[j]);
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_INT:
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_FLOAT);
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0;j<width;j++) {
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLint value = ((GLint*)src)[j];
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  value = ((value >> 24) & 0x000000ff) |
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                          ((value >> 8)  & 0x0000ff00) |
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                          ((value << 8)  & 0x00ff0000) |
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                          ((value << 24) & 0xff000000);
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *fDst++ = INT_TO_FLOAT(value);
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0;j<width;j++) {
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *fDst++ = INT_TO_FLOAT(((GLint*)src)[j]);
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            iDst += width;
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT:
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_UNSIGNED_INT);
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            MEMCPY( iDst, src, width * sizeof(GLuint) );
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_swap4( iDst, width );
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            iDst += width;
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_FLOAT:
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            assert(image->Type == GL_FLOAT);
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            MEMCPY( fDst, src, width * sizeof(GLfloat) );
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_swap4( (GLuint*) fDst, width );
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            fDst += width;
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         default:
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_problem(ctx, "unpack_depth_image type" );
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return image;
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a stencil image.  Store as GLubytes in a gl_image structure.
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Return:  pointer to new gl_image structure.
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_stencil_image( GLcontext *ctx, GLenum type, GLint width, GLint height,
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                      const GLvoid *pixels,
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                      const struct gl_pixelstore_attrib *packing )
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image;
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *dst;
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j;
722351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   GLboolean errorType;
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(sizeof(GLstencil) == sizeof(GLubyte));
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
726351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   errorType = type != GL_BYTE &&
727351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_BYTE &&
728351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_SHORT &&
729351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_SHORT &&
730351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_INT &&
731351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_UNSIGNED_INT &&
732351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_FLOAT &&
733351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul               type != GL_BITMAP;
734351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   image = alloc_image();
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = 1;
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Components = 1;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Format = GL_STENCIL_INDEX;
742351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      if (errorType) {
743351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Type = type;
744351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Data = NULL;
745351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      }
746351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      else {
747351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Type = GL_UNSIGNED_BYTE;
748351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul         image->Data = MALLOC( width * height * sizeof(GLubyte));
749351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      }
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->RefCount = 0;
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!image->Data)
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return image;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
758351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul   if (errorType)
759351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul      return image; /* error will be generated later */
760351752caff2b151c6ddfc02c2df30ba4176e1224Brian Paul
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dst = (GLubyte *) image->Data;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0;i<height;i++) {
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLvoid *src = gl_pixel_addr_in_image( packing, pixels,
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            width, height,
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            GL_STENCIL_INDEX, type,
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                            0, i, 0 );
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!src) {
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return image;
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      switch (type) {
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE:
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_BYTE:
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            MEMCPY( dst, src, width * sizeof(GLubyte) );
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            dst += width * sizeof(GLubyte);
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT:
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_SHORT:
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               /* grab upper byte */
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLushort*)src)[j] & 0xff00) >> 8;
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLushort*)src)[j]) & 0xff;
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_INT:
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               /* grab upper byte */
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLuint*)src)[j] & 0xff000000) >> 8;
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLuint*)src)[j]) & 0xff;
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT:
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               /* grab upper byte */
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLuint*)src)[j] & 0xff000000) >> 8;
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = (((GLuint*)src)[j]) & 0xff;
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_FLOAT:
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (packing->SwapBytes) {
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLfloat fvalue;
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLint value = ((GLuint*)src)[j];
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  value = ((value & 0xff000000) >> 24)
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     | ((value & 0x00ff0000) >> 8)
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     | ((value & 0x0000ff00) << 8)
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     | ((value & 0x000000ff) << 24);
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  fvalue = *((GLfloat*) &value);
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = ((GLint) fvalue) & 0xff;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else {
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (j=0; j < width; j++) {
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLfloat fvalue = ((GLfloat *)src)[j];
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  *dst++ = ((GLint) fvalue) & 0xff;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         default:
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_problem(ctx, "unpack_stencil_image type" );
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return image;
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a bitmap, return a new gl_image struct.
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *
853af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paulunpack_bitmap( GLenum format, GLint width, GLint height,
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               const GLvoid *pixels,
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               const struct gl_pixelstore_attrib *packing )
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint bytes, i, width_in_bytes;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *buffer, *dst;
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX);
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Alloc dest storage */
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   bytes = ((width+7)/8 * height);
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (bytes>0 && pixels!=NULL) {
866bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      buffer = (GLubyte *) MALLOC( bytes );
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!buffer) {
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Copy/unpack pixel data to buffer */
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      width_in_bytes = CEILING( width, 8 );
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dst = buffer;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<height; i++) {
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLvoid *src = gl_pixel_addr_in_image( packing, pixels,
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               width, height,
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               GL_COLOR_INDEX, GL_BITMAP,
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               0, i, 0 );
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (!src) {
879bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul            FREE(buffer);
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return NULL;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         MEMCPY( dst, src, width_in_bytes );
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         dst += width_in_bytes;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Bit flipping */
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (packing->LsbFirst) {
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_flip_bytes( buffer, bytes );
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* a 'null' bitmap */
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      buffer = NULL;
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   image = alloc_image();
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = 1;
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Components = 0;
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Format = format;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Type = GL_BITMAP;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Data = buffer;
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->RefCount = 0;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
907bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( buffer );
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 32x32 pixel polygon stipple from user memory using the
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * current pixel unpack settings.
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_unpack_polygon_stipple( const GLcontext *ctx,
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                const GLubyte *pattern, GLuint dest[32] )
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = 0; i < 32; i++) {
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLubyte *src = (GLubyte *) gl_pixel_addr_in_image( &ctx->Unpack, pattern,
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  32, 32, GL_COLOR_INDEX, GL_BITMAP, 0, i, 0 );
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dest[i] = (src[0] << 24)
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach              | (src[1] << 16)
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach              | (src[2] <<  8)
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach              | (src[3]      );
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Bit flipping within each byte */
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (ctx->Unpack.LsbFirst) {
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      gl_flip_bytes( (GLubyte *) dest, 32 * 4 );
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack polygon stipple into user memory given current pixel packing
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * settings.
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_pack_polygon_stipple( const GLcontext *ctx,
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                              const GLuint pattern[32],
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                              GLubyte *dest )
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i;
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i = 0; i < 32; i++) {
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLubyte *dst = (GLubyte *) gl_pixel_addr_in_image( &ctx->Pack, dest,
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  32, 32, GL_COLOR_INDEX, GL_BITMAP, 0, i, 0 );
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dst[0] = (pattern[i] >> 24) & 0xff;
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dst[1] = (pattern[i] >> 16) & 0xff;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dst[2] = (pattern[i] >>  8) & 0xff;
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      dst[3] = (pattern[i]      ) & 0xff;
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Bit flipping within each byte */
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (ctx->Pack.LsbFirst) {
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_flip_bytes( (GLubyte *) dst, 4 );
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack an RGBA or CI image and store it as unsigned bytes
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *
971af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paulunpack_ubyte_image( GLint width, GLint height,
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    GLint depth, GLenum format, const GLvoid *pixels,
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    const struct gl_pixelstore_attrib *packing )
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image;
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint width_in_bytes;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint components;
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *buffer, *dst;
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, d;
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   components = gl_components_in_format( format );
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   width_in_bytes = width * components * sizeof(GLubyte);
984bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   buffer = (GLubyte *) MALLOC( height * width_in_bytes * depth );
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!buffer) {
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Copy/unpack pixel data to buffer */
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dst = buffer;
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (d=0; d<depth; d++ ) {
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0;i<height;i++) {
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte *src = (GLubyte *) gl_pixel_addr_in_image( packing,
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                       pixels, width, height, format, GL_UNSIGNED_BYTE,
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                       d, i, 0 );
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (!src) {
997bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul            FREE(buffer);
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return NULL;
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         MEMCPY( dst, src, width_in_bytes );
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         dst += width_in_bytes;
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (format == GL_BGR) {
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every ubyte triplet from BGR to RGB */
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height; i++) {
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte b = buffer[i*3+0];
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte r = buffer[i*3+2];
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*3+0] = r;
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*3+2] = b;
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format == GL_BGRA) {
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every ubyte quadruplet from BGRA to RGBA */
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height; i++) {
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte b = buffer[i*4+0];
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte r = buffer[i*4+2];
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+0] = r;
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+2] = b;
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format == GL_ABGR_EXT) {
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every ubyte quadruplet from ABGR to RGBA */
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height; i++) {
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte a = buffer[i*4+0];
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte b = buffer[i*4+1];
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte g = buffer[i*4+2];
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLubyte r = buffer[i*4+3];
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+0] = r;
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+1] = g;
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+2] = b;
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+3] = a;
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   image = alloc_image();
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = depth;
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Components = components;
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format == GL_BGR)
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGB;
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (format == GL_BGRA)
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGBA;
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (format == GL_ABGR_EXT)
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGBA;
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else
1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = format;
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Type = GL_UNSIGNED_BYTE;
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Data = buffer;
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->RefCount = 0;
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1057bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( buffer );
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a color image storing image as GLfloats
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstatic struct gl_image *
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachunpack_float_image( GLcontext *ctx, GLint width, GLint height, GLint depth,
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    GLenum format, GLenum type, const GLvoid *pixels,
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    const struct gl_pixelstore_attrib *packing )
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   struct gl_image *image;
1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLfloat *dst;
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint elems_per_row;
1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint components;
1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint i, j, d;
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLboolean normalize;
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(type != GL_BITMAP);
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   components = gl_components_in_format( format );
1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(components > 0);  /* should have been caught earlier */
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!gl_is_legal_format_and_type( format, type )) {
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* bad pixel type for format, make dummy image */
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image = alloc_image();
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (image) {
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Width = width;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Height = height;
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Depth = depth;
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Components = components;
1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = format;
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Type = type;
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Data = NULL;
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->RefCount = 0;
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return image;
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   elems_per_row = width * components;
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   image = alloc_image();
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (image) {
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Width = width;
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Height = height;
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Depth = depth;
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Components = components;
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format == GL_BGR)
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGB;
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (format == GL_BGRA)
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGBA;
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (format == GL_ABGR_EXT)
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = GL_RGBA;
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         image->Format = format;
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->Type = GL_FLOAT;
1118bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      image->Data = MALLOC( elems_per_row * height * depth * sizeof(GLfloat));
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      image->RefCount = 0;
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (!image->Data)
1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return image;
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return NULL;
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   normalize = (format != GL_COLOR_INDEX) && (format != GL_STENCIL_INDEX);
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   dst = (GLfloat *) image->Data;
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (d=0; d<depth; d++) {
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0;i<height;i++) {
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLvoid *src = gl_pixel_addr_in_image( packing, pixels,
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               width, height,
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               format, type,
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                               d, i, 0 );
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (!src) {
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return image;
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLubyte *ubsrc = (GLubyte *) src;
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  if (normalize) {
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = UBYTE_TO_FLOAT(ubsrc[j]);
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  else {
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) ubsrc[j];
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (normalize) {
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = BYTE_TO_FLOAT(((GLbyte*)src)[j]);
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = (GLfloat) ((GLbyte*)src)[j];
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort value = ((GLushort*)src)[j];
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((value >> 8) & 0xff) | ((value&0xff) << 8);
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     if (normalize) {
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = USHORT_TO_FLOAT(value);
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     else {
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) value;
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  if (normalize) {
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = USHORT_TO_FLOAT(((GLushort*)src)[j]);
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  else {
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) ((GLushort*)src)[j];
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLshort value = ((GLshort*)src)[j];
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((value >> 8) & 0xff) | ((value&0xff) << 8);
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     if (normalize) {
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = SHORT_TO_FLOAT(value);
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     else {
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) value;
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  if (normalize) {
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = SHORT_TO_FLOAT(((GLshort*)src)[j]);
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  else {
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) ((GLshort*)src)[j];
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint value;
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((GLuint*)src)[j];
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((value & 0xff000000) >> 24)
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x00ff0000) >> 8)
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x0000ff00) << 8)
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x000000ff) << 24);
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     if (normalize) {
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = UINT_TO_FLOAT(value);
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     else {
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) value;
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  if (normalize) {
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = UINT_TO_FLOAT(((GLuint*)src)[j]);
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  else {
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) ((GLuint*)src)[j];
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLint value;
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((GLint*)src)[j];
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((value & 0xff000000) >> 24)
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x00ff0000) >> 8)
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x0000ff00) << 8)
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x000000ff) << 24);
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     if (normalize) {
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = INT_TO_FLOAT(value);
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     else {
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) value;
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  if (normalize) {
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = INT_TO_FLOAT(((GLint*)src)[j]);
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  else {
1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (j=0;j<elems_per_row;j++) {
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        *dst++ = (GLfloat) ((GLint*)src)[j];
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLint value;
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<elems_per_row;j++) {
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((GLuint*)src)[j];
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     value = ((value & 0xff000000) >> 24)
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x00ff0000) >> 8)
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x0000ff00) << 8)
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           | ((value & 0x000000ff) << 24);
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = *((GLfloat*) &value);
1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               else {
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  MEMCPY( dst, src, elems_per_row*sizeof(GLfloat) );
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst += elems_per_row;
1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_3_3_2:
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLubyte *ubsrc = (GLubyte *) src;
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLubyte p = ubsrc[j];
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 5)      ) * (1.0F / 7.0F); /* red */
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 2) & 0x7) * (1.0F / 7.0F); /* green */
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p     ) & 0x3) * (1.0F / 3.0F); /* blue */
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE_2_3_3_REV:
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLubyte *ubsrc = (GLubyte *) src;
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLubyte p = ubsrc[j];
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p     ) & 0x7) * (1.0F / 7.0F); /* red */
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 3) & 0x7) * (1.0F / 7.0F); /* green */
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 6)      ) * (1.0F / 3.0F); /* blue */
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5:
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 11)       ) * (1.0F / 31.0F); /* red */
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  5) & 0x3f) * (1.0F / 63.0F); /* green */
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x1f) * (1.0F / 31.0F); /* blue */
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_6_5_REV:
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x1f) * (1.0F / 31.0F); /* red */
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  5) & 0x3f) * (1.0F / 63.0F); /* green */
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 11)       ) * (1.0F / 31.0F); /* blue */
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_SHORT_4_4_4_4:
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 12)      ) * (1.0F / 15.0F); /* red */
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  8) & 0xf) * (1.0F / 15.0F); /* green */
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  4) & 0xf) * (1.0F / 15.0F); /* blue */
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0xf) * (1.0F / 15.0F); /* alpha */
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0xf) * (1.0F / 15.0F); /* red */
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  4) & 0xf) * (1.0F / 15.0F); /* green */
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  8) & 0xf) * (1.0F / 15.0F); /* blue */
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 12)      ) * (1.0F / 15.0F); /* alpha */
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_SHORT_5_5_5_1:
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 11)       ) * (1.0F / 31.0F); /* red */
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  6) & 0x1f) * (1.0F / 31.0F); /* green */
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  1) & 0x1f) * (1.0F / 31.0F); /* blue */
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x1)  * (1.0F /  1.0F); /* alpha */
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLushort *ussrc = (GLushort *) src;
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLushort p = ussrc[j];
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x1f) * (1.0F / 31.0F); /* red */
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  5) & 0x1f) * (1.0F / 31.0F); /* green */
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 10) & 0x1f) * (1.0F / 31.0F); /* blue */
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 15)       ) * (1.0F /  1.0F); /* alpha */
1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_INT_8_8_8_8:
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint *uisrc = (GLuint *) src;
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLuint p = uisrc[j];
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_INT_8_8_8_8_REV:
1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint *uisrc = (GLuint *) src;
1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLuint p = uisrc[j];
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p      ) & 0xff);
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >>  8) & 0xff);
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 16) & 0xff);
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = UBYTE_COLOR_TO_FLOAT_COLOR((p >> 24)       );
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_INT_10_10_10_2:
1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint *uisrc = (GLuint *) src;
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLuint p = uisrc[j];
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 22)        ) * (1.0F / 1023.0F); /* r */
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F); /* g */
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >>  2) & 0x3ff) * (1.0F / 1023.0F); /* b */
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x3  ) * (1.0F /    3.0F); /* a */
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    case GL_UNSIGNED_INT_2_10_10_10_REV:
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               {
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  GLuint *uisrc = (GLuint *) src;
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  for (j=0;j<width;j++) {
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     GLuint p = uisrc[j];
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p      ) & 0x3ff) * (1.0F / 1023.0F); /* r*/
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F); /* g */
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F); /* b */
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     *dst++ = ((p >> 30)        ) * (1.0F /    3.0F); /* a */
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  }
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_problem(ctx, "unpack_float_image type" );
1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return image;
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (format == GL_BGR) {
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every float triplet from BGR to RGBA */
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat *buffer = (GLfloat *) image->Data;
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height*depth; i++) {
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat b = buffer[i*3+0];
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat r = buffer[i*3+2];
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*3+0] = r;
1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*3+2] = b;
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format == GL_BGRA) {
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every float quadruplet from BGRA to RGBA */
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat *buffer = (GLfloat *) image->Data;
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height*depth; i++) {
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat b = buffer[i*4+0];
1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat r = buffer[i*4+2];
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+0] = r;
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+2] = b;
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format == GL_ABGR_EXT) {
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* swap order of every float quadruplet from ABGR to RGBA */
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat *buffer = (GLfloat *) image->Data;
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0; i<width*height*depth; i++) {
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat a = buffer[i*4+0];
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat b = buffer[i*4+1];
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat g = buffer[i*4+2];
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         GLfloat r = buffer[i*4+3];
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+0] = r;
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+1] = g;
1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+2] = b;
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         buffer[i*4+3] = a;
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return image;
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a bitmap image, using current glPixelStore parameters,
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * making a new gl_image.
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_bitmap( GLcontext *ctx,
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                   GLsizei width, GLsizei height,
1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                   const GLubyte *bitmap,
1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                   const struct gl_pixelstore_attrib *packing )
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return gl_unpack_image( ctx, width, height,
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                           GL_COLOR_INDEX, GL_BITMAP, bitmap, packing );
1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 2-D image from user's buffer.  Return pointer to new
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * gl_image struct.
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  width, height - size in pixels
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - format of incoming pixel data
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - datatype of incoming pixel data
1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         pixels - pointer to unpacked image in user buffer
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_image( GLcontext *ctx,
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  GLint width, GLint height,
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  GLenum format, GLenum type,
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  const GLvoid *pixels,
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                  const struct gl_pixelstore_attrib *packing )
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return gl_unpack_image3D( ctx, width, height, 1,
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                             format, type, pixels, packing );
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Unpack a 1, 2 or 3-D image from user-supplied address, returning a
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * pointer to a new gl_image struct.
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This function is always called by a higher-level unpack function such
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * as gl_unpack_texsubimage() or gl_unpack_bitmap().
1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *
1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  width, height, depth - size in pixels
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - format of incoming pixel data
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - datatype of incoming pixel data
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         pixels - pointer to unpacked image.
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachstruct gl_image *gl_unpack_image3D( GLcontext *ctx,
1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                    GLint width, GLint height, GLint depth,
1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                    GLenum format, GLenum type,
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                    const GLvoid *pixels,
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                    const struct gl_pixelstore_attrib *packing)
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (width <= 0 || height <= 0 || depth <= 0) {
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return alloc_error_image(width, height, depth, format, type);
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (type==GL_BITMAP) {
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return alloc_error_image(width, height, depth, format, type);
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else {
1547af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paul         return unpack_bitmap( format, width, height, pixels, packing );
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format==GL_DEPTH_COMPONENT) {
1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* TODO: pack as GLdepth values (GLushort or GLuint) */
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return unpack_depth_image( ctx, type, width, height, pixels, packing );
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (format==GL_STENCIL_INDEX) {
1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* TODO: pack as GLstencil (GLubyte or GLushort) */
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return unpack_stencil_image( ctx, type, width, height, pixels, packing );
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else if (type==GL_UNSIGNED_BYTE) {
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* upack, convert to GLubytes */
1560af19f37b797942e08c5847cfcc9be9792b2ebc32Brian Paul      return unpack_ubyte_image( width, height, depth, format, pixels, packing );
1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* upack, convert to floats */
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return unpack_float_image( ctx, width, height, depth,
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                 format, type, pixels, packing );
1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* never get here */
1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /*return NULL;*/
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Apply pixel-transfer operations (scale, bias, mapping) to a single row
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * of a gl_image.  Put resulting color components into result array.
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_scale_bias_map_image_data( const GLcontext *ctx,
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                   const struct gl_image *image,
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                                   GLint row, GLubyte result[] )
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint start, i;
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(ctx);
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(image);
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(result);
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   assert(row >= 0);
1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   start = row * image->Width * image->Components;
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   for (i=0; i < image->Width; i++) {
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint pos = start+i;
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat red, green, blue, alpha;
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (image->Type == GL_UNSIGNED_BYTE) {
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         const GLubyte *data = (GLubyte *) image->Data;
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (image->Format) {
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_RED:
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               red   = data[pos] * (1.0F/255.0F);
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               green = 0;
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               blue  = 0;
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               alpha = 0;
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_RGB:
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               red   = data[pos*3+0] * (1.0F/255.0F);
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               green = data[pos*3+1] * (1.0F/255.0F);
1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               blue  = data[pos*3+2] * (1.0F/255.0F);
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               alpha = 0;
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_problem(ctx, "bad image format in gl_scale...image_data");
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return;
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else if (image->Type == GL_FLOAT) {
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         const GLubyte *data = (GLubyte *) image->Data;
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (image->Format) {
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_RED:
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               red   = data[pos];
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               green = 0;
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               blue  = 0;
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               alpha = 0;
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_RGB:
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               red   = data[pos*3+0];
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               green = data[pos*3+1];
1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               blue  = data[pos*3+2];
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               alpha = 0;
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               break;
1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               gl_problem(ctx, "bad image format in gl_scale...image_data");
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return;
1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      else {
1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         gl_problem(ctx, "Bad image type in gl_scale_...image_data");
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return;
1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(red   >= 0.0 && red   <= 1.0);
1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(green >= 0.0 && green <= 1.0);
1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(blue  >= 0.0 && blue  <= 1.0);
1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(alpha >= 0.0 && alpha <= 1.0);
1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (scale or bias) {
1645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (mapping) {
1649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      */
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      result[i*4+0] = (GLubyte) (red   * 255.0);
1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      result[i*4+1] = (GLubyte) (green * 255.0);
1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      result[i*4+2] = (GLubyte) (blue  * 255.0);
1656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      result[i*4+3] = (GLubyte) (alpha * 255.0);
1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack the given RGBA span into client memory at 'dest' address
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in the given pixel format and type.
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Optionally apply the enabled pixel transfer ops.
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Pack into memory using the given packing params struct.
1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * This is used by glReadPixels and glGetTexImage?D()
1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Input:  ctx - the context
1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         n - number of pixels in the span
1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         rgba - the pixels
1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         format - dest packing format
1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         type - dest packing datatype
1673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         destination - destination packing address
1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         packing - pixel packing parameters
1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach *         applyTransferOps - apply scale/bias/lookup-table ops?
1676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlachvoid gl_pack_rgba_span( const GLcontext *ctx,
1678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        GLuint n, CONST GLubyte rgba[][4],
1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        GLenum format, GLenum type, GLvoid *destination,
1680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        const struct gl_pixelstore_attrib *packing,
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        GLboolean applyTransferOps )
1682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   /* Test for optimized case first */
1684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag &&
1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
16863428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      MEMCPY( destination, rgba, n * 4 * sizeof(GLubyte) );
1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
16893428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul   else if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag &&
16903428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul       format == GL_RGB && type == GL_UNSIGNED_BYTE) {
16913428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      /* common simple case */
16923428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLint i;
16933428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      GLubyte *dest = (GLubyte *) destination;
16943428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      for (i = 0; i < n; i++) {
16953428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest[i+0] = rgba[i][RCOMP];
16963428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest[i+1] = rgba[i][GCOMP];
16973428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest[i+2] = rgba[i][BCOMP];
16983428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul         dest += 3;
16993428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul      }
17003428162e27c5937291a3ea16d4cd339728ee7f52Brian Paul   }
1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat red[MAX_WIDTH], green[MAX_WIDTH], blue[MAX_WIDTH];
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat alpha[MAX_WIDTH], luminance[MAX_WIDTH];
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat rscale = 1.0F / 255.0F;
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat gscale = 1.0F / 255.0F;
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat bscale = 1.0F / 255.0F;
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLfloat ascale = 1.0F / 255.0F;
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLuint i;
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert( n < MAX_WIDTH );
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* convert color components to floating point */
1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      for (i=0;i<n;i++) {
1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         red[i]   = rgba[i][RCOMP] * rscale;
1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         green[i] = rgba[i][GCOMP] * gscale;
1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         blue[i]  = rgba[i][BCOMP] * bscale;
1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         alpha[i] = rgba[i][ACOMP] * ascale;
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Apply scale, bias and lookup-tables if enabled.
1722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (applyTransferOps) {
1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.ScaleOrBiasRGBA) {
1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_scale_and_bias_color( ctx, n, red, green, blue, alpha );
1726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         if (ctx->Pixel.MapColorFlag) {
1728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_map_color( ctx, n, red, green, blue, alpha );
1729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) {
1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         for (i=0;i<n;i++) {
1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            GLfloat sum = red[i] + green[i] + blue[i];
1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            luminance[i] = CLAMP( sum, 0.0F, 1.0F );
1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /*
1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       * Pack/store the pixels.  Ugh!  Lots of cases!!!
1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach       */
1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      switch (type) {
1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE:
1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(red[i]);
1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(green[i]);
1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(blue[i]);
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(alpha[i]);
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UBYTE(luminance[i]);
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_UBYTE(alpha[i]);
1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UBYTE(red[i]);
1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UBYTE(green[i]);
1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UBYTE(blue[i]);
1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(red[i]);
1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(green[i]);
1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(blue[i]);
1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]);
1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UBYTE(blue[i]);
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UBYTE(green[i]);
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UBYTE(red[i]);
1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(blue[i]);
1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(green[i]);
1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(red[i]);
1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(alpha[i]);
1801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UBYTE(alpha[i]);
1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UBYTE(blue[i]);
1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UBYTE(green[i]);
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UBYTE(red[i]);
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_BYTE:
1817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLbyte *dst = (GLbyte *) destination;
1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(red[i]);
1823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(green[i]);
1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(blue[i]);
1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(alpha[i]);
1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_BYTE(luminance[i]);
1839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_BYTE(alpha[i]);
1844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_BYTE(red[i]);
1849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_BYTE(green[i]);
1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_BYTE(blue[i]);
1851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(red[i]);
1856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(green[i]);
1857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(blue[i]);
1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]);
1859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_BYTE(blue[i]);
1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_BYTE(green[i]);
1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_BYTE(red[i]);
1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(blue[i]);
1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(green[i]);
1872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(red[i]);
1873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(alpha[i]);
1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_BYTE(alpha[i]);
1878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_BYTE(blue[i]);
1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_BYTE(green[i]);
1880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_BYTE(red[i]);
1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
1885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_SHORT:
1889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
1890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
1891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(red[i]);
1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(green[i]);
1899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(blue[i]);
1903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(alpha[i]);
1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_USHORT(luminance[i]);
1911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_USHORT(luminance[i]);
1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_USHORT(alpha[i]);
1916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_USHORT(red[i]);
1921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_USHORT(green[i]);
1922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_USHORT(blue[i]);
1923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
1926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(red[i]);
1928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(green[i]);
1929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(blue[i]);
1930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]);
1931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
1934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_USHORT(blue[i]);
1936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_USHORT(green[i]);
1937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_USHORT(red[i]);
1938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(blue[i]);
1943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(green[i]);
1944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(red[i]);
1945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(alpha[i]);
1946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_USHORT(alpha[i]);
1951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_USHORT(blue[i]);
1952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_USHORT(green[i]);
1953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_USHORT(red[i]);
1954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
1957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
1958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
1960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  gl_swap2( (GLushort *) dst, n );
1961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
1962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
1963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_SHORT:
1965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
1966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLshort *dst = (GLshort *) destination;
1967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
1968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
1969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(red[i]);
1971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(green[i]);
1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
1977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(blue[i]);
1979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
1981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(alpha[i]);
1983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
1985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
1986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_SHORT(luminance[i]);
1987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
1989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_SHORT(alpha[i]);
1992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
1994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
1995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
1996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_SHORT(red[i]);
1997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_SHORT(green[i]);
1998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_SHORT(blue[i]);
1999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
2002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(red[i]);
2004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(green[i]);
2005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(blue[i]);
2006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]);
2007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
2010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_SHORT(blue[i]);
2012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_SHORT(green[i]);
2013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_SHORT(red[i]);
2014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
2017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(blue[i]);
2019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(green[i]);
2020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(red[i]);
2021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(alpha[i]);
2022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
2024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_SHORT(alpha[i]);
2026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_SHORT(blue[i]);
2027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_SHORT(green[i]);
2028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_SHORT(red[i]);
2029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
2032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
2033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
2035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  gl_swap2( (GLushort *) dst, n );
2036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
2039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_UNSIGNED_INT:
2040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            {
2041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
2043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
2044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(red[i]);
2046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
2048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(green[i]);
2050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
2052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(blue[i]);
2054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
2056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(alpha[i]);
2058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_UINT(luminance[i]);
2062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
2064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
2066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_UINT(alpha[i]);
2067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
2070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UINT(red[i]);
2072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UINT(green[i]);
2073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UINT(blue[i]);
2074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
2077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(red[i]);
2079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(green[i]);
2080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(blue[i]);
2081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(alpha[i]);
2082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
2085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_UINT(blue[i]);
2087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_UINT(green[i]);
2088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_UINT(red[i]);
2089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
2092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(blue[i]);
2094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(green[i]);
2095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(red[i]);
2096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(alpha[i]);
2097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
2100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_UINT(alpha[i]);
2102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_UINT(blue[i]);
2103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_UINT(green[i]);
2104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_UINT(red[i]);
2105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
2108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
2109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               if (packing->SwapBytes) {
2111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  gl_swap4( (GLuint *) dst, n );
2112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
2115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_INT:
2116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
2117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLint *dst = (GLint *) destination;
2118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
2119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
2120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(red[i]);
2122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
2124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(green[i]);
2126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
2128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(blue[i]);
2130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
2132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(alpha[i]);
2134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
2136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = FLOAT_TO_INT(luminance[i]);
2138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
2140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
2142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = FLOAT_TO_INT(alpha[i]);
2143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
2146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_INT(red[i]);
2148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_INT(green[i]);
2149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_INT(blue[i]);
2150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
2153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(red[i]);
2155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(green[i]);
2156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(blue[i]);
2157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(alpha[i]);
2158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
2161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = FLOAT_TO_INT(blue[i]);
2163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = FLOAT_TO_INT(green[i]);
2164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = FLOAT_TO_INT(red[i]);
2165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
2168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(blue[i]);
2170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(green[i]);
2171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(red[i]);
2172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(alpha[i]);
2173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
2176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = FLOAT_TO_INT(alpha[i]);
2178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = FLOAT_TO_INT(blue[i]);
2179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = FLOAT_TO_INT(green[i]);
2180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = FLOAT_TO_INT(red[i]);
2181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
2184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
2185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
2187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		  gl_swap4( (GLuint *) dst, n );
2188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
2189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
2190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
2191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 case GL_FLOAT:
2192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    {
2193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLfloat *dst = (GLfloat *) destination;
2194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               switch (format) {
2195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RED:
2196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = red[i];
2198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_GREEN:
2200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = green[i];
2202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BLUE:
2204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = blue[i];
2206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ALPHA:
2208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = alpha[i];
2210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE:
2212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++)
2213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i] = luminance[i];
2214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_LUMINANCE_ALPHA:
2216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+0] = luminance[i];
2218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*2+1] = alpha[i];
2219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGB:
2222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = red[i];
2224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = green[i];
2225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = blue[i];
2226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_RGBA:
2229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = red[i];
2231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = green[i];
2232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = blue[i];
2233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = alpha[i];
2234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGR:
2237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+0] = blue[i];
2239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+1] = green[i];
2240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*3+2] = red[i];
2241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_BGRA:
2244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = blue[i];
2246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = green[i];
2247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = red[i];
2248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = alpha[i];
2249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  case GL_ABGR_EXT:
2252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     for (i=0;i<n;i++) {
2253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+0] = alpha[i];
2254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+1] = blue[i];
2255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+2] = green[i];
2256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                        dst[i*4+3] = red[i];
2257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     }
2258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     break;
2259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  default:
2260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                     gl_problem(ctx, "bad format in gl_pack_rgba_span\n");
2261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       if (packing->SwapBytes) {
2263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach		  gl_swap4( (GLuint *) dst, n );
2264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	       }
2265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    }
2266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	    break;
2267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_3_3_2:
2268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
2270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 7.0F)) << 5)
2272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 7.0F)) << 2)
2273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 3.0F))     );
2274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_BYTE_2_3_3_REV:
2278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLubyte *dst = (GLubyte *) destination;
2280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 7.0F))     )
2282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 7.0F)) << 3)
2283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 3.0F)) << 5);
2284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5:
2288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F)) << 11)
2292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 63.0F)) <<  5)
2293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F))      );
2294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_6_5_REV:
2298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F))      )
2302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 63.0F)) <<  5)
2303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) << 11);
2304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4:
2308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 15.0F)) << 12)
2312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 15.0F)) <<  8)
2313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 15.0F)) <<  4)
2314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] * 15.0F))      );
2315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 15.0F))      )
2323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 15.0F)) <<  4)
2324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 15.0F)) <<  8)
2325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] * 15.0F)) << 12);
2326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_5_5_5_1:
2330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F)) << 11)
2334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 31.0F)) <<  6)
2335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) <<  1)
2336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] *  1.0F))      );
2337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGB) {
2342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLushort *dst = (GLushort *) destination;
2343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLint) (red[i]   * 31.0F))      )
2345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (green[i] * 31.0F)) <<  5)
2346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (blue[i]  * 31.0F)) << 10)
2347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLint) (alpha[i] *  1.0F)) << 15);
2348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8:
2352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
2353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 255.0F)) << 24)
2356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
2357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) <<  8)
2358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F))      );
2359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
2362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 255.0F)) << 24)
2365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
2366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) <<  8)
2367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F))      );
2368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
2371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 255.0F)) << 24)
2374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) << 16)
2375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
2376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F))      );
2377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_8_8_8_8_REV:
2381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
2382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 255.0F))      )
2385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
2386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) << 16)
2387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F)) << 24);
2388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
2391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 255.0F))      )
2394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) <<  8)
2395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) << 16)
2396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] * 255.0F)) << 24);
2397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
2400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 255.0F))      )
2403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 255.0F)) <<  8)
2404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 255.0F)) << 16)
2405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 255.0F)) << 24);
2406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_10_10_10_2:
2410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
2411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 1023.0F)) << 22)
2414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 12)
2415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) <<  2)
2416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F))      );
2417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
2420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 1023.0F)) << 22)
2423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 12)
2424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 1023.0F)) <<  2)
2425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F))      );
2426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
2429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 1023.0F)) << 22)
2432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 12)
2433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) <<  2)
2434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   *    3.0F))      );
2435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         case GL_UNSIGNED_INT_2_10_10_10_REV:
2439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            if (format == GL_RGBA) {
2440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (red[i]   * 1023.0F))      )
2443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 10)
2444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 20)
2445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F)) << 30);
2446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_BGRA) {
2449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (blue[i]  * 1023.0F))      )
2452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 10)
2453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   * 1023.0F)) << 20)
2454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (alpha[i] *    3.0F)) << 30);
2455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            else if (format == GL_ABGR_EXT) {
2458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               GLuint *dst = (GLuint *) destination;
2459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               for (i=0;i<n;i++) {
2460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                  dst[i] = (((GLuint) (alpha[i] * 1023.0F))      )
2461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (blue[i]  * 1023.0F)) << 10)
2462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (green[i] * 1023.0F)) << 20)
2463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                         | (((GLuint) (red[i]   *    3.0F)) << 30);
2464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               }
2465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            }
2466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            break;
2467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         default:
2468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            gl_problem( ctx, "bad type in gl_pack_rgba_span" );
2469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
2470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
2471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
2472