blob: a42e448e4603e96528346c903f5f4c879c467083 [file] [log] [blame]
Adam Jacksoncb3610e2004-10-25 21:09:16 +00001/* $XFree86: xc/lib/GL/glx/compsize.c,v 1.6 2004/01/28 18:11:38 alanh Exp $ */
2/*
3** License Applicability. Except to the extent portions of this file are
4** made subject to an alternative license as permitted in the SGI Free
5** Software License B, Version 1.1 (the "License"), the contents of this
6** file are subject only to the provisions of the License. You may not use
7** this file except in compliance with the License. You may obtain a copy
8** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
9** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
10**
11** http://oss.sgi.com/projects/FreeB
12**
13** Note that, as provided in the License, the Software is distributed on an
14** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
15** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
16** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
17** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
18**
19** Original Code. The Original Code is: OpenGL Sample Implementation,
20** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
21** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
22** Copyright in any portions created by third parties is as indicated
23** elsewhere herein. All Rights Reserved.
24**
25** Additional Notice Provisions: The application programming interfaces
26** established by SGI in conjunction with the Original Code are The
27** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
28** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
29** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
30** Window System(R) (Version 1.3), released October 19, 1998. This software
31** was created using the OpenGL(R) version 1.2.1 Sample Implementation
32** published by SGI, but has not been independently verified as being
33** compliant with the OpenGL(R) version 1.2.1 Specification.
34**
35*/
36
37#include <GL/gl.h>
38#include "glxclient.h"
39#include "size.h"
40
41/*
42** Return the number of elements per group of a specified format
43*/
44GLint __glElementsPerGroup(GLenum format, GLenum type)
45{
46 /*
47 ** To make row length computation valid for image extraction,
48 ** packed pixel types assume elements per group equals one.
49 */
50 switch(type) {
51 case GL_UNSIGNED_BYTE_3_3_2:
52 case GL_UNSIGNED_BYTE_2_3_3_REV:
53 case GL_UNSIGNED_SHORT_5_6_5:
54 case GL_UNSIGNED_SHORT_5_6_5_REV:
55 case GL_UNSIGNED_SHORT_4_4_4_4:
56 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
57 case GL_UNSIGNED_SHORT_5_5_5_1:
58 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
59 case GL_UNSIGNED_SHORT_8_8_APPLE:
60 case GL_UNSIGNED_SHORT_8_8_REV_APPLE:
61 case GL_UNSIGNED_SHORT_15_1_MESA:
62 case GL_UNSIGNED_SHORT_1_15_REV_MESA:
63 case GL_UNSIGNED_INT_8_8_8_8:
64 case GL_UNSIGNED_INT_8_8_8_8_REV:
65 case GL_UNSIGNED_INT_10_10_10_2:
66 case GL_UNSIGNED_INT_2_10_10_10_REV:
67 case GL_UNSIGNED_INT_24_8_NV:
68 case GL_UNSIGNED_INT_24_8_MESA:
69 case GL_UNSIGNED_INT_8_24_REV_MESA:
70 return 1;
71 default:
72 break;
73 }
74
75 switch(format) {
76 case GL_RGB:
77 case GL_BGR:
78 return 3;
79 case GL_422_EXT:
80 case GL_422_REV_EXT:
81 case GL_422_AVERAGE_EXT:
82 case GL_422_REV_AVERAGE_EXT:
83 case GL_YCBCR_422_APPLE:
84 case GL_LUMINANCE_ALPHA:
85 return 2;
86 case GL_RGBA:
87 case GL_BGRA:
88 case GL_ABGR_EXT:
89 return 4;
90 case GL_COLOR_INDEX:
91 case GL_STENCIL_INDEX:
92 case GL_DEPTH_COMPONENT:
93 case GL_RED:
94 case GL_GREEN:
95 case GL_BLUE:
96 case GL_ALPHA:
97 case GL_LUMINANCE:
98 case GL_INTENSITY:
99 return 1;
100 default:
101 return 0;
102 }
103}
104
105/*
106** Return the number of bytes per element, based on the element type (other
107** than GL_BITMAP).
108*/
109GLint __glBytesPerElement(GLenum type)
110{
111 switch(type) {
112 case GL_UNSIGNED_SHORT:
113 case GL_SHORT:
114 case GL_UNSIGNED_SHORT_5_6_5:
115 case GL_UNSIGNED_SHORT_5_6_5_REV:
116 case GL_UNSIGNED_SHORT_4_4_4_4:
117 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
118 case GL_UNSIGNED_SHORT_5_5_5_1:
119 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
120 case GL_UNSIGNED_SHORT_8_8_APPLE:
121 case GL_UNSIGNED_SHORT_8_8_REV_APPLE:
122 case GL_UNSIGNED_SHORT_15_1_MESA:
123 case GL_UNSIGNED_SHORT_1_15_REV_MESA:
124 return 2;
125 case GL_UNSIGNED_BYTE:
126 case GL_BYTE:
127 case GL_UNSIGNED_BYTE_3_3_2:
128 case GL_UNSIGNED_BYTE_2_3_3_REV:
129 return 1;
130 case GL_INT:
131 case GL_UNSIGNED_INT:
132 case GL_FLOAT:
133 case GL_UNSIGNED_INT_8_8_8_8:
134 case GL_UNSIGNED_INT_8_8_8_8_REV:
135 case GL_UNSIGNED_INT_10_10_10_2:
136 case GL_UNSIGNED_INT_2_10_10_10_REV:
137 case GL_UNSIGNED_INT_24_8_NV:
138 case GL_UNSIGNED_INT_24_8_MESA:
139 case GL_UNSIGNED_INT_8_24_REV_MESA:
140 return 4;
141 default:
142 return 0;
143 }
144}
145
146/*
147** Compute memory required for internal packed array of data of given type
148** and format.
149*/
150GLint __glImageSize(GLsizei width, GLsizei height, GLsizei depth,
151 GLenum format, GLenum type)
152{
153 int bytes_per_row;
154 int components;
155
156 if (width < 0 || height < 0 || depth < 0) {
157 return 0;
158 }
159 /*
160 ** Zero is returned if either format or type are invalid.
161 */
162 components = __glElementsPerGroup(format,type);
163 if (type == GL_BITMAP) {
164 if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) {
165 bytes_per_row = (width + 7) >> 3;
166 } else {
167 return 0;
168 }
169 } else {
170 bytes_per_row = __glBytesPerElement(type) * width;
171 }
172 return bytes_per_row * height * depth * components;
173}
174
175GLint __glFogiv_size(GLenum pname)
176{
177 switch (pname) {
178 case GL_FOG_COLOR: return 4;
179 case GL_FOG_DENSITY: return 1;
180 case GL_FOG_END: return 1;
181 case GL_FOG_MODE: return 1;
182 case GL_FOG_INDEX: return 1;
183 case GL_FOG_START: return 1;
184 case GL_FOG_DISTANCE_MODE_NV: return 1;
185 case GL_FOG_OFFSET_VALUE_SGIX: return 1;
186 default:
187 return 0;
188 }
189}
190
191GLint __glFogfv_size(GLenum pname)
192{
193 return __glFogiv_size(pname);
194}
195
196GLint __glCallLists_size(GLsizei n, GLenum type)
197{
198 GLint size;
199
200 if (n < 0) return 0;
201 switch (type) {
202 case GL_BYTE: size = 1; break;
203 case GL_UNSIGNED_BYTE: size = 1; break;
204 case GL_SHORT: size = 2; break;
205 case GL_UNSIGNED_SHORT: size = 2; break;
206 case GL_INT: size = 4; break;
207 case GL_UNSIGNED_INT: size = 4; break;
208 case GL_FLOAT: size = 4; break;
209 case GL_2_BYTES: size = 2; break;
210 case GL_3_BYTES: size = 3; break;
211 case GL_4_BYTES: size = 4; break;
212 default:
213 return 0;
214 }
215 return n * size;
216}
217
218GLint __glDrawPixels_size(GLenum format, GLenum type, GLsizei w, GLsizei h)
219{
220 return __glImageSize( w, h, 1, format, type );
221}
222
223GLint __glBitmap_size(GLsizei w, GLsizei h)
224{
225 return __glDrawPixels_size(GL_COLOR_INDEX, GL_BITMAP, w, h);
226}
227
228GLint __glTexGendv_size(GLenum e)
229{
230 switch (e) {
231 case GL_TEXTURE_GEN_MODE:
232 return 1;
233 case GL_OBJECT_PLANE:
234 case GL_EYE_PLANE:
235 return 4;
236 default:
237 return 0;
238 }
239}
240
241GLint __glTexGenfv_size(GLenum e)
242{
243 return __glTexGendv_size(e);
244}
245
246GLint __glTexGeniv_size(GLenum e)
247{
248 return __glTexGendv_size(e);
249}
250
251GLint __glTexParameterfv_size(GLenum e)
252{
253 switch (e) {
254 case GL_TEXTURE_WRAP_S:
255 case GL_TEXTURE_WRAP_T:
256 case GL_TEXTURE_WRAP_R:
257 case GL_TEXTURE_MIN_FILTER:
258 case GL_TEXTURE_MAG_FILTER:
259 case GL_TEXTURE_PRIORITY:
260 case GL_TEXTURE_RESIDENT:
261
262 /* GL_SGIS_texture_lod / GL_EXT_texture_lod / GL 1.2 */
263 case GL_TEXTURE_MIN_LOD:
264 case GL_TEXTURE_MAX_LOD:
265 case GL_TEXTURE_BASE_LEVEL:
266 case GL_TEXTURE_MAX_LEVEL:
267
268 /* GL_SGIX_texture_lod_bias */
269 case GL_TEXTURE_LOD_BIAS_S_SGIX:
270 case GL_TEXTURE_LOD_BIAS_T_SGIX:
271 case GL_TEXTURE_LOD_BIAS_R_SGIX:
272
273 /* GL_ARB_shadow / GL 1.4 */
274 case GL_TEXTURE_COMPARE_MODE:
275 case GL_TEXTURE_COMPARE_FUNC:
276
277 /* GL_SGIS_generate_mipmap / GL 1.4 */
278 case GL_GENERATE_MIPMAP:
279
280 /* GL_ARB_depth_texture / GL 1.4 */
281 case GL_DEPTH_TEXTURE_MODE:
282
283 /* GL_EXT_texture_lod_bias / GL 1.4 */
284 case GL_TEXTURE_LOD_BIAS:
285
286 /* GL_SGIX_shadow_ambient / GL_ARB_shadow_ambient */
287 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
288
289 /* GL_SGIX_shadow */
290 case GL_TEXTURE_COMPARE_SGIX:
291 case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
292
293 /* GL_SGIX_texture_coordinate_clamp */
294 case GL_TEXTURE_MAX_CLAMP_S_SGIX:
295 case GL_TEXTURE_MAX_CLAMP_T_SGIX:
296 case GL_TEXTURE_MAX_CLAMP_R_SGIX:
297
298 /* GL_EXT_texture_filter_anisotropic */
299 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
300
301 /* GL_NV_texture_expand_normal */
302 case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
303 return 1;
304
305 /* GL_SGIX_clipmap */
306 case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
307 case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
308 return 2;
309
310 /* GL_SGIX_clipmap */
311 case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
312 return 3;
313
314 case GL_TEXTURE_BORDER_COLOR:
315
316 /* GL_SGIX_texture_scale_bias */
317 case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
318 case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
319 return 4;
320
321 default:
322 return 0;
323 }
324}
325
326GLint __glTexParameteriv_size(GLenum e)
327{
328 return __glTexParameterfv_size(e);
329}
330
331GLint __glTexEnvfv_size(GLenum e)
332{
333 switch (e) {
334 case GL_TEXTURE_ENV_MODE:
335
336 /* GL_ARB_texture_env_combine / GL_EXT_texture_env_combine / GL 1.3 */
337 case GL_COMBINE_RGB:
338 case GL_COMBINE_ALPHA:
339 case GL_SOURCE0_RGB:
340 case GL_SOURCE1_RGB:
341 case GL_SOURCE2_RGB:
342 case GL_SOURCE0_ALPHA:
343 case GL_SOURCE1_ALPHA:
344 case GL_SOURCE2_ALPHA:
345 case GL_OPERAND0_RGB:
346 case GL_OPERAND1_RGB:
347 case GL_OPERAND0_ALPHA:
348 case GL_OPERAND1_ALPHA:
349 case GL_OPERAND2_RGB:
350 case GL_OPERAND2_ALPHA:
351 case GL_RGB_SCALE:
352 case GL_ALPHA_SCALE:
353
354 /* GL_EXT_texture_lod_bias / GL 1.4 */
355 case GL_TEXTURE_LOD_BIAS:
356
357 /* GL_ARB_point_sprite / GL_NV_point_sprite */
358 case GL_COORD_REPLACE_ARB:
359
360 /* GL_NV_texture_env_combine4 */
361 case GL_SOURCE3_RGB_NV:
362 case GL_SOURCE3_ALPHA_NV:
363 case GL_OPERAND3_RGB_NV:
364 case GL_OPERAND3_ALPHA_NV:
365 return 1;
366
367 case GL_TEXTURE_ENV_COLOR:
368 return 4;
369
370 default:
371 return 0;
372 }
373}
374
375GLint __glTexEnviv_size(GLenum e)
376{
377 return __glTexEnvfv_size(e);
378}
379
380GLint __glTexImage1D_size(GLenum format, GLenum type, GLsizei w)
381{
382 return __glImageSize( w, 1, 1, format, type );
383}
384
385GLint __glTexImage2D_size(GLenum format, GLenum type, GLsizei w, GLsizei h)
386{
387 return __glImageSize( w, h, 1, format, type );
388}
389
390GLint __glTexImage3D_size(GLenum format, GLenum type, GLsizei w, GLsizei h,
391 GLsizei d)
392{
393 return __glImageSize( w, h, d, format, type );
394}
395
396GLint __glLightfv_size(GLenum pname)
397{
398 switch (pname) {
399 case GL_SPOT_EXPONENT: return 1;
400 case GL_SPOT_CUTOFF: return 1;
401 case GL_AMBIENT: return 4;
402 case GL_DIFFUSE: return 4;
403 case GL_SPECULAR: return 4;
404 case GL_POSITION: return 4;
405 case GL_SPOT_DIRECTION: return 3;
406 case GL_CONSTANT_ATTENUATION: return 1;
407 case GL_LINEAR_ATTENUATION: return 1;
408 case GL_QUADRATIC_ATTENUATION: return 1;
409 default:
410 return 0;
411 }
412}
413
414GLint __glLightiv_size(GLenum pname)
415{
416 return __glLightfv_size(pname);
417}
418
419GLint __glLightModelfv_size(GLenum pname)
420{
421 switch (pname) {
422 case GL_LIGHT_MODEL_AMBIENT: return 4;
423 case GL_LIGHT_MODEL_LOCAL_VIEWER: return 1;
424 case GL_LIGHT_MODEL_TWO_SIDE: return 1;
425 case GL_LIGHT_MODEL_COLOR_CONTROL: return 1;
426 default:
427 return 0;
428 }
429}
430
431GLint __glLightModeliv_size(GLenum pname)
432{
433 return __glLightModelfv_size(pname);
434}
435
436GLint __glMaterialfv_size(GLenum pname)
437{
438 switch (pname) {
439 case GL_SHININESS: return 1;
440 case GL_EMISSION: return 4;
441 case GL_AMBIENT: return 4;
442 case GL_DIFFUSE: return 4;
443 case GL_SPECULAR: return 4;
444 case GL_AMBIENT_AND_DIFFUSE: return 4;
445 case GL_COLOR_INDEXES: return 3;
446 default:
447 return 0;
448 }
449}
450
451GLint __glMaterialiv_size(GLenum pname)
452{
453 return __glMaterialfv_size(pname);
454}
455
456GLint __glColorTableParameterfv_size(GLenum pname)
457{
458 switch (pname) {
459 case GL_COLOR_TABLE_FORMAT:
460 case GL_COLOR_TABLE_WIDTH:
461 case GL_COLOR_TABLE_RED_SIZE:
462 case GL_COLOR_TABLE_GREEN_SIZE:
463 case GL_COLOR_TABLE_BLUE_SIZE:
464 case GL_COLOR_TABLE_ALPHA_SIZE:
465 case GL_COLOR_TABLE_LUMINANCE_SIZE:
466 case GL_COLOR_TABLE_INTENSITY_SIZE:
467 return 1;
468 case GL_COLOR_TABLE_SCALE:
469 case GL_COLOR_TABLE_BIAS:
470 return 4;
471 default:
472 return -1;
473 }
474}
475
476GLint __glColorTableParameteriv_size(GLenum pname)
477{
478 return __glColorTableParameterfv_size(pname);
479}
480
481GLint __glConvolutionParameterfv_size(GLenum pname)
482{
483 switch(pname) {
484 case GL_CONVOLUTION_BORDER_MODE:
485 return 1;
486 case GL_CONVOLUTION_BORDER_COLOR:
487 case GL_CONVOLUTION_FILTER_SCALE:
488 case GL_CONVOLUTION_FILTER_BIAS:
489 return 4;
490 default: /* error: bad enum value */
491 return -1;
492 }
493}
494
495GLint __glConvolutionParameteriv_size(GLenum pname)
496{
497 return __glConvolutionParameterfv_size(pname);
498}
499
500GLint __glPointParameterfvARB_size(GLenum e)
501{
502 switch (e) {
503 case GL_POINT_SIZE_MIN:
504 case GL_POINT_SIZE_MAX:
505 case GL_POINT_FADE_THRESHOLD_SIZE:
506
507 /* GL_NV_point_sprite */
508 case GL_POINT_SPRITE_R_MODE_NV:
509 return 1;
510
511 case GL_POINT_DISTANCE_ATTENUATION:
512 return 3;
513
514 default:
515 return -1;
516 }
517}
518
519GLint __glPointParameteriv_size(GLenum e)
520{
521 return __glPointParameterfvARB_size(e);
522}