image.c revision 1614de4045c36ab6ec060e3bd0d1f3394d05b91e
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Mesa 3-D graphics library
3995456f9305593005f8466520314ee087f3d422aBrian Paul * Version:  7.5
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
518d2822905ac3187318bd662f80c2836bdfa7c1fBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6995456f9305593005f8466520314ee087f3d422aBrian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Permission is hereby granted, free of charge, to any person obtaining a
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * copy of this software and associated documentation files (the "Software"),
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * to deal in the Software without restriction, including without limitation
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * and/or sell copies of the Software, and to permit persons to whom the
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Software is furnished to do so, subject to the following conditions:
145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * The above copyright notice and this permission notice shall be included
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * in all copies or substantial portions of the Software.
175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
27f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/**
28f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \file image.c
29f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Image handling.
30f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */
31f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
32f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul
33fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
34c893a015d8a50a38cd3f727d99835e7e7e2ccea9Brian Paul#include "colormac.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "image.h"
363c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach#include "macros.h"
38db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
390117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
4227558a160a9fe91745728d7626995cd88f8fe339Brian Paul
436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
4453f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
4553f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao */
46f1f022dbb103947b0edf5ae984fcff00f6a8e539Xiang, HaihaoGLboolean
4753f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao_mesa_type_is_packed(GLenum type)
48f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul{
49f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   switch (type) {
50f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_BYTE_3_3_2:
51f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_BYTE_2_3_3_REV:
524d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák   case MESA_UNSIGNED_BYTE_4_4:
53f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_5_6_5:
54f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_5_6_5_REV:
55f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_4_4_4_4:
56f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
57f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_5_5_5_1:
58f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
59f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_INT_8_8_8_8:
60f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_INT_8_8_8_8_REV:
61f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_INT_10_10_10_2:
62f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_INT_2_10_10_10_REV:
63f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_8_8_MESA:
64f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_SHORT_8_8_REV_MESA:
65f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   case GL_UNSIGNED_INT_24_8_EXT:
669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák   case GL_UNSIGNED_INT_5_9_9_9_REV:
67631d23daa91c569bf268a2191bd466df73a64263Marek Olšák   case GL_UNSIGNED_INT_10F_11F_11F_REV:
681165280cbd37dee1e499358633478ab869de21dfMarek Olšák   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
69f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul      return GL_TRUE;
70f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   }
71f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul
72f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   return GL_FALSE;
7353f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao}
7453f83b435ce9a94092503712e3d4e16d4c942752Xiang, Haihao
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 2 bytes in each word in the given array.
796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param p array.
816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of words.
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
83b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
84b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap2( GLushort *p, GLuint n )
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
86f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   GLuint i;
87f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   for (i = 0; i < n; i++) {
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach/*
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach * Flip the order of the 4 bytes in each word in the given array.
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
97b7d076fc96ac27117421653a043d00a95f789d24Brian Paulvoid
98b7d076fc96ac27117421653a043d00a95f789d24Brian Paul_mesa_swap4( GLuint *p, GLuint n )
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
100f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   GLuint i, a, b;
101f0707c789a4c8f02b9b9f51012bd41691779e166Brian Paul   for (i = 0; i < n; i++) {
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      b = p[i];
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      a =  (b >> 24)
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b >> 8) & 0xff00)
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 8) & 0xff0000)
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	| ((b << 24) & 0xff000000);
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      p[i] = a;
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the size of a GL data type.
1146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type GL data type.
1166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
1176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
1186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if an invalid type enum.
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
12085bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint
12185bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_sizeof_type( GLenum type )
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
14087ba2285fe11dfe068798e5f8ea8e089a5d8b28bBrian Paul      case GL_DOUBLE:
14187ba2285fe11dfe068798e5f8ea8e089a5d8b28bBrian Paul	 return sizeof(GLdouble);
142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul	 return sizeof(GLhalfARB);
1442d270ac0904a1e3779906f7dbf493f31e5b3823bChia-I Wu      case GL_FIXED:
1452d270ac0904a1e3779906f7dbf493f31e5b3823bChia-I Wu	 return sizeof(GLfixed);
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
1536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Same as _mesa_sizeof_type() but also accepting the packed pixel
1546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * format data types.
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
15685bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint
15785bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_sizeof_packed_type( GLenum type )
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 0;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return sizeof(GLubyte);
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLbyte);
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLushort);
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLshort);
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLuint);
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLint);
174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul	 return sizeof(GLhalfARB);
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return sizeof(GLfloat);
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
1804d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák      case MESA_UNSIGNED_BYTE_4_4:
1814d6994e40ebccf9428fc757d845e25c0e0c12cefMarek Olšák         return sizeof(GLubyte);
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
18883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
18983863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
190c450d57991628318696ee7a2bd052f91f480cda3Brian Paul         return sizeof(GLushort);
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
1951ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      case GL_UNSIGNED_INT_24_8_EXT:
1969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_UNSIGNED_INT_5_9_9_9_REV:
197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_UNSIGNED_INT_10F_11F_11F_REV:
198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         return sizeof(GLuint);
1991165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2001165280cbd37dee1e499358633478ab869de21dfMarek Olšák         return 8;
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the number of components in a pixel format.
2096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the number of components in the given format, or -1 if a bad format.
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
21485bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint
21585bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_components_in_format( GLenum format )
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RED_INTEGER_EXT:
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_GREEN_INTEGER_EXT:
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_BLUE_INTEGER_EXT:
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA_INTEGER_EXT:
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_INTEGER_EXT:
231070b2644c6d3b0b4c6da64addd85245d730b6240Brian Paul      case GL_INTENSITY:
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 1;
23383863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG:
23783863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_YCBCR_MESA:
23883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_DEPTH_STENCIL_EXT:
23983863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_DUDV_ATI:
24083863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_DU8DV8_ATI:
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 2;
24283863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
24483863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_BGR:
245abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB_INTEGER_EXT:
24647e2e367170edec022481f1487cd980e00ef3203Dave Airlie      case GL_BGR_INTEGER_EXT:
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach	 return 3;
24883863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
25283863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul      case GL_RGBA_INTEGER_EXT:
25347e2e367170edec022481f1487cd980e00ef3203Dave Airlie      case GL_BGRA_INTEGER_EXT:
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 4;
25583863d468e2375696478e3ec83c42aaab9fbc19cBrian Paul
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
2626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
2636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the bytes per pixel of pixel format type pair.
2646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
2666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
2676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
2686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return bytes per pixel, or -1 if a bad format or type was given.
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
27085bc17495b5fe263f288904aa97dcf16d7eb6910Brian PaulGLint
27185bc17495b5fe263f288904aa97dcf16d7eb6910Brian Paul_mesa_bytes_per_pixel( GLenum format, GLenum type )
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
273b7d076fc96ac27117421653a043d00a95f789d24Brian Paul   GLint comps = _mesa_components_in_format( format );
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (comps < 0)
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      return -1;
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (type) {
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BITMAP:
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return 0;  /* special case */
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BYTE:
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE:
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLubyte);
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_SHORT:
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT:
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLshort);
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_INT:
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT:
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLint);
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_FLOAT:
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return comps * sizeof(GLfloat);
291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul      case GL_HALF_FLOAT_ARB:
292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul         return comps * sizeof(GLhalfARB);
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_3_3_2:
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_BYTE_2_3_3_REV:
2950a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul         if (format == GL_RGB || format == GL_BGR ||
2960a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul             format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLubyte);
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5:
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_6_5_REV:
3020a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul         if (format == GL_RGB || format == GL_BGR ||
3030a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul             format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
304c450d57991628318696ee7a2bd052f91f480cda3Brian Paul            return sizeof(GLushort);
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;  /* error */
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4:
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_5_5_5_1:
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3110a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
3120a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul             format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLushort);
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8:
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_8_8_8_8_REV:
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_10_10_10_2:
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_UNSIGNED_INT_2_10_10_10_REV:
3200a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
3210a3566cec02f4fc3fef5a29b31ca990d2c08e293Brian Paul             format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return sizeof(GLuint);
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         else
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            return -1;
325c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_MESA:
326c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_UNSIGNED_SHORT_8_8_REV_MESA:
327c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (format == GL_YCBCR_MESA)
328c5b995066020191982b2315fc45d05e068eee761Brian Paul            return sizeof(GLushort);
329c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
330c5b995066020191982b2315fc45d05e068eee761Brian Paul            return -1;
3311ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      case GL_UNSIGNED_INT_24_8_EXT:
3321ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         if (format == GL_DEPTH_STENCIL_EXT)
3331ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            return sizeof(GLuint);
3341ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         else
3351ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            return -1;
3369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_UNSIGNED_INT_5_9_9_9_REV:
3379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         if (format == GL_RGB)
3389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            return sizeof(GLuint);
3399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák         else
3409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            return -1;
341631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_UNSIGNED_INT_10F_11F_11F_REV:
342631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         if (format == GL_RGB)
343631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            return sizeof(GLuint);
344631d23daa91c569bf268a2191bd466df73a64263Marek Olšák         else
345631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            return -1;
3461165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
3471165280cbd37dee1e499358633478ab869de21dfMarek Olšák         if (format == GL_DEPTH_STENCIL)
3481165280cbd37dee1e499358633478ab869de21dfMarek Olšák            return 8;
3491165280cbd37dee1e499358633478ab869de21dfMarek Olšák         else
3501165280cbd37dee1e499358633478ab869de21dfMarek Olšák            return -1;
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return -1;
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
3576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
3586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test for a legal pixel format and type.
3596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
3616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel type.
3626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
3636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the given pixel format and type are legal, or GL_FALSE
3646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise.
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
366b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLboolean
3677faf521fad970d6f6706fc9d3c3f4644f2e158acBrian Paul_mesa_is_legal_format_and_type(const struct gl_context *ctx,
3687faf521fad970d6f6706fc9d3c3f4644f2e158acBrian Paul                               GLenum format, GLenum type)
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   switch (format) {
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_COLOR_INDEX:
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_STENCIL_INDEX:
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BITMAP:
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RED:
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_GREEN:
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BLUE:
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ALPHA:
3925b05a187dc34fa3ab6b5ab6bc1a6e98df80a2553Brian Paul#if 0 /* not legal!  see table 3.6 of the 1.5 spec */
3932a1f50aee4f30dbd0c55d8f0b7185b690c841051Brian Paul      case GL_INTENSITY:
3945b05a187dc34fa3ab6b5ab6bc1a6e98df80a2553Brian Paul#endif
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE:
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_LUMINANCE_ALPHA:
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_DEPTH_COMPONENT:
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
4125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG:
4135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	 if (!ctx->Extensions.ARB_texture_rg)
4145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick	    return GL_FALSE;
4155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick
4165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         switch (type) {
4175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_BYTE:
4185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_UNSIGNED_BYTE:
4195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_SHORT:
4205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_UNSIGNED_SHORT:
4215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_INT:
4225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_UNSIGNED_INT:
4235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_FLOAT:
4245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick               return GL_TRUE;
4255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            case GL_HALF_FLOAT_ARB:
4265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick               return ctx->Extensions.ARB_half_float_pixel;
4275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick            default:
4285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick               return GL_FALSE;
4295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick         }
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGB:
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
43931a66ada72e5d9eb728f5149b72121bb04776016Brian Paul            case GL_UNSIGNED_BYTE_3_3_2:
44031a66ada72e5d9eb728f5149b72121bb04776016Brian Paul            case GL_UNSIGNED_BYTE_2_3_3_REV:
44131a66ada72e5d9eb728f5149b72121bb04776016Brian Paul            case GL_UNSIGNED_SHORT_5_6_5:
44231a66ada72e5d9eb728f5149b72121bb04776016Brian Paul            case GL_UNSIGNED_SHORT_5_6_5_REV:
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
444f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
4469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák            case GL_UNSIGNED_INT_5_9_9_9_REV:
4479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák               return ctx->Extensions.EXT_texture_shared_exponent;
448631d23daa91c569bf268a2191bd466df73a64263Marek Olšák            case GL_UNSIGNED_INT_10F_11F_11F_REV:
449631d23daa91c569bf268a2191bd466df73a64263Marek Olšák               return ctx->Extensions.EXT_packed_float;
450db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            default:
451db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul               return GL_FALSE;
452db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul         }
453db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul      case GL_BGR:
454db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul         switch (type) {
45531a66ada72e5d9eb728f5149b72121bb04776016Brian Paul            /* NOTE: no packed types are supported with BGR.  That's
45631a66ada72e5d9eb728f5149b72121bb04776016Brian Paul             * intentional, according to the GL spec.
45731a66ada72e5d9eb728f5149b72121bb04776016Brian Paul             */
458db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_BYTE:
459db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_UNSIGNED_BYTE:
460db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_SHORT:
461db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_UNSIGNED_SHORT:
462db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_INT:
463db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_UNSIGNED_INT:
464db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_FLOAT:
465db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul               return GL_TRUE;
466db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul            case GL_HALF_FLOAT_ARB:
467db862e4d4c575fa9ea306fd4d271b58d1b77e83bBrian Paul               return ctx->Extensions.ARB_half_float_pixel;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_RGBA:
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_BGRA:
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      case GL_ABGR_EXT:
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         switch (type) {
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_BYTE:
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_BYTE:
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_SHORT:
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT:
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_INT:
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT:
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_FLOAT:
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4:
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_5_5_5_1:
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8:
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_8_8_8_8_REV:
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_10_10_10_2:
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            case GL_UNSIGNED_INT_2_10_10_10_REV:
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_TRUE;
491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul            case GL_HALF_FLOAT_ARB:
492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul               return ctx->Extensions.ARB_half_float_pixel;
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach            default:
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach               return GL_FALSE;
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         }
496c5b995066020191982b2315fc45d05e068eee761Brian Paul      case GL_YCBCR_MESA:
497c5b995066020191982b2315fc45d05e068eee761Brian Paul         if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
498c5b995066020191982b2315fc45d05e068eee761Brian Paul             type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
499c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_TRUE;
500c5b995066020191982b2315fc45d05e068eee761Brian Paul         else
501c5b995066020191982b2315fc45d05e068eee761Brian Paul            return GL_FALSE;
5021ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      case GL_DEPTH_STENCIL_EXT:
5031165280cbd37dee1e499358633478ab869de21dfMarek Olšák         if ((ctx->Extensions.EXT_packed_depth_stencil &&
5041165280cbd37dee1e499358633478ab869de21dfMarek Olšák              type == GL_UNSIGNED_INT_24_8_EXT) ||
5051165280cbd37dee1e499358633478ab869de21dfMarek Olšák             (ctx->Extensions.ARB_depth_buffer_float &&
5061165280cbd37dee1e499358633478ab869de21dfMarek Olšák              type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV))
5071ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            return GL_TRUE;
5081ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul         else
5091ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul            return GL_FALSE;
510114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      case GL_DUDV_ATI:
511114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger      case GL_DU8DV8_ATI:
512114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         switch (type) {
513114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_BYTE:
514114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_UNSIGNED_BYTE:
515114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_SHORT:
516114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_UNSIGNED_SHORT:
517114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_INT:
518114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_UNSIGNED_INT:
519114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            case GL_FLOAT:
520114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger               return GL_TRUE;
521114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger            default:
522114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger               return GL_FALSE;
523114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger         }
524113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul
525113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul      /* integer-valued formats */
526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RED_INTEGER_EXT:
527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_GREEN_INTEGER_EXT:
528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_BLUE_INTEGER_EXT:
529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_ALPHA_INTEGER_EXT:
530113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         switch (type) {
531113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_BYTE:
532113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE:
533113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_SHORT:
534113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT:
535113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_INT:
536113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT:
537113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return ctx->Extensions.EXT_texture_integer;
538113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            default:
539113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return GL_FALSE;
540113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         }
541113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul
542abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_RGB_INTEGER_EXT:
543113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         switch (type) {
544113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_BYTE:
545113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE:
546113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_SHORT:
547113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT:
548113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_INT:
549113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT:
550923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie               return ctx->Extensions.EXT_texture_integer;
551113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE_3_3_2:
552113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE_2_3_3_REV:
553113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_5_6_5:
554113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_5_6_5_REV:
555923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie               return ctx->Extensions.ARB_texture_rgb10_a2ui;
556113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            default:
557113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return GL_FALSE;
558113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         }
559113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul
560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_BGR_INTEGER_EXT:
561113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         switch (type) {
562113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_BYTE:
563113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE:
564113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_SHORT:
565113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT:
566113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_INT:
567113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT:
568113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            /* NOTE: no packed formats w/ BGR format */
569113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return ctx->Extensions.EXT_texture_integer;
570113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            default:
571113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return GL_FALSE;
572113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         }
573113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul
574113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul      case GL_RGBA_INTEGER_EXT:
575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_BGRA_INTEGER_EXT:
576113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         switch (type) {
577113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_BYTE:
578113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_BYTE:
579113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_SHORT:
580113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT:
581113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_INT:
582113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT:
583923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie               return ctx->Extensions.EXT_texture_integer;
584113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_4_4_4_4:
585113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_4_4_4_4_REV:
586113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_5_5_5_1:
587113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_SHORT_1_5_5_5_REV:
588113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT_8_8_8_8:
589113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT_8_8_8_8_REV:
590113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT_10_10_10_2:
591113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            case GL_UNSIGNED_INT_2_10_10_10_REV:
592923f143335ad1cba4795276e79cb1a5b0cd19bbcDave Airlie               return ctx->Extensions.ARB_texture_rgb10_a2ui;
593113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul            default:
594113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul               return GL_FALSE;
595113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul         }
596113c1832b1fef04fc4856b4efeab71ac76a87ad0Brian Paul
597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_INTEGER_EXT:
598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         switch (type) {
600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_BYTE:
601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_UNSIGNED_BYTE:
602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_SHORT:
603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_UNSIGNED_SHORT:
604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_INT:
605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            case GL_UNSIGNED_INT:
606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               return ctx->Extensions.EXT_texture_integer;
607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul            default:
608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul               return GL_FALSE;
609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul         }
610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      default:
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         ; /* fall-through */
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return GL_FALSE;
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
6186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
61973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a color/RGBA format (i.e., not color
62073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * index, depth, stencil, etc).
62173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * \param format  the image format value (may by an internal texture format)
62273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
62373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */
62473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean
62573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_color_format(GLenum format)
62673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{
62773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   switch (format) {
62873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RED:
62973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_GREEN:
63073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_BLUE:
63173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA:
63273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA4:
63373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA8:
63473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA12:
63573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA16:
63673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case 1:
63773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE:
63873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE4:
63973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE8:
64073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE12:
64173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE16:
64273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case 2:
64373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE_ALPHA:
64473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE4_ALPHA4:
64573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE6_ALPHA2:
64673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE8_ALPHA8:
64773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE12_ALPHA4:
64873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE12_ALPHA12:
64973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE16_ALPHA16:
65073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY:
65173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY4:
65273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY8:
65373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY12:
65473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY16:
6555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_R8:
6565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_R16:
6575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG:
6585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG8:
6595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG16:
66073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case 3:
66173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB:
66273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_BGR:
66373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_R3_G3_B2:
66473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB4:
66573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB5:
66673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB8:
66773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB10:
66873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB12:
66973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB16:
67073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case 4:
67173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ABGR_EXT:
67273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA:
67373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_BGRA:
67473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA2:
67573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA4:
67673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB5_A1:
67773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA8:
67873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB10_A2:
67973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA12:
68073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA16:
68173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      /* float texture formats */
68273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA16F_ARB:
68373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_ALPHA32F_ARB:
68473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE16F_ARB:
68573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE32F_ARB:
68673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE_ALPHA16F_ARB:
68773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_LUMINANCE_ALPHA32F_ARB:
68873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY16F_ARB:
68973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_INTENSITY32F_ARB:
6905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_R16F:
6915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_R32F:
6925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG16F:
6935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick      case GL_RG32F:
69473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB16F_ARB:
69573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB32F_ARB:
69673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA16F_ARB:
69773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA32F_ARB:
69873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      /* compressed formats */
69973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_ALPHA:
70073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_LUMINANCE:
70173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_LUMINANCE_ALPHA:
70273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_INTENSITY:
7037c6147014a726eefb7a73c8520a0b48a57248a03Ian Romanick      case GL_COMPRESSED_RED:
7047c6147014a726eefb7a73c8520a0b48a57248a03Ian Romanick      case GL_COMPRESSED_RG:
70573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGB:
70673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGBA:
70773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB_S3TC:
70873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGB4_S3TC:
70973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA_S3TC:
71073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_RGBA4_S3TC:
71173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
71273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
71373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
71473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
71573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGB_FXT1_3DFX:
71673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_RGBA_FXT1_3DFX:
71773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul#if FEATURE_EXT_texture_sRGB
71873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SRGB_EXT:
71973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SRGB8_EXT:
72073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SRGB_ALPHA_EXT:
72173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SRGB8_ALPHA8_EXT:
72273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SLUMINANCE_ALPHA_EXT:
72373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SLUMINANCE8_ALPHA8_EXT:
72473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SLUMINANCE_EXT:
72573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_SLUMINANCE8_EXT:
72673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_EXT:
72773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
72873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_EXT:
72973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
73073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
73173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
73273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SLUMINANCE_EXT:
73373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
73473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul#endif /* FEATURE_EXT_texture_sRGB */
7351ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick      case GL_COMPRESSED_RED_RGTC1:
7361ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick      case GL_COMPRESSED_SIGNED_RED_RGTC1:
7371ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick      case GL_COMPRESSED_RG_RGTC2:
7381ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick      case GL_COMPRESSED_SIGNED_RG_RGTC2:
7397d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
7407d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
7417d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
7427d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
74369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
744d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      case GL_ETC1_RGB8_OES:
745862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      /* generic integer formats */
746862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RED_INTEGER_EXT:
747862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_GREEN_INTEGER_EXT:
748862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_BLUE_INTEGER_EXT:
749862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA_INTEGER_EXT:
750862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB_INTEGER_EXT:
751862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA_INTEGER_EXT:
752862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_BGR_INTEGER_EXT:
753862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_BGRA_INTEGER_EXT:
754862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_INTEGER_EXT:
755862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA_INTEGER_EXT:
756862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      /* sized integer formats */
757862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA32UI_EXT:
758862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB32UI_EXT:
759862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA32UI_EXT:
760862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY32UI_EXT:
761862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE32UI_EXT:
762862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA32UI_EXT:
763862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA16UI_EXT:
764862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB16UI_EXT:
765862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA16UI_EXT:
766862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY16UI_EXT:
767862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE16UI_EXT:
768862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA16UI_EXT:
769862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA8UI_EXT:
770862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB8UI_EXT:
771862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA8UI_EXT:
772862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY8UI_EXT:
773862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE8UI_EXT:
774862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA8UI_EXT:
775862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA32I_EXT:
776862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB32I_EXT:
777862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA32I_EXT:
778862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY32I_EXT:
779862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE32I_EXT:
780862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA32I_EXT:
781862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA16I_EXT:
782862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB16I_EXT:
783862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA16I_EXT:
784862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY16I_EXT:
785862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE16I_EXT:
786862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA16I_EXT:
787862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGBA8I_EXT:
788862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_RGB8I_EXT:
789862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_ALPHA8I_EXT:
790862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_INTENSITY8I_EXT:
791862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE8I_EXT:
792862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul      case GL_LUMINANCE_ALPHA8I_EXT:
7930be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      /* signed, normalized texture formats */
7940be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RED_SNORM:
7950be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_R8_SNORM:
7960be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_R16_SNORM:
7970be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RG_SNORM:
7980be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RG8_SNORM:
7990be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RG16_SNORM:
8000be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGB_SNORM:
8010be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGB8_SNORM:
8020be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGB16_SNORM:
8030be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGBA_SNORM:
8040be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGBA8_SNORM:
8050be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_RGBA16_SNORM:
8060be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_ALPHA_SNORM:
8070be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_ALPHA8_SNORM:
8080be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_ALPHA16_SNORM:
8090be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE_SNORM:
8100be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE8_SNORM:
8110be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE16_SNORM:
8120be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE_ALPHA_SNORM:
8130be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE8_ALPHA8_SNORM:
8140be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_LUMINANCE16_ALPHA16_SNORM:
8150be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_INTENSITY_SNORM:
8160be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_INTENSITY8_SNORM:
8170be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák      case GL_INTENSITY16_SNORM:
8189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák      case GL_RGB9_E5:
819631d23daa91c569bf268a2191bd466df73a64263Marek Olšák      case GL_R11F_G11F_B10F:
820f449be660e70aac2aefd2ce84581e137de25520bDave Airlie      case GL_RGB10_A2UI:
82173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_TRUE;
82273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_YCBCR_MESA:  /* not considered to be RGB */
82373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         /* fall-through */
82473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      default:
82573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_FALSE;
82673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   }
82773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul}
82873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
82973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
83073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/**
83173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a depth component format.
83273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */
83373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean
83473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_depth_format(GLenum format)
83573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{
83673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   switch (format) {
83773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH_COMPONENT:
83873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH_COMPONENT16:
83973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH_COMPONENT24:
84073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH_COMPONENT32:
8411165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_DEPTH_COMPONENT32F:
84273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_TRUE;
84373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      default:
84473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_FALSE;
84573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   }
84673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul}
84773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
84873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
84973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/**
85010d81f466794c61c11225c94b2125bf2dd23748eBrian Paul * Test if the given image format is a stencil format.
85110d81f466794c61c11225c94b2125bf2dd23748eBrian Paul */
85210d81f466794c61c11225c94b2125bf2dd23748eBrian PaulGLboolean
85310d81f466794c61c11225c94b2125bf2dd23748eBrian Paul_mesa_is_stencil_format(GLenum format)
85410d81f466794c61c11225c94b2125bf2dd23748eBrian Paul{
85510d81f466794c61c11225c94b2125bf2dd23748eBrian Paul   switch (format) {
85610d81f466794c61c11225c94b2125bf2dd23748eBrian Paul      case GL_STENCIL_INDEX:
85710d81f466794c61c11225c94b2125bf2dd23748eBrian Paul         return GL_TRUE;
85810d81f466794c61c11225c94b2125bf2dd23748eBrian Paul      default:
85910d81f466794c61c11225c94b2125bf2dd23748eBrian Paul         return GL_FALSE;
86010d81f466794c61c11225c94b2125bf2dd23748eBrian Paul   }
86110d81f466794c61c11225c94b2125bf2dd23748eBrian Paul}
86210d81f466794c61c11225c94b2125bf2dd23748eBrian Paul
86310d81f466794c61c11225c94b2125bf2dd23748eBrian Paul
86410d81f466794c61c11225c94b2125bf2dd23748eBrian Paul/**
86573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a YCbCr format.
86673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */
86773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean
86873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_ycbcr_format(GLenum format)
86973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{
87073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   switch (format) {
87173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_YCBCR_MESA:
87273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_TRUE;
87373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      default:
87473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_FALSE;
87573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   }
87673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul}
87773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
87873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
87973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/**
88073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a depth+stencil format.
88173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */
88273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean
88373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_depthstencil_format(GLenum format)
88473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{
88573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   switch (format) {
88673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH24_STENCIL8_EXT:
88773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DEPTH_STENCIL_EXT:
8881165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_DEPTH32F_STENCIL8:
88973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_TRUE;
89073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      default:
89173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_FALSE;
89273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   }
89373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul}
89473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
895e485af774efba897dcbef4697158428c2298d964Brian Paul
896e485af774efba897dcbef4697158428c2298d964Brian Paul/**
897e485af774efba897dcbef4697158428c2298d964Brian Paul * Test if the given image format is a depth or stencil format.
898e485af774efba897dcbef4697158428c2298d964Brian Paul */
899e485af774efba897dcbef4697158428c2298d964Brian PaulGLboolean
900e485af774efba897dcbef4697158428c2298d964Brian Paul_mesa_is_depth_or_stencil_format(GLenum format)
901e485af774efba897dcbef4697158428c2298d964Brian Paul{
902e485af774efba897dcbef4697158428c2298d964Brian Paul   switch (format) {
903e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH_COMPONENT:
904e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH_COMPONENT16:
905e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH_COMPONENT24:
906e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH_COMPONENT32:
907e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_STENCIL_INDEX:
908e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_STENCIL_INDEX1_EXT:
909e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_STENCIL_INDEX4_EXT:
910e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_STENCIL_INDEX8_EXT:
911e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_STENCIL_INDEX16_EXT:
912e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH_STENCIL_EXT:
913e485af774efba897dcbef4697158428c2298d964Brian Paul      case GL_DEPTH24_STENCIL8_EXT:
9141165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_DEPTH_COMPONENT32F:
9151165280cbd37dee1e499358633478ab869de21dfMarek Olšák      case GL_DEPTH32F_STENCIL8:
916e485af774efba897dcbef4697158428c2298d964Brian Paul         return GL_TRUE;
917e485af774efba897dcbef4697158428c2298d964Brian Paul      default:
918e485af774efba897dcbef4697158428c2298d964Brian Paul         return GL_FALSE;
919e485af774efba897dcbef4697158428c2298d964Brian Paul   }
920e485af774efba897dcbef4697158428c2298d964Brian Paul}
921e485af774efba897dcbef4697158428c2298d964Brian Paul
922e485af774efba897dcbef4697158428c2298d964Brian Paul
92373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/**
92473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * Test if the given image format is a dudv format.
92573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul */
92673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian PaulGLboolean
92773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul_mesa_is_dudv_format(GLenum format)
92873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul{
92973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   switch (format) {
93073b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DUDV_ATI:
93173b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      case GL_DU8DV8_ATI:
93273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_TRUE;
93373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul      default:
93473b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul         return GL_FALSE;
93573b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul   }
93673b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul}
93773b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
93873b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul
93973b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul/**
940abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul * Test if the given format is an integer (non-normalized) format.
941abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul */
942abd5627a6a034885b0b01b995c73870da1361bb0Brian PaulGLboolean
943abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_is_integer_format(GLenum format)
944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{
945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   switch (format) {
946862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   /* generic integer formats */
947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_RED_INTEGER_EXT:
948abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_GREEN_INTEGER_EXT:
949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_BLUE_INTEGER_EXT:
950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_ALPHA_INTEGER_EXT:
951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_RGB_INTEGER_EXT:
952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_RGBA_INTEGER_EXT:
953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_BGR_INTEGER_EXT:
954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_BGRA_INTEGER_EXT:
955abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_LUMINANCE_INTEGER_EXT:
956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
957862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   /* specific integer formats */
958862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA32UI_EXT:
959862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB32UI_EXT:
9602bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG32UI:
9612bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R32UI:
962862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA32UI_EXT:
963862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY32UI_EXT:
964862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE32UI_EXT:
965862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA32UI_EXT:
966862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA16UI_EXT:
967862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB16UI_EXT:
9682bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG16UI:
9692bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R16UI:
970862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA16UI_EXT:
971862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY16UI_EXT:
972862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE16UI_EXT:
973862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA16UI_EXT:
974862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA8UI_EXT:
975862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB8UI_EXT:
9762bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG8UI:
9772bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R8UI:
978862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA8UI_EXT:
979862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY8UI_EXT:
980862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE8UI_EXT:
981862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA8UI_EXT:
982862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA32I_EXT:
983862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB32I_EXT:
9842bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG32I:
9852bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R32I:
986862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA32I_EXT:
987862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY32I_EXT:
988862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE32I_EXT:
989862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA32I_EXT:
990862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA16I_EXT:
991862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB16I_EXT:
9922bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG16I:
9932bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R16I:
994862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA16I_EXT:
995862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY16I_EXT:
996862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE16I_EXT:
997862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA16I_EXT:
998862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGBA8I_EXT:
999862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_RGB8I_EXT:
10002bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_RG8I:
10012bf9aeaa19f75816c6342fe564ad7c4bcdc97e12Eric Anholt   case GL_R8I:
1002862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_ALPHA8I_EXT:
1003862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_INTENSITY8I_EXT:
1004862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE8I_EXT:
1005862bb1b0ff9131eec1db7658b088ea1f9fae628fBrian Paul   case GL_LUMINANCE_ALPHA8I_EXT:
1006f449be660e70aac2aefd2ce84581e137de25520bDave Airlie   case GL_RGB10_A2UI:
1007abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      return GL_TRUE;
1008abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   default:
1009abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul      return GL_FALSE;
1010abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul   }
1011abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul}
1012abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
1013abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul
1014abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/**
1015c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * Test if an image format is a supported compressed format.
1016c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * \param format the internal format token provided by the user.
1017c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul * \return GL_TRUE if compressed, GL_FALSE if uncompressed
1018c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul */
1019c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian PaulGLboolean
1020f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
1021c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul{
1022c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   switch (format) {
1023c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1024c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1025c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
1026c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
1027c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul      return ctx->Extensions.EXT_texture_compression_s3tc;
1028c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_RGB_S3TC:
1029c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_RGB4_S3TC:
1030c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_RGBA_S3TC:
1031c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_RGBA4_S3TC:
1032c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul      return ctx->Extensions.S3_s3tc;
1033c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
1034c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
1035c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
1036c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
1037c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul      return ctx->Extensions.EXT_texture_sRGB
1038c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul         && ctx->Extensions.EXT_texture_compression_s3tc;
1039c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGB_FXT1_3DFX:
1040c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   case GL_COMPRESSED_RGBA_FXT1_3DFX:
1041c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul      return ctx->Extensions.TDFX_texture_compression_FXT1;
10421ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick   case GL_COMPRESSED_RED_RGTC1:
10431ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick   case GL_COMPRESSED_SIGNED_RED_RGTC1:
10441ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick   case GL_COMPRESSED_RG_RGTC2:
10451ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick   case GL_COMPRESSED_SIGNED_RG_RGTC2:
10461ca6cbec1b1168b55fecb264d4e75a26de2cccafIan Romanick      return ctx->Extensions.ARB_texture_compression_rgtc;
10477d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
10487d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
10497d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
10507d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
10517d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák      return ctx->Extensions.EXT_texture_compression_latc;
105269f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
105369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák      return ctx->Extensions.ATI_texture_compression_3dc;
1054d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu   case GL_ETC1_RGB8_OES:
1055d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu      return ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
1056a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick#if FEATURE_ES
1057a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE4_RGB8_OES:
1058a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE4_RGBA8_OES:
1059a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE4_R5_G6_B5_OES:
1060a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE4_RGBA4_OES:
1061a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE4_RGB5_A1_OES:
1062a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE8_RGB8_OES:
1063a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE8_RGBA8_OES:
1064a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE8_R5_G6_B5_OES:
1065a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE8_RGBA4_OES:
1066a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick   case GL_PALETTE8_RGB5_A1_OES:
1067a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick      return ctx->API == API_OPENGLES;
1068a454c835fa4f1d243f9e2072007dd52cf0d71dacIan Romanick#endif
1069c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   default:
1070c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul      return GL_FALSE;
1071c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul   }
107237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul}
107337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul
107437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul
107537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul/**
107637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul * Does the given base texture/renderbuffer format have the channel
107737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul * named by 'pname'?
107837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul */
107937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian PaulGLboolean
108037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul_mesa_base_format_has_channel(GLenum base_format, GLenum pname)
108137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul{
108237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   switch (pname) {
108337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_RED_SIZE:
108437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_RED_TYPE:
108537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_RED_SIZE_EXT:
108637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
108737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_RED ||
108837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RG ||
108937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RGB ||
109037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RGBA) {
109137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
109237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
109337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
109437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_GREEN_SIZE:
109537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_GREEN_TYPE:
109637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
109737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
109837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_RG ||
109937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RGB ||
110037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RGBA) {
110137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
110237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
110337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
110437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_BLUE_SIZE:
110537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_BLUE_TYPE:
110637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
110737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
110837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_RGB ||
110937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_RGBA) {
111037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
111137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
111237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
111337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_ALPHA_SIZE:
111437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_ALPHA_TYPE:
111537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
111637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
111737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_RGBA ||
111837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_ALPHA ||
111937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_LUMINANCE_ALPHA) {
112037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
112137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
112237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
112337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_LUMINANCE_SIZE:
112437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_LUMINANCE_TYPE:
112537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_LUMINANCE ||
112637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_LUMINANCE_ALPHA) {
112737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
112837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
112937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
113037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_INTENSITY_SIZE:
113137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_INTENSITY_TYPE:
113237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_INTENSITY) {
113337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
113437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
113537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
113637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_DEPTH_SIZE:
113737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_TEXTURE_DEPTH_TYPE:
113837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
113937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
114037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_DEPTH_STENCIL ||
114137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_DEPTH_COMPONENT) {
114237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
114337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
114437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
114537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
114637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
114737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      if (base_format == GL_DEPTH_STENCIL ||
114837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	  base_format == GL_STENCIL_INDEX) {
114937bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul	 return GL_TRUE;
115037bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      }
115137bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
115237bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   default:
115337bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
115437bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul		    __FUNCTION__, pname);
115537bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul      return GL_FALSE;
115637bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   }
115737bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul
115837bf720da4a165c3fbf22d8ebb87c5c42e02f98eBrian Paul   return GL_FALSE;
1159c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul}
1160c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul
1161c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul
1162c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul/**
116360909388ab136d849d99eab49e782a53772a618fBrian Paul * Return the address of a specific pixel in an image (1D, 2D or 3D).
11646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
11656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Pixel unpacking/packing parameters are observed according to \p packing.
11666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
116760909388ab136d849d99eab49e782a53772a618fBrian Paul * \param dimensions either 1, 2 or 3 to indicate dimensionality of image
116860909388ab136d849d99eab49e782a53772a618fBrian Paul * \param image  starting address of image data
116960909388ab136d849d99eab49e782a53772a618fBrian Paul * \param width  the image width
117060909388ab136d849d99eab49e782a53772a618fBrian Paul * \param height  theimage height
117160909388ab136d849d99eab49e782a53772a618fBrian Paul * \param format  the pixel format
117260909388ab136d849d99eab49e782a53772a618fBrian Paul * \param type  the pixel data type
117360909388ab136d849d99eab49e782a53772a618fBrian Paul * \param packing  the pixelstore attributes
117460909388ab136d849d99eab49e782a53772a618fBrian Paul * \param img  which image in the volume (0 for 1D or 2D images)
117560909388ab136d849d99eab49e782a53772a618fBrian Paul * \param row  row of pixel in the image (0 for 1D images)
117660909388ab136d849d99eab49e782a53772a618fBrian Paul * \param column column of pixel in the image
11776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
11786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return address of pixel on success, or NULL on error.
11796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
11806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_pixelstore_attrib.
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach */
1182b7d076fc96ac27117421653a043d00a95f789d24Brian PaulGLvoid *
118360909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address( GLuint dimensions,
118460909388ab136d849d99eab49e782a53772a618fBrian Paul                     const struct gl_pixelstore_attrib *packing,
118560909388ab136d849d99eab49e782a53772a618fBrian Paul                     const GLvoid *image,
118660909388ab136d849d99eab49e782a53772a618fBrian Paul                     GLsizei width, GLsizei height,
118760909388ab136d849d99eab49e782a53772a618fBrian Paul                     GLenum format, GLenum type,
1188b7d076fc96ac27117421653a043d00a95f789d24Brian Paul                     GLint img, GLint row, GLint column )
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach{
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint alignment;        /* 1, 2 or 4 */
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint pixels_per_row;
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint rows_per_image;
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skiprows;
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skippixels;
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLint skipimages;       /* for 3-D volume images */
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   GLubyte *pixel_addr;
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
119860909388ab136d849d99eab49e782a53772a618fBrian Paul   ASSERT(dimensions >= 1 && dimensions <= 3);
119960909388ab136d849d99eab49e782a53772a618fBrian Paul
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   alignment = packing->Alignment;
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->RowLength > 0) {
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = packing->RowLength;
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixels_per_row = width;
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   if (packing->ImageHeight > 0) {
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = packing->ImageHeight;
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      rows_per_image = height;
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
121360909388ab136d849d99eab49e782a53772a618fBrian Paul
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   skippixels = packing->SkipPixels;
121560909388ab136d849d99eab49e782a53772a618fBrian Paul   /* Note: SKIP_ROWS _is_ used for 1D images */
121660909388ab136d849d99eab49e782a53772a618fBrian Paul   skiprows = packing->SkipRows;
121760909388ab136d849d99eab49e782a53772a618fBrian Paul   /* Note: SKIP_IMAGES is only used for 3D images */
121860909388ab136d849d99eab49e782a53772a618fBrian Paul   skipimages = (dimensions == 3) ? packing->SkipImages : 0;
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1220450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul   if (type == GL_BITMAP) {
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* BITMAP data */
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint comp_per_pixel;   /* components per pixel */
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_comp;   /* bytes per component */
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_row;
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_image;
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute bytes per component */
1228b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_comp = _mesa_sizeof_packed_type( type );
1229450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul      if (bytes_per_comp < 0) {
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Compute number of components per pixel */
1234b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      comp_per_pixel = _mesa_components_in_format( format );
1235450e917c9d71f696bca2ba11960a521e64385ec2Brian Paul      if (comp_per_pixel < 0) {
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         return NULL;
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      }
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = alignment
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                    * CEILING( comp_per_pixel*pixels_per_row, 8*alignment );
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) / 8;
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   else {
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* Non-BITMAP data */
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      GLint bytes_per_pixel, bytes_per_row, remainder, bytes_per_image;
1252551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      GLint topOfImage;
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1254b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      bytes_per_pixel = _mesa_bytes_per_pixel( format, type );
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* The pixel type and format should have been error checked earlier */
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      assert(bytes_per_pixel > 0);
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_row = pixels_per_row * bytes_per_pixel;
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      remainder = bytes_per_row % alignment;
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      if (remainder > 0)
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach         bytes_per_row += (alignment - remainder);
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      ASSERT(bytes_per_row % alignment == 0);
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      bytes_per_image = bytes_per_row * rows_per_image;
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1268551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      if (packing->Invert) {
1269551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         /* set pixel_addr to the last row */
1270551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = bytes_per_row * (height - 1);
1271551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         bytes_per_row = -bytes_per_row;
1272551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
1273551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      else {
1274551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul         topOfImage = 0;
1275551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
1276551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      /* compute final pixel address */
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach      pixel_addr = (GLubyte *) image
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skipimages + img) * bytes_per_image
1280551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul                 + topOfImage
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skiprows + row) * bytes_per_row
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach                 + (skippixels + column) * bytes_per_pixel;
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   }
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach   return (GLvoid *) pixel_addr;
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach}
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cJochen Gerlach
128960909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid *
129060909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address1d( const struct gl_pixelstore_attrib *packing,
129160909388ab136d849d99eab49e782a53772a618fBrian Paul                       const GLvoid *image,
129260909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLsizei width,
129360909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLenum format, GLenum type,
129460909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLint column )
129560909388ab136d849d99eab49e782a53772a618fBrian Paul{
129660909388ab136d849d99eab49e782a53772a618fBrian Paul   return _mesa_image_address(1, packing, image, width, 1,
129760909388ab136d849d99eab49e782a53772a618fBrian Paul                              format, type, 0, 0, column);
129860909388ab136d849d99eab49e782a53772a618fBrian Paul}
129960909388ab136d849d99eab49e782a53772a618fBrian Paul
130060909388ab136d849d99eab49e782a53772a618fBrian Paul
130160909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid *
130260909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address2d( const struct gl_pixelstore_attrib *packing,
130360909388ab136d849d99eab49e782a53772a618fBrian Paul                       const GLvoid *image,
130460909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLsizei width, GLsizei height,
130560909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLenum format, GLenum type,
130660909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLint row, GLint column )
130760909388ab136d849d99eab49e782a53772a618fBrian Paul{
130860909388ab136d849d99eab49e782a53772a618fBrian Paul   return _mesa_image_address(2, packing, image, width, height,
130960909388ab136d849d99eab49e782a53772a618fBrian Paul                              format, type, 0, row, column);
131060909388ab136d849d99eab49e782a53772a618fBrian Paul}
131160909388ab136d849d99eab49e782a53772a618fBrian Paul
131260909388ab136d849d99eab49e782a53772a618fBrian Paul
131360909388ab136d849d99eab49e782a53772a618fBrian PaulGLvoid *
131460909388ab136d849d99eab49e782a53772a618fBrian Paul_mesa_image_address3d( const struct gl_pixelstore_attrib *packing,
131560909388ab136d849d99eab49e782a53772a618fBrian Paul                       const GLvoid *image,
131660909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLsizei width, GLsizei height,
131760909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLenum format, GLenum type,
131860909388ab136d849d99eab49e782a53772a618fBrian Paul                       GLint img, GLint row, GLint column )
131960909388ab136d849d99eab49e782a53772a618fBrian Paul{
132060909388ab136d849d99eab49e782a53772a618fBrian Paul   return _mesa_image_address(3, packing, image, width, height,
132160909388ab136d849d99eab49e782a53772a618fBrian Paul                              format, type, img, row, column);
132260909388ab136d849d99eab49e782a53772a618fBrian Paul}
132360909388ab136d849d99eab49e782a53772a618fBrian Paul
132460909388ab136d849d99eab49e782a53772a618fBrian Paul
132560909388ab136d849d99eab49e782a53772a618fBrian Paul
13266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**
132717fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul * Compute the stride (in bytes) between image rows.
13286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
13296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param packing the pixelstore attributes
13306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width.
13316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel format.
13326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type.
13336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
133417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul * \return the stride in bytes for the given parameters, or -1 if error
1335ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul */
1336ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian PaulGLint
1337ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul_mesa_image_row_stride( const struct gl_pixelstore_attrib *packing,
1338ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul                        GLint width, GLenum format, GLenum type )
1339ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul{
134017fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   GLint bytesPerRow, remainder;
134117fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul
1342ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   ASSERT(packing);
134317fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul
1344ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   if (type == GL_BITMAP) {
1345ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
134617fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul         bytesPerRow = (width + 7) / 8;
1347ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
1348ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
134917fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul         bytesPerRow = (packing->RowLength + 7) / 8;
1350551b65f13754e6760e5c272ff86f8873c9c13e5cBrian Paul      }
1351ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
1352ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   else {
1353ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      /* Non-BITMAP data */
1354b7d076fc96ac27117421653a043d00a95f789d24Brian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
1355ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (bytesPerPixel <= 0)
1356ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul         return -1;  /* error */
1357ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      if (packing->RowLength == 0) {
1358fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * width;
1359ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
1360ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      else {
1361fbbac25ad304e09a4cde52bd09b4940ac4785623Brian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
1362ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul      }
1363ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul   }
136417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul
136517fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   remainder = bytesPerRow % packing->Alignment;
136617fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   if (remainder > 0) {
136717fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul      bytesPerRow += (packing->Alignment - remainder);
136817fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   }
136917fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul
137017fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   if (packing->Invert) {
137117fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul      /* negate the bytes per row (negative row stride) */
137217fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul      bytesPerRow = -bytesPerRow;
137317fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   }
137417fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul
137517fb7821d7cdc0ed211eaef013ee7798619a61d3Brian Paul   return bytesPerRow;
1376ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul}
1377ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
1378ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul
1379ae40595b6943d41dfad0e9b500d5db70b2ad8c6eBrian Paul/*
1380d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * Compute the stride between images in a 3D texture (in bytes) for the given
1381d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul * pixel packing parameters and image width, format and type.
1382d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul */
1383d488af5b34e390a9b81dac96053bd45f34ffffffBrian PaulGLint
1384d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul_mesa_image_image_stride( const struct gl_pixelstore_attrib *packing,
1385d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLint width, GLint height,
1386d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul                          GLenum format, GLenum type )
1387d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul{
1388995456f9305593005f8466520314ee087f3d422aBrian Paul   GLint bytesPerRow, bytesPerImage, remainder;
1389995456f9305593005f8466520314ee087f3d422aBrian Paul
1390d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul   ASSERT(packing);
1391d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1392995456f9305593005f8466520314ee087f3d422aBrian Paul   if (type == GL_BITMAP) {
1393995456f9305593005f8466520314ee087f3d422aBrian Paul      if (packing->RowLength == 0) {
1394995456f9305593005f8466520314ee087f3d422aBrian Paul         bytesPerRow = (width + 7) / 8;
1395995456f9305593005f8466520314ee087f3d422aBrian Paul      }
1396995456f9305593005f8466520314ee087f3d422aBrian Paul      else {
1397995456f9305593005f8466520314ee087f3d422aBrian Paul         bytesPerRow = (packing->RowLength + 7) / 8;
1398995456f9305593005f8466520314ee087f3d422aBrian Paul      }
1399995456f9305593005f8466520314ee087f3d422aBrian Paul   }
1400995456f9305593005f8466520314ee087f3d422aBrian Paul   else {
1401d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
1402d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1403d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (bytesPerPixel <= 0)
1404d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         return -1;  /* error */
1405d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      if (packing->RowLength == 0) {
1406d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * width;
1407d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
1408d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      else {
1409d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul         bytesPerRow = bytesPerPixel * packing->RowLength;
1410d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul      }
1411995456f9305593005f8466520314ee087f3d422aBrian Paul   }
1412d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1413995456f9305593005f8466520314ee087f3d422aBrian Paul   remainder = bytesPerRow % packing->Alignment;
1414995456f9305593005f8466520314ee087f3d422aBrian Paul   if (remainder > 0)
1415995456f9305593005f8466520314ee087f3d422aBrian Paul      bytesPerRow += (packing->Alignment - remainder);
1416d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1417995456f9305593005f8466520314ee087f3d422aBrian Paul   if (packing->ImageHeight == 0)
1418995456f9305593005f8466520314ee087f3d422aBrian Paul      bytesPerImage = bytesPerRow * height;
1419995456f9305593005f8466520314ee087f3d422aBrian Paul   else
1420995456f9305593005f8466520314ee087f3d422aBrian Paul      bytesPerImage = bytesPerRow * packing->ImageHeight;
1421995456f9305593005f8466520314ee087f3d422aBrian Paul
1422995456f9305593005f8466520314ee087f3d422aBrian Paul   return bytesPerImage;
1423d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul}
1424d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1425d488af5b34e390a9b81dac96053bd45f34ffffffBrian Paul
1426116970154dc3bb148178e1a9fe38554fbbd133c8Brian Paul
1427278e76832fc26678592368b7b89bfddc137e0e93Brian Paul/**
1428278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "Expand" a bitmap from 1-bit per pixel to 8-bits per pixel.
1429278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * This is typically used to convert a bitmap into a GLubyte/pixel texture.
1430278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "On" bits will set texels to \p onValue.
1431278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * "Off" bits will not modify texels.
1432278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param width  src bitmap width in pixels
1433278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param height  src bitmap height in pixels
1434278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param unpack  bitmap unpacking state
1435278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param bitmap  the src bitmap data
1436278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param destBuffer  start of dest buffer
1437278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param destStride  row stride in dest buffer
1438278e76832fc26678592368b7b89bfddc137e0e93Brian Paul * \param onValue  if bit is 1, set destBuffer pixel to this value
1439278e76832fc26678592368b7b89bfddc137e0e93Brian Paul */
1440278e76832fc26678592368b7b89bfddc137e0e93Brian Paulvoid
1441278e76832fc26678592368b7b89bfddc137e0e93Brian Paul_mesa_expand_bitmap(GLsizei width, GLsizei height,
1442278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                    const struct gl_pixelstore_attrib *unpack,
1443278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                    const GLubyte *bitmap,
1444278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                    GLubyte *destBuffer, GLint destStride,
1445278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                    GLubyte onValue)
1446278e76832fc26678592368b7b89bfddc137e0e93Brian Paul{
1447278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   const GLubyte *srcRow = (const GLubyte *)
1448278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      _mesa_image_address2d(unpack, bitmap, width, height,
1449278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                            GL_COLOR_INDEX, GL_BITMAP, 0, 0);
1450278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   const GLint srcStride = _mesa_image_row_stride(unpack, width,
1451278e76832fc26678592368b7b89bfddc137e0e93Brian Paul                                                  GL_COLOR_INDEX, GL_BITMAP);
1452278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   GLint row, col;
1453278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1454278e76832fc26678592368b7b89bfddc137e0e93Brian Paul#define SET_PIXEL(COL, ROW) \
1455278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   destBuffer[(ROW) * destStride + (COL)] = onValue;
1456278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1457278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   for (row = 0; row < height; row++) {
1458278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      const GLubyte *src = srcRow;
1459278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1460278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      if (unpack->LsbFirst) {
1461278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         /* Lsb first */
1462278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
1463278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         for (col = 0; col < width; col++) {
1464278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1465278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            if (*src & mask) {
1466278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               SET_PIXEL(col, row);
1467278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1468278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1469278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            if (mask == 128U) {
1470278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               src++;
1471278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               mask = 1U;
1472278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1473278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            else {
1474278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               mask = mask << 1;
1475278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1476278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         }
1477278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1478278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         /* get ready for next row */
1479278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         if (mask != 1)
1480278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            src++;
1481278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      }
1482278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      else {
1483278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         /* Msb first */
1484278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
1485278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         for (col = 0; col < width; col++) {
1486278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1487278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            if (*src & mask) {
1488278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               SET_PIXEL(col, row);
1489278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1490278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1491278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            if (mask == 1U) {
1492278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               src++;
1493278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               mask = 128U;
1494278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1495278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            else {
1496278e76832fc26678592368b7b89bfddc137e0e93Brian Paul               mask = mask >> 1;
1497278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            }
1498278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         }
1499278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1500278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         /* get ready for next row */
1501278e76832fc26678592368b7b89bfddc137e0e93Brian Paul         if (mask != 128)
1502278e76832fc26678592368b7b89bfddc137e0e93Brian Paul            src++;
1503278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      }
1504278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1505278e76832fc26678592368b7b89bfddc137e0e93Brian Paul      srcRow += srcStride;
1506278e76832fc26678592368b7b89bfddc137e0e93Brian Paul   } /* row */
1507278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1508278e76832fc26678592368b7b89bfddc137e0e93Brian Paul#undef SET_PIXEL
1509278e76832fc26678592368b7b89bfddc137e0e93Brian Paul}
1510278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
1511278e76832fc26678592368b7b89bfddc137e0e93Brian Paul
15124084e3c215d4db6370422fc718217bade7445618Brian Paul
151332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
151432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul/**
151532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * Convert an array of RGBA colors from one datatype to another.
15164bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul * NOTE: src may equal dst.  In that case, we use a temporary buffer.
151732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul */
151832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paulvoid
151932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul_mesa_convert_colors(GLenum srcType, const GLvoid *src,
152032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul                     GLenum dstType, GLvoid *dst,
152132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul                     GLuint count, const GLubyte mask[])
152232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul{
15231614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul   GLuint *tempBuffer;
15244bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul   const GLboolean useTemp = (src == dst);
15254bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul
15261614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul   tempBuffer = malloc(count * MAX_PIXEL_BYTES);
15271614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul   if (!tempBuffer)
15281614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul      return;
15291614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul
153032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   ASSERT(srcType != dstType);
153132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
153232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   switch (srcType) {
153332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   case GL_UNSIGNED_BYTE:
153432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (dstType == GL_UNSIGNED_SHORT) {
15354bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
15364bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
153732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
153832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
153932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            if (!mask || mask[i]) {
15404bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst2[i][RCOMP] = UBYTE_TO_USHORT(src1[i][RCOMP]);
15414bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst2[i][GCOMP] = UBYTE_TO_USHORT(src1[i][GCOMP]);
15424bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst2[i][BCOMP] = UBYTE_TO_USHORT(src1[i][BCOMP]);
15434bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst2[i][ACOMP] = UBYTE_TO_USHORT(src1[i][ACOMP]);
154432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            }
154532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
15464bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1547c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
154832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
154932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      else {
15504bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLubyte (*src1)[4] = (const GLubyte (*)[4]) src;
15514bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
155232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
155332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         ASSERT(dstType == GL_FLOAT);
155432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
155532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            if (!mask || mask[i]) {
15564bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][RCOMP] = UBYTE_TO_FLOAT(src1[i][RCOMP]);
15574bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][GCOMP] = UBYTE_TO_FLOAT(src1[i][GCOMP]);
15584bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][BCOMP] = UBYTE_TO_FLOAT(src1[i][BCOMP]);
15594bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][ACOMP] = UBYTE_TO_FLOAT(src1[i][ACOMP]);
156032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            }
156132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
15624bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1563c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
156432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
156532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      break;
156632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   case GL_UNSIGNED_SHORT:
156732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (dstType == GL_UNSIGNED_BYTE) {
15684bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
15694bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
157032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
157132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
157232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            if (!mask || mask[i]) {
15734bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst1[i][RCOMP] = USHORT_TO_UBYTE(src2[i][RCOMP]);
15744bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst1[i][GCOMP] = USHORT_TO_UBYTE(src2[i][GCOMP]);
15754bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst1[i][BCOMP] = USHORT_TO_UBYTE(src2[i][BCOMP]);
15764bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst1[i][ACOMP] = USHORT_TO_UBYTE(src2[i][ACOMP]);
157732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            }
157832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
15794bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1580c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
158132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
158232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      else {
15834bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLushort (*src2)[4] = (const GLushort (*)[4]) src;
15844bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLfloat (*dst4)[4] = (GLfloat (*)[4]) (useTemp ? tempBuffer : dst);
158532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
158632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         ASSERT(dstType == GL_FLOAT);
158732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
158832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            if (!mask || mask[i]) {
15894bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][RCOMP] = USHORT_TO_FLOAT(src2[i][RCOMP]);
15904bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][GCOMP] = USHORT_TO_FLOAT(src2[i][GCOMP]);
15914bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][BCOMP] = USHORT_TO_FLOAT(src2[i][BCOMP]);
15924bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               dst4[i][ACOMP] = USHORT_TO_FLOAT(src2[i][ACOMP]);
159332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            }
159432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
15954bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1596c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLfloat));
159732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
159832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      break;
159932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   case GL_FLOAT:
160032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (dstType == GL_UNSIGNED_BYTE) {
16014bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
16024bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLubyte (*dst1)[4] = (GLubyte (*)[4]) (useTemp ? tempBuffer : dst);
160332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
160432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
160581a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie            if (!mask || mask[i])
160681a86aea4f0990a1b8795f9e00e7a6c4ba368281Dave Airlie               _mesa_unclamped_float_rgba_to_ubyte(dst1[i], src4[i]);
160732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
16084bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1609c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLubyte));
161032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
161132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      else {
16124bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         const GLfloat (*src4)[4] = (const GLfloat (*)[4]) src;
16134bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         GLushort (*dst2)[4] = (GLushort (*)[4]) (useTemp ? tempBuffer : dst);
161432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         GLuint i;
161532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         ASSERT(dstType == GL_UNSIGNED_SHORT);
161632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         for (i = 0; i < count; i++) {
161732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            if (!mask || mask[i]) {
16184bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(dst2[i][RCOMP], src4[i][RCOMP]);
16194bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(dst2[i][GCOMP], src4[i][GCOMP]);
16204bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(dst2[i][BCOMP], src4[i][BCOMP]);
16214bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul               UNCLAMPED_FLOAT_TO_USHORT(dst2[i][ACOMP], src4[i][ACOMP]);
162232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul            }
162332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         }
16244bb9f4115c4b1930a140da78feff953e80f8a4f5Brian Paul         if (useTemp)
1625c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke            memcpy(dst, tempBuffer, count * 4 * sizeof(GLushort));
162632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
162732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      break;
162832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   default:
162932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      _mesa_problem(NULL, "Invalid datatype in _mesa_convert_colors");
163032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   }
16311614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul
16321614de4045c36ab6ec060e3bd0d1f3394d05b91eBrian Paul   free(tempBuffer);
163332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul}
163432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
163532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
163632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
163732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul
16384084e3c215d4db6370422fc718217bade7445618Brian Paul/**
163932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * Perform basic clipping for glDrawPixels.  The image's position and size
164032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * and the unpack SkipPixels and SkipRows are adjusted so that the image
164132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * region is entirely within the window and scissor bounds.
164232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * NOTE: this will only work when glPixelZoom is (1, 1) or (1, -1).
164332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * If Pixel.ZoomY is -1, *destY will be changed to be the first row which
164432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul * we'll actually write.  Beforehand, *destY-1 is the first drawing row.
16454084e3c215d4db6370422fc718217bade7445618Brian Paul *
16464084e3c215d4db6370422fc718217bade7445618Brian Paul * \return  GL_TRUE if image is ready for drawing or
16474084e3c215d4db6370422fc718217bade7445618Brian Paul *          GL_FALSE if image was completely clipped away (draw nothing)
16484084e3c215d4db6370422fc718217bade7445618Brian Paul */
16494084e3c215d4db6370422fc718217bade7445618Brian PaulGLboolean
1650f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_drawpixels(const struct gl_context *ctx,
16514084e3c215d4db6370422fc718217bade7445618Brian Paul                      GLint *destX, GLint *destY,
16524084e3c215d4db6370422fc718217bade7445618Brian Paul                      GLsizei *width, GLsizei *height,
16531ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul                      struct gl_pixelstore_attrib *unpack)
16544084e3c215d4db6370422fc718217bade7445618Brian Paul{
165531aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   const struct gl_framebuffer *buffer = ctx->DrawBuffer;
16564084e3c215d4db6370422fc718217bade7445618Brian Paul
16571ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   if (unpack->RowLength == 0) {
16581ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      unpack->RowLength = *width;
16591ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   }
16601ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul
166132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   ASSERT(ctx->Pixel.ZoomX == 1.0F);
166232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   ASSERT(ctx->Pixel.ZoomY == 1.0F || ctx->Pixel.ZoomY == -1.0F);
1663e677da9e54e836609f94a3aaca27d68a0bacbb96Brian Paul
16644084e3c215d4db6370422fc718217bade7445618Brian Paul   /* left clipping */
16654084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*destX < buffer->_Xmin) {
16661ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      unpack->SkipPixels += (buffer->_Xmin - *destX);
16674084e3c215d4db6370422fc718217bade7445618Brian Paul      *width -= (buffer->_Xmin - *destX);
16684084e3c215d4db6370422fc718217bade7445618Brian Paul      *destX = buffer->_Xmin;
16694084e3c215d4db6370422fc718217bade7445618Brian Paul   }
16704084e3c215d4db6370422fc718217bade7445618Brian Paul   /* right clipping */
16714084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*destX + *width > buffer->_Xmax)
16724084e3c215d4db6370422fc718217bade7445618Brian Paul      *width -= (*destX + *width - buffer->_Xmax);
16734084e3c215d4db6370422fc718217bade7445618Brian Paul
16744084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*width <= 0)
16754084e3c215d4db6370422fc718217bade7445618Brian Paul      return GL_FALSE;
16764084e3c215d4db6370422fc718217bade7445618Brian Paul
167732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   if (ctx->Pixel.ZoomY == 1.0F) {
167832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      /* bottom clipping */
167932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (*destY < buffer->_Ymin) {
168032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         unpack->SkipRows += (buffer->_Ymin - *destY);
168132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *height -= (buffer->_Ymin - *destY);
168232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *destY = buffer->_Ymin;
168332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
168432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      /* top clipping */
168532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (*destY + *height > buffer->_Ymax)
168632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *height -= (*destY + *height - buffer->_Ymax);
168732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   }
168832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul   else { /* upside down */
168932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      /* top clipping */
169032a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (*destY > buffer->_Ymax) {
169132a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         unpack->SkipRows += (*destY - buffer->_Ymax);
169232a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *height -= (*destY - buffer->_Ymax);
169332a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *destY = buffer->_Ymax;
169432a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      }
169532a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      /* bottom clipping */
169632a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      if (*destY - *height < buffer->_Ymin)
169732a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul         *height -= (buffer->_Ymin - (*destY - *height));
169832a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      /* adjust destY so it's the first row to write to */
169932a966dad9c5c6309adafcb58050cd0f70c32bdeBrian Paul      (*destY)--;
17004084e3c215d4db6370422fc718217bade7445618Brian Paul   }
17014084e3c215d4db6370422fc718217bade7445618Brian Paul
17024084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*height <= 0)
17037aeaca33c331f70d507fc83583b13b8d9fc3e847Ben Skeggs      return GL_FALSE;
17044084e3c215d4db6370422fc718217bade7445618Brian Paul
17054084e3c215d4db6370422fc718217bade7445618Brian Paul   return GL_TRUE;
17064084e3c215d4db6370422fc718217bade7445618Brian Paul}
17074084e3c215d4db6370422fc718217bade7445618Brian Paul
17084084e3c215d4db6370422fc718217bade7445618Brian Paul
17094084e3c215d4db6370422fc718217bade7445618Brian Paul/**
17104084e3c215d4db6370422fc718217bade7445618Brian Paul * Perform clipping for glReadPixels.  The image's window position
17111ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * and size, and the pack skipPixels, skipRows and rowLength are adjusted
17121ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * so that the image region is entirely within the window bounds.
17134084e3c215d4db6370422fc718217bade7445618Brian Paul * Note: this is different from _mesa_clip_drawpixels() in that the
17141ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * scissor box is ignored, and we use the bounds of the current readbuffer
17151ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * surface.
17164084e3c215d4db6370422fc718217bade7445618Brian Paul *
1717d44fbd3c9d976763ec1f4a8f0314f294be8c14f4Brian Paul * \return  GL_TRUE if region to read is in bounds
1718d44fbd3c9d976763ec1f4a8f0314f294be8c14f4Brian Paul *          GL_FALSE if region is completely out of bounds (nothing to read)
17194084e3c215d4db6370422fc718217bade7445618Brian Paul */
17204084e3c215d4db6370422fc718217bade7445618Brian PaulGLboolean
1721f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_readpixels(const struct gl_context *ctx,
17224084e3c215d4db6370422fc718217bade7445618Brian Paul                      GLint *srcX, GLint *srcY,
17234084e3c215d4db6370422fc718217bade7445618Brian Paul                      GLsizei *width, GLsizei *height,
17241ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul                      struct gl_pixelstore_attrib *pack)
17254084e3c215d4db6370422fc718217bade7445618Brian Paul{
172631aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   const struct gl_framebuffer *buffer = ctx->ReadBuffer;
17274084e3c215d4db6370422fc718217bade7445618Brian Paul
17281ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   if (pack->RowLength == 0) {
17291ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      pack->RowLength = *width;
17301ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul   }
17311ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul
17324084e3c215d4db6370422fc718217bade7445618Brian Paul   /* left clipping */
17334084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*srcX < 0) {
17341ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      pack->SkipPixels += (0 - *srcX);
17354084e3c215d4db6370422fc718217bade7445618Brian Paul      *width -= (0 - *srcX);
17364084e3c215d4db6370422fc718217bade7445618Brian Paul      *srcX = 0;
17374084e3c215d4db6370422fc718217bade7445618Brian Paul   }
17384084e3c215d4db6370422fc718217bade7445618Brian Paul   /* right clipping */
1739a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   if (*srcX + *width > (GLsizei) buffer->Width)
17404084e3c215d4db6370422fc718217bade7445618Brian Paul      *width -= (*srcX + *width - buffer->Width);
17414084e3c215d4db6370422fc718217bade7445618Brian Paul
17424084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*width <= 0)
17434084e3c215d4db6370422fc718217bade7445618Brian Paul      return GL_FALSE;
17444084e3c215d4db6370422fc718217bade7445618Brian Paul
17454084e3c215d4db6370422fc718217bade7445618Brian Paul   /* bottom clipping */
17464084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*srcY < 0) {
17471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul      pack->SkipRows += (0 - *srcY);
17484084e3c215d4db6370422fc718217bade7445618Brian Paul      *height -= (0 - *srcY);
17494084e3c215d4db6370422fc718217bade7445618Brian Paul      *srcY = 0;
17504084e3c215d4db6370422fc718217bade7445618Brian Paul   }
17514084e3c215d4db6370422fc718217bade7445618Brian Paul   /* top clipping */
1752a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul   if (*srcY + *height > (GLsizei) buffer->Height)
17534084e3c215d4db6370422fc718217bade7445618Brian Paul      *height -= (*srcY + *height - buffer->Height);
17544084e3c215d4db6370422fc718217bade7445618Brian Paul
17554084e3c215d4db6370422fc718217bade7445618Brian Paul   if (*height <= 0)
17567aeaca33c331f70d507fc83583b13b8d9fc3e847Ben Skeggs      return GL_FALSE;
17574084e3c215d4db6370422fc718217bade7445618Brian Paul
17584084e3c215d4db6370422fc718217bade7445618Brian Paul   return GL_TRUE;
17594084e3c215d4db6370422fc718217bade7445618Brian Paul}
17604084e3c215d4db6370422fc718217bade7445618Brian Paul
1761ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1762ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/**
176303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * Do clipping for a glCopyTexSubImage call.
176403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * The framebuffer source region might extend outside the framebuffer
176503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * bounds.  Clip the source region against the framebuffer bounds and
176603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * adjust the texture/dest position and size accordingly.
176703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul *
176803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul * \return GL_FALSE if region is totally clipped, GL_TRUE otherwise.
176903bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul */
177003bafd1f9fa000abdb794b2ae344a68840c83201Brian PaulGLboolean
1771f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_copytexsubimage(const struct gl_context *ctx,
177203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul                           GLint *destX, GLint *destY,
177303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul                           GLint *srcX, GLint *srcY,
177403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul                           GLsizei *width, GLsizei *height)
177503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul{
177603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul   const struct gl_framebuffer *fb = ctx->ReadBuffer;
177703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul   const GLint srcX0 = *srcX, srcY0 = *srcY;
177803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul
1779d01c44aacaeabe1dd187163f9e204f40401698bcEric Anholt   if (_mesa_clip_to_region(0, 0, fb->Width, fb->Height,
178003bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul                            srcX, srcY, width, height)) {
178103bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul      *destX = *destX + *srcX - srcX0;
178203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul      *destY = *destY + *srcY - srcY0;
178303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul
178403bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul      return GL_TRUE;
178503bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul   }
178603bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul   else {
178703bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul      return GL_FALSE;
178803bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul   }
178903bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul}
179003bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul
179103bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul
179203bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul
179303bafd1f9fa000abdb794b2ae344a68840c83201Brian Paul/**
1794ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Clip the rectangle defined by (x, y, width, height) against the bounds
1795ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * specified by [xmin, xmax) and [ymin, ymax).
1796ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * \return GL_FALSE if rect is totally clipped, GL_TRUE otherwise.
1797ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */
1798ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian PaulGLboolean
1799ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_mesa_clip_to_region(GLint xmin, GLint ymin,
1800ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     GLint xmax, GLint ymax,
1801ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     GLint *x, GLint *y,
1802ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul                     GLsizei *width, GLsizei *height )
1803ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{
1804ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   /* left clipping */
1805ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*x < xmin) {
1806ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      *width -= (xmin - *x);
1807ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      *x = xmin;
1808ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
1809ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1810ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   /* right clipping */
1811ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*x + *width > xmax)
1812aa09e0a1d532d0de2e094957d0509a7f60ebeafaEric Anholt      *width -= (*x + *width - xmax);
1813ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1814ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*width <= 0)
1815ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      return GL_FALSE;
1816ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1817ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   /* bottom (or top) clipping */
1818ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*y < ymin) {
1819ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      *height -= (ymin - *y);
1820ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      *y = ymin;
1821ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   }
1822ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1823ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   /* top (or bottom) clipping */
1824ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*y + *height > ymax)
1825aa09e0a1d532d0de2e094957d0509a7f60ebeafaEric Anholt      *height -= (*y + *height - ymax);
1826ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1827ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   if (*height <= 0)
1828ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul      return GL_FALSE;
1829ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul
1830ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul   return GL_TRUE;
1831ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul}
1832727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1833727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1834727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/**
1835727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Clip dst coords against Xmax (or Ymax).
1836727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */
18379520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void
1838727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paulclip_right_or_top(GLint *srcX0, GLint *srcX1,
1839727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                  GLint *dstX0, GLint *dstX1,
1840727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                  GLint maxValue)
1841727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{
1842727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   GLfloat t, bias;
1843727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1844727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstX1 > maxValue) {
1845727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* X1 outside right edge */
1846727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(*dstX0 < maxValue); /* X0 should be inside right edge */
1847727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      t = (GLfloat) (maxValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
1848727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* chop off [t, 1] part */
1849727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(t >= 0.0 && t <= 1.0);
1850727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *dstX1 = maxValue;
1851b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz      bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F;
1852727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *srcX1 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
1853727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   }
1854727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   else if (*dstX0 > maxValue) {
1855727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* X0 outside right edge */
1856727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(*dstX1 < maxValue); /* X1 should be inside right edge */
1857727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      t = (GLfloat) (maxValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
1858727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* chop off [t, 1] part */
1859727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(t >= 0.0 && t <= 1.0);
1860727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *dstX0 = maxValue;
1861b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz      bias = (*srcX0 < *srcX1) ? -0.5F : 0.5F;
1862727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *srcX0 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
1863727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   }
1864727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul}
1865727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1866727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1867727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/**
1868727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Clip dst coords against Xmin (or Ymin).
1869727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */
18709520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void
1871727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paulclip_left_or_bottom(GLint *srcX0, GLint *srcX1,
1872727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                    GLint *dstX0, GLint *dstX1,
1873727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                    GLint minValue)
1874727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{
1875727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   GLfloat t, bias;
1876727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1877727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstX0 < minValue) {
1878727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* X0 outside left edge */
1879727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(*dstX1 > minValue); /* X1 should be inside left edge */
1880727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      t = (GLfloat) (minValue - *dstX0) / (GLfloat) (*dstX1 - *dstX0);
1881727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* chop off [0, t] part */
1882727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(t >= 0.0 && t <= 1.0);
1883727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *dstX0 = minValue;
1884b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz      bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F; /* flipped??? */
1885727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *srcX0 = *srcX0 + (GLint) (t * (*srcX1 - *srcX0) + bias);
1886727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   }
1887727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   else if (*dstX1 < minValue) {
1888727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* X1 outside left edge */
1889727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(*dstX0 > minValue); /* X0 should be inside left edge */
1890727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      t = (GLfloat) (minValue - *dstX1) / (GLfloat) (*dstX0 - *dstX1);
1891727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      /* chop off [0, t] part */
1892727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      ASSERT(t >= 0.0 && t <= 1.0);
1893727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *dstX1 = minValue;
1894b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz      bias = (*srcX0 < *srcX1) ? 0.5F : -0.5F;
1895727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      *srcX1 = *srcX1 + (GLint) (t * (*srcX0 - *srcX1) + bias);
1896727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   }
1897727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul}
1898727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1899727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1900727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul/**
1901727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Do clipping of blit src/dest rectangles.
1902727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * The dest rect is clipped against both the buffer bounds and scissor bounds.
1903727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * The src rect is just clipped against the buffer bounds.
1904727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *
1905727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * When either the src or dest rect is clipped, the other is also clipped
1906727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * proportionately!
1907727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *
1908727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * Note that X0 need not be less than X1 (same for Y) for either the source
1909727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * and dest rects.  That makes the clipping a little trickier.
1910727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul *
1911727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul * \return GL_TRUE if anything is left to draw, GL_FALSE if totally clipped
1912727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul */
1913727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian PaulGLboolean
1914f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_clip_blit(struct gl_context *ctx,
1915727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
1916727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul                GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
1917727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul{
1918727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint srcXmin = 0;
1919727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint srcXmax = ctx->ReadBuffer->Width;
1920727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint srcYmin = 0;
1921727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint srcYmax = ctx->ReadBuffer->Height;
1922727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1923727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /* these include scissor bounds */
1924727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint dstXmin = ctx->DrawBuffer->_Xmin;
1925727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint dstXmax = ctx->DrawBuffer->_Xmax;
1926727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint dstYmin = ctx->DrawBuffer->_Ymin;
1927727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   const GLint dstYmax = ctx->DrawBuffer->_Ymax;
1928727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1929727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /*
1930727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
1931727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul          *srcX0, *srcX1, *dstX0, *dstX1);
1932727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   printf("PreClipY:  src: %d .. %d  dst: %d .. %d\n",
1933727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul          *srcY0, *srcY1, *dstY0, *dstY1);
1934727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   */
1935727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1936727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /* trivial rejection tests */
1937727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstX0 == *dstX1)
1938727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE; /* no width */
1939727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstX0 <= dstXmin && *dstX1 <= dstXmin)
1940727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE; /* totally out (left) of bounds */
1941727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstX0 >= dstXmax && *dstX1 >= dstXmax)
1942727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE; /* totally out (right) of bounds */
1943727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1944727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstY0 == *dstY1)
1945727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1946727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstY0 <= dstYmin && *dstY1 <= dstYmin)
1947727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1948727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*dstY0 >= dstYmax && *dstY1 >= dstYmax)
1949727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1950727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1951727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcX0 == *srcX1)
1952727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1953727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcX0 <= srcXmin && *srcX1 <= srcXmin)
1954727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1955727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcX0 >= srcXmax && *srcX1 >= srcXmax)
1956727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1957727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1958727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcY0 == *srcY1)
1959727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1960727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcY0 <= srcYmin && *srcY1 <= srcYmin)
1961727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1962727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   if (*srcY0 >= srcYmax && *srcY1 >= srcYmax)
1963727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul      return GL_FALSE;
1964727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1965727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /*
1966727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul    * dest clip
1967727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul    */
1968727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_right_or_top(srcX0, srcX1, dstX0, dstX1, dstXmax);
1969727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_right_or_top(srcY0, srcY1, dstY0, dstY1, dstYmax);
1970727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_left_or_bottom(srcX0, srcX1, dstX0, dstX1, dstXmin);
1971727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_left_or_bottom(srcY0, srcY1, dstY0, dstY1, dstYmin);
1972727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1973727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /*
1974727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul    * src clip (just swap src/dst values from above)
1975727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul    */
1976727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_right_or_top(dstX0, dstX1, srcX0, srcX1, srcXmax);
1977727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_right_or_top(dstY0, dstY1, srcY0, srcY1, srcYmax);
1978727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_left_or_bottom(dstX0, dstX1, srcX0, srcX1, srcXmin);
1979727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   clip_left_or_bottom(dstY0, dstY1, srcY0, srcY1, srcYmin);
1980727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1981727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   /*
1982727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   printf("PostClipX: src: %d .. %d  dst: %d .. %d\n",
1983727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul          *srcX0, *srcX1, *dstX0, *dstX1);
1984727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   printf("PostClipY: src: %d .. %d  dst: %d .. %d\n",
1985727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul          *srcY0, *srcY1, *dstY0, *dstY1);
1986727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   */
1987727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1988727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstX0 >= dstXmin);
1989727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstX0 <= dstXmax);
1990727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstX1 >= dstXmin);
1991727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstX1 <= dstXmax);
1992727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1993727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstY0 >= dstYmin);
1994727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstY0 <= dstYmax);
1995727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstY1 >= dstYmin);
1996727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*dstY1 <= dstYmax);
1997727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
1998727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcX0 >= srcXmin);
1999727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcX0 <= srcXmax);
2000727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcX1 >= srcXmin);
2001727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcX1 <= srcXmax);
2002727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
2003727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcY0 >= srcYmin);
2004727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcY0 <= srcYmax);
2005727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcY1 >= srcYmin);
2006727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   ASSERT(*srcY1 <= srcYmax);
2007727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul
2008727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul   return GL_TRUE;
2009727b2d747e13fed78bf62cfbf4a31427eed0ef29Brian Paul}
2010