1 /* $Id: colortab.c,v 1.6 1997/10/16 02:26:18 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 2.5
6 * Copyright (C) 1995-1997 Brian Paul
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23
24 /*
25 * $Log: colortab.c,v $
26 * Revision 1.6 1997/10/16 02:26:18 brianp
27 * call Driver.UpdateTexturePalette(ctx,NULL) when shared palette changed
28 *
29 * Revision 1.5 1997/10/16 01:59:08 brianp
30 * added GL_EXT_shared_texture_palette extension
31 *
32 * Revision 1.4 1997/10/15 23:37:05 brianp
33 * removed dirty flag stuff
34 *
35 * Revision 1.3 1997/10/13 23:50:03 brianp
36 * added call to Driver.UpdateTexturePalette
37 *
38 * Revision 1.2 1997/09/29 23:27:44 brianp
39 * updated for new device driver texture functions
40 *
41 * Revision 1.1 1997/09/27 00:12:46 brianp
42 * Initial revision
43 *
44 */
45
46
47 #ifdef PC_HEADER
48 #include "all.h"
49 #else
50 #include "colortab.h"
51 #include "context.h"
52 #include "macros.h"
53 #endif
54
55
56
57 /*
58 * Return GL_TRUE if k is a power of two, else return GL_FALSE.
59 */
power_of_two(GLint k)60 static GLboolean power_of_two( GLint k )
61 {
62 GLint i, m = 1;
63 for (i=0; i<32; i++) {
64 if (k == m)
65 return GL_TRUE;
66 m = m << 1;
67 }
68 return GL_FALSE;
69 }
70
71
decode_internal_format(GLint format)72 static GLint decode_internal_format( GLint format )
73 {
74 switch (format) {
75 case GL_ALPHA:
76 case GL_ALPHA4:
77 case GL_ALPHA8:
78 case GL_ALPHA12:
79 case GL_ALPHA16:
80 return GL_ALPHA;
81 case 1:
82 case GL_LUMINANCE:
83 case GL_LUMINANCE4:
84 case GL_LUMINANCE8:
85 case GL_LUMINANCE12:
86 case GL_LUMINANCE16:
87 return GL_LUMINANCE;
88 case 2:
89 case GL_LUMINANCE_ALPHA:
90 case GL_LUMINANCE4_ALPHA4:
91 case GL_LUMINANCE6_ALPHA2:
92 case GL_LUMINANCE8_ALPHA8:
93 case GL_LUMINANCE12_ALPHA4:
94 case GL_LUMINANCE12_ALPHA12:
95 case GL_LUMINANCE16_ALPHA16:
96 return GL_LUMINANCE_ALPHA;
97 case GL_INTENSITY:
98 case GL_INTENSITY4:
99 case GL_INTENSITY8:
100 case GL_INTENSITY12:
101 case GL_INTENSITY16:
102 return GL_INTENSITY;
103 case 3:
104 case GL_RGB:
105 case GL_R3_G3_B2:
106 case GL_RGB4:
107 case GL_RGB5:
108 case GL_RGB8:
109 case GL_RGB10:
110 case GL_RGB12:
111 case GL_RGB16:
112 return GL_RGB;
113 case 4:
114 case GL_RGBA:
115 case GL_RGBA2:
116 case GL_RGBA4:
117 case GL_RGB5_A1:
118 case GL_RGBA8:
119 case GL_RGB10_A2:
120 case GL_RGBA12:
121 case GL_RGBA16:
122 return GL_RGBA;
123 default:
124 return -1; /* error */
125 }
126 }
127
128
gl_ColorTable(GLcontext * ctx,GLenum target,GLenum internalFormat,struct gl_image * table)129 void gl_ColorTable( GLcontext *ctx, GLenum target,
130 GLenum internalFormat, struct gl_image *table )
131 {
132 struct gl_texture_object *texObj;
133 GLboolean proxy = GL_FALSE;
134
135 if (INSIDE_BEGIN_END(ctx)) {
136 gl_error( ctx, GL_INVALID_OPERATION, "glGetBooleanv" );
137 return;
138 }
139
140 switch (target) {
141 case GL_TEXTURE_1D:
142 texObj = ctx->Texture.Current1D;
143 break;
144 case GL_TEXTURE_2D:
145 texObj = ctx->Texture.Current2D;
146 break;
147 case GL_PROXY_TEXTURE_1D:
148 texObj = ctx->Texture.Proxy1D;
149 proxy = GL_TRUE;
150 break;
151 case GL_PROXY_TEXTURE_2D:
152 texObj = ctx->Texture.Proxy2D;
153 proxy = GL_TRUE;
154 break;
155 default:
156 gl_error(ctx, GL_INVALID_ENUM, "glColorTableEXT(target)");
157 return;
158 }
159
160 /* internalformat = just like glTexImage */
161
162 if (table->Width < 1 || table->Width > MAX_TEXTURE_PALETTE_SIZE
163 || !power_of_two(table->Width)) {
164 gl_error(ctx, GL_INVALID_VALUE, "glColorTableEXT(width)");
165 if (proxy) {
166 texObj->PaletteSize = 0;
167 texObj->PaletteIntFormat = 0;
168 texObj->PaletteFormat = 0;
169 }
170 return;
171 }
172
173 /* per-texture object palette */
174 texObj->PaletteSize = table->Width;
175 texObj->PaletteIntFormat = internalFormat;
176 texObj->PaletteFormat = decode_internal_format(internalFormat);
177 if (!proxy) {
178 MEMCPY(texObj->Palette, table->Data, table->Width*table->Components);
179 if (ctx->Driver.UpdateTexturePalette) {
180 (*ctx->Driver.UpdateTexturePalette)( ctx, texObj );
181 }
182 }
183 }
184
185
186
gl_ColorSubTable(GLcontext * ctx,GLenum target,GLsizei start,struct gl_image * data)187 void gl_ColorSubTable( GLcontext *ctx, GLenum target,
188 GLsizei start, struct gl_image *data )
189 {
190 /* XXX TODO */
191 gl_problem(ctx, "glColorSubTableEXT not implemented");
192 }
193
194
195
gl_GetColorTable(GLcontext * ctx,GLenum target,GLenum format,GLenum type,GLvoid * table)196 void gl_GetColorTable( GLcontext *ctx, GLenum target, GLenum format,
197 GLenum type, GLvoid *table )
198 {
199 if (INSIDE_BEGIN_END(ctx)) {
200 gl_error( ctx, GL_INVALID_OPERATION, "glGetBooleanv" );
201 return;
202 }
203
204 switch (target) {
205 case GL_TEXTURE_1D:
206 break;
207 case GL_TEXTURE_2D:
208 break;
209 case GL_TEXTURE_3D_EXT:
210 break;
211 default:
212 gl_error(ctx, GL_INVALID_ENUM, "glGetColorTableEXT(target)");
213 return;
214 }
215
216 gl_problem(ctx, "glGetColorTableEXT not implemented!");
217 }
218
219
220
gl_GetColorTableParameterfv(GLcontext * ctx,GLenum target,GLenum pname,GLfloat * params)221 void gl_GetColorTableParameterfv( GLcontext *ctx, GLenum target,
222 GLenum pname, GLfloat *params )
223 {
224 GLint iparams[10];
225
226 gl_GetColorTableParameteriv( ctx, target, pname, iparams );
227 *params = (GLfloat) iparams[0];
228 }
229
230
231
gl_GetColorTableParameteriv(GLcontext * ctx,GLenum target,GLenum pname,GLint * params)232 void gl_GetColorTableParameteriv( GLcontext *ctx, GLenum target,
233 GLenum pname, GLint *params )
234 {
235 struct gl_texture_object *texObj;
236
237 if (INSIDE_BEGIN_END(ctx)) {
238 gl_error( ctx, GL_INVALID_OPERATION, "glGetColorTableParameter" );
239 return;
240 }
241
242 switch (target) {
243 case GL_TEXTURE_1D:
244 texObj = ctx->Texture.Current1D;
245 break;
246 case GL_TEXTURE_2D:
247 texObj = ctx->Texture.Current2D;
248 break;
249 default:
250 gl_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameter(target)");
251 return;
252 }
253
254 switch (pname) {
255 case GL_COLOR_TABLE_FORMAT_EXT:
256 if (texObj)
257 *params = texObj->PaletteIntFormat;
258 break;
259 case GL_COLOR_TABLE_WIDTH_EXT:
260 if (texObj)
261 *params = texObj->PaletteSize;
262 break;
263 case GL_COLOR_TABLE_RED_SIZE_EXT:
264 *params = 8;
265 break;
266 case GL_COLOR_TABLE_GREEN_SIZE_EXT:
267 *params = 8;
268 break;
269 case GL_COLOR_TABLE_BLUE_SIZE_EXT:
270 *params = 8;
271 break;
272 case GL_COLOR_TABLE_ALPHA_SIZE_EXT:
273 *params = 8;
274 break;
275 case GL_COLOR_TABLE_LUMINANCE_SIZE_EXT:
276 *params = 8;
277 break;
278 case GL_COLOR_TABLE_INTENSITY_SIZE_EXT:
279 *params = 8;
280 break;
281 default:
282 gl_error(ctx, GL_INVALID_ENUM, "glGetColorTableParameter" );
283 return;
284 }
285 }
286
287
288