1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include <GL/gl.h>
9*61046927SAndroid Build Coastguard Worker #include "glxclient.h"
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker /*
12*61046927SAndroid Build Coastguard Worker ** Return the number of elements per group of a specified format
13*61046927SAndroid Build Coastguard Worker */
14*61046927SAndroid Build Coastguard Worker GLint
__glElementsPerGroup(GLenum format,GLenum type)15*61046927SAndroid Build Coastguard Worker __glElementsPerGroup(GLenum format, GLenum type)
16*61046927SAndroid Build Coastguard Worker {
17*61046927SAndroid Build Coastguard Worker /*
18*61046927SAndroid Build Coastguard Worker ** To make row length computation valid for image extraction,
19*61046927SAndroid Build Coastguard Worker ** packed pixel types assume elements per group equals one.
20*61046927SAndroid Build Coastguard Worker */
21*61046927SAndroid Build Coastguard Worker switch (type) {
22*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE_3_3_2:
23*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE_2_3_3_REV:
24*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_6_5:
25*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_6_5_REV:
26*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_4_4_4_4:
27*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_4_4_4_4_REV:
28*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_5_5_1:
29*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_1_5_5_5_REV:
30*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_8_8_APPLE:
31*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_8_8_REV_APPLE:
32*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_8_8_8_8:
33*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_8_8_8_8_REV:
34*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_10_10_10_2:
35*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_2_10_10_10_REV:
36*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_24_8_NV:
37*61046927SAndroid Build Coastguard Worker return 1;
38*61046927SAndroid Build Coastguard Worker default:
39*61046927SAndroid Build Coastguard Worker break;
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker switch (format) {
43*61046927SAndroid Build Coastguard Worker case GL_RGB:
44*61046927SAndroid Build Coastguard Worker case GL_BGR:
45*61046927SAndroid Build Coastguard Worker case GL_RGB_INTEGER_EXT:
46*61046927SAndroid Build Coastguard Worker case GL_BGR_INTEGER_EXT:
47*61046927SAndroid Build Coastguard Worker return 3;
48*61046927SAndroid Build Coastguard Worker case GL_RG:
49*61046927SAndroid Build Coastguard Worker case GL_422_EXT:
50*61046927SAndroid Build Coastguard Worker case GL_422_REV_EXT:
51*61046927SAndroid Build Coastguard Worker case GL_422_AVERAGE_EXT:
52*61046927SAndroid Build Coastguard Worker case GL_422_REV_AVERAGE_EXT:
53*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_NV:
54*61046927SAndroid Build Coastguard Worker case GL_YCBCR_422_APPLE:
55*61046927SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
56*61046927SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA_INTEGER_EXT:
57*61046927SAndroid Build Coastguard Worker return 2;
58*61046927SAndroid Build Coastguard Worker case GL_RGBA:
59*61046927SAndroid Build Coastguard Worker case GL_BGRA:
60*61046927SAndroid Build Coastguard Worker case GL_ABGR_EXT:
61*61046927SAndroid Build Coastguard Worker case GL_RGBA_INTEGER_EXT:
62*61046927SAndroid Build Coastguard Worker case GL_BGRA_INTEGER_EXT:
63*61046927SAndroid Build Coastguard Worker return 4;
64*61046927SAndroid Build Coastguard Worker case GL_COLOR_INDEX:
65*61046927SAndroid Build Coastguard Worker case GL_STENCIL_INDEX:
66*61046927SAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT:
67*61046927SAndroid Build Coastguard Worker case GL_RED:
68*61046927SAndroid Build Coastguard Worker case GL_GREEN:
69*61046927SAndroid Build Coastguard Worker case GL_BLUE:
70*61046927SAndroid Build Coastguard Worker case GL_ALPHA:
71*61046927SAndroid Build Coastguard Worker case GL_LUMINANCE:
72*61046927SAndroid Build Coastguard Worker case GL_INTENSITY:
73*61046927SAndroid Build Coastguard Worker case GL_RED_INTEGER_EXT:
74*61046927SAndroid Build Coastguard Worker case GL_GREEN_INTEGER_EXT:
75*61046927SAndroid Build Coastguard Worker case GL_BLUE_INTEGER_EXT:
76*61046927SAndroid Build Coastguard Worker case GL_ALPHA_INTEGER_EXT:
77*61046927SAndroid Build Coastguard Worker case GL_LUMINANCE_INTEGER_EXT:
78*61046927SAndroid Build Coastguard Worker return 1;
79*61046927SAndroid Build Coastguard Worker default:
80*61046927SAndroid Build Coastguard Worker return 0;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker /*
85*61046927SAndroid Build Coastguard Worker ** Return the number of bytes per element, based on the element type (other
86*61046927SAndroid Build Coastguard Worker ** than GL_BITMAP).
87*61046927SAndroid Build Coastguard Worker */
88*61046927SAndroid Build Coastguard Worker GLint
__glBytesPerElement(GLenum type)89*61046927SAndroid Build Coastguard Worker __glBytesPerElement(GLenum type)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker switch (type) {
92*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT:
93*61046927SAndroid Build Coastguard Worker case GL_SHORT:
94*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_6_5:
95*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_6_5_REV:
96*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_4_4_4_4:
97*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_4_4_4_4_REV:
98*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_5_5_5_1:
99*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_1_5_5_5_REV:
100*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_8_8_APPLE:
101*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_SHORT_8_8_REV_APPLE:
102*61046927SAndroid Build Coastguard Worker return 2;
103*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE:
104*61046927SAndroid Build Coastguard Worker case GL_BYTE:
105*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE_3_3_2:
106*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_BYTE_2_3_3_REV:
107*61046927SAndroid Build Coastguard Worker return 1;
108*61046927SAndroid Build Coastguard Worker case GL_INT:
109*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT:
110*61046927SAndroid Build Coastguard Worker case GL_FLOAT:
111*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_8_8_8_8:
112*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_8_8_8_8_REV:
113*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_10_10_10_2:
114*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_2_10_10_10_REV:
115*61046927SAndroid Build Coastguard Worker case GL_UNSIGNED_INT_24_8_NV:
116*61046927SAndroid Build Coastguard Worker return 4;
117*61046927SAndroid Build Coastguard Worker default:
118*61046927SAndroid Build Coastguard Worker return 0;
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Worker /*
123*61046927SAndroid Build Coastguard Worker ** Compute memory required for internal packed array of data of given type
124*61046927SAndroid Build Coastguard Worker ** and format.
125*61046927SAndroid Build Coastguard Worker */
126*61046927SAndroid Build Coastguard Worker GLint
__glImageSize(GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,GLenum target)127*61046927SAndroid Build Coastguard Worker __glImageSize(GLsizei width, GLsizei height, GLsizei depth,
128*61046927SAndroid Build Coastguard Worker GLenum format, GLenum type, GLenum target)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker int bytes_per_row;
131*61046927SAndroid Build Coastguard Worker int components;
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker switch (target) {
134*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_1D:
135*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_2D:
136*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_3D:
137*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_4D_SGIS:
138*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_CUBE_MAP:
139*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_RECTANGLE_ARB:
140*61046927SAndroid Build Coastguard Worker case GL_PROXY_HISTOGRAM:
141*61046927SAndroid Build Coastguard Worker case GL_PROXY_COLOR_TABLE:
142*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_COLOR_TABLE_SGI:
143*61046927SAndroid Build Coastguard Worker case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE:
144*61046927SAndroid Build Coastguard Worker case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE:
145*61046927SAndroid Build Coastguard Worker case GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP:
146*61046927SAndroid Build Coastguard Worker return 0;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker if (width < 0 || height < 0 || depth < 0) {
150*61046927SAndroid Build Coastguard Worker return 0;
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker /*
154*61046927SAndroid Build Coastguard Worker ** Zero is returned if either format or type are invalid.
155*61046927SAndroid Build Coastguard Worker */
156*61046927SAndroid Build Coastguard Worker components = __glElementsPerGroup(format, type);
157*61046927SAndroid Build Coastguard Worker if (type == GL_BITMAP) {
158*61046927SAndroid Build Coastguard Worker if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) {
159*61046927SAndroid Build Coastguard Worker bytes_per_row = (width + 7) >> 3;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker else {
162*61046927SAndroid Build Coastguard Worker return 0;
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker }
165*61046927SAndroid Build Coastguard Worker else {
166*61046927SAndroid Build Coastguard Worker bytes_per_row = __glBytesPerElement(type) * width;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker return bytes_per_row * height * depth * components;
170*61046927SAndroid Build Coastguard Worker }
171