Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
135 | giacomo | 1 | /* $Id: tmp_texformat.h,v 1.1 2003-04-24 14:24:01 giacomo Exp $ */ |
2 | |||
3 | /* |
||
4 | * Mesa 3-D graphics library |
||
5 | * Version: 4.1 |
||
6 | * |
||
7 | * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. |
||
8 | * |
||
9 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
10 | * copy of this software and associated documentation files (the "Software"), |
||
11 | * to deal in the Software without restriction, including without limitation |
||
12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
13 | * and/or sell copies of the Software, and to permit persons to whom the |
||
14 | * Software is furnished to do so, subject to the following conditions: |
||
15 | * |
||
16 | * The above copyright notice and this permission notice shall be included |
||
17 | * in all copies or substantial portions of the Software. |
||
18 | * |
||
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
20 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
22 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
23 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | * Authors: |
||
27 | * Gareth Hughes |
||
28 | * Brian Paul |
||
29 | */ |
||
30 | |||
31 | |||
32 | /* |
||
33 | * This template file generates texel fetch functions for 1-D, 2-D and 3-D |
||
34 | * texture images. |
||
35 | */ |
||
36 | |||
37 | |||
38 | #if DIM == 1 |
||
39 | |||
40 | #define CHAN_SRC( t, i, j, k, sz ) \ |
||
41 | ((GLchan *)(t)->Data + (i) * (sz)) |
||
42 | #define UBYTE_SRC( t, i, j, k, sz ) \ |
||
43 | ((GLubyte *)(t)->Data + (i) * (sz)) |
||
44 | #define USHORT_SRC( t, i, j, k ) \ |
||
45 | ((GLushort *)(t)->Data + (i)) |
||
46 | #define FLOAT_SRC( t, i, j, k ) \ |
||
47 | ((GLfloat *)(t)->Data + (i)) |
||
48 | |||
49 | #define FETCH(x) fetch_1d_texel_##x |
||
50 | |||
51 | #elif DIM == 2 |
||
52 | |||
53 | #define CHAN_SRC( t, i, j, k, sz ) \ |
||
54 | ((GLchan *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz)) |
||
55 | #define UBYTE_SRC( t, i, j, k, sz ) \ |
||
56 | ((GLubyte *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz)) |
||
57 | #define USHORT_SRC( t, i, j, k ) \ |
||
58 | ((GLushort *)(t)->Data + ((t)->RowStride * (j) + (i))) |
||
59 | #define FLOAT_SRC( t, i, j, k ) \ |
||
60 | ((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i))) |
||
61 | |||
62 | #define FETCH(x) fetch_2d_texel_##x |
||
63 | |||
64 | #elif DIM == 3 |
||
65 | |||
66 | #define CHAN_SRC( t, i, j, k, sz ) \ |
||
67 | (GLchan *)(t)->Data + (((t)->Height * (k) + (j)) * \ |
||
68 | (t)->RowStride + (i)) * (sz) |
||
69 | #define UBYTE_SRC( t, i, j, k, sz ) \ |
||
70 | ((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) * \ |
||
71 | (t)->RowStride + (i)) * (sz)) |
||
72 | #define USHORT_SRC( t, i, j, k ) \ |
||
73 | ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) * \ |
||
74 | (t)->RowStride + (i))) |
||
75 | #define FLOAT_SRC( t, i, j, k ) \ |
||
76 | ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) * \ |
||
77 | (t)->RowStride + (i))) |
||
78 | |||
79 | #define FETCH(x) fetch_3d_texel_##x |
||
80 | |||
81 | #else |
||
82 | #error illegal number of texture dimensions |
||
83 | #endif |
||
84 | |||
85 | |||
86 | static void FETCH(rgba)( const struct gl_texture_image *texImage, |
||
87 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
88 | { |
||
89 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 4 ); |
||
90 | GLchan *rgba = (GLchan *) texel; |
||
91 | COPY_CHAN4( rgba, src ); |
||
92 | } |
||
93 | |||
94 | static void FETCH(rgb)( const struct gl_texture_image *texImage, |
||
95 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
96 | { |
||
97 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 3 ); |
||
98 | GLchan *rgba = (GLchan *) texel; |
||
99 | rgba[RCOMP] = src[0]; |
||
100 | rgba[GCOMP] = src[1]; |
||
101 | rgba[BCOMP] = src[2]; |
||
102 | rgba[ACOMP] = CHAN_MAX; |
||
103 | } |
||
104 | |||
105 | static void FETCH(alpha)( const struct gl_texture_image *texImage, |
||
106 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
107 | { |
||
108 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 ); |
||
109 | GLchan *rgba = (GLchan *) texel; |
||
110 | rgba[RCOMP] = 0; |
||
111 | rgba[GCOMP] = 0; |
||
112 | rgba[BCOMP] = 0; |
||
113 | rgba[ACOMP] = src[0]; |
||
114 | } |
||
115 | |||
116 | static void FETCH(luminance)( const struct gl_texture_image *texImage, |
||
117 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
118 | { |
||
119 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 ); |
||
120 | GLchan *rgba = (GLchan *) texel; |
||
121 | rgba[RCOMP] = src[0]; |
||
122 | rgba[GCOMP] = src[0]; |
||
123 | rgba[BCOMP] = src[0]; |
||
124 | rgba[ACOMP] = CHAN_MAX; |
||
125 | } |
||
126 | |||
127 | static void FETCH(luminance_alpha)( const struct gl_texture_image *texImage, |
||
128 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
129 | { |
||
130 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 2 ); |
||
131 | GLchan *rgba = (GLchan *) texel; |
||
132 | rgba[RCOMP] = src[0]; |
||
133 | rgba[GCOMP] = src[0]; |
||
134 | rgba[BCOMP] = src[0]; |
||
135 | rgba[ACOMP] = src[1]; |
||
136 | } |
||
137 | |||
138 | static void FETCH(intensity)( const struct gl_texture_image *texImage, |
||
139 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
140 | { |
||
141 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 ); |
||
142 | GLchan *rgba = (GLchan *) texel; |
||
143 | rgba[RCOMP] = src[0]; |
||
144 | rgba[GCOMP] = src[0]; |
||
145 | rgba[BCOMP] = src[0]; |
||
146 | rgba[ACOMP] = src[0]; |
||
147 | } |
||
148 | |||
149 | static void FETCH(color_index)( const struct gl_texture_image *texImage, |
||
150 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
151 | { |
||
152 | const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 ); |
||
153 | GLchan *index = (GLchan *) texel; |
||
154 | *index = *src; |
||
155 | } |
||
156 | |||
157 | static void FETCH(depth_component)( const struct gl_texture_image *texImage, |
||
158 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
159 | { |
||
160 | const GLfloat *src = FLOAT_SRC( texImage, i, j, k ); |
||
161 | GLfloat *depth = (GLfloat *) texel; |
||
162 | *depth = *src; |
||
163 | } |
||
164 | |||
165 | static void FETCH(rgba8888)( const struct gl_texture_image *texImage, |
||
166 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
167 | { |
||
168 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 ); |
||
169 | GLchan *rgba = (GLchan *) texel; |
||
170 | rgba[RCOMP] = UBYTE_TO_CHAN( src[3] ); |
||
171 | rgba[GCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
172 | rgba[BCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
173 | rgba[ACOMP] = UBYTE_TO_CHAN( src[0] ); |
||
174 | } |
||
175 | |||
176 | static void FETCH(argb8888)( const struct gl_texture_image *texImage, |
||
177 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
178 | { |
||
179 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 ); |
||
180 | GLchan *rgba = (GLchan *) texel; |
||
181 | rgba[RCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
182 | rgba[GCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
183 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
184 | rgba[ACOMP] = UBYTE_TO_CHAN( src[3] ); |
||
185 | } |
||
186 | |||
187 | static void FETCH(rgb888)( const struct gl_texture_image *texImage, |
||
188 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
189 | { |
||
190 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 ); |
||
191 | GLchan *rgba = (GLchan *) texel; |
||
192 | rgba[RCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
193 | rgba[GCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
194 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
195 | rgba[ACOMP] = CHAN_MAX; |
||
196 | } |
||
197 | |||
198 | static void FETCH(rgb565)( const struct gl_texture_image *texImage, |
||
199 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
200 | { |
||
201 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
202 | const GLushort s = *src; |
||
203 | GLchan *rgba = (GLchan *) texel; |
||
204 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 ); |
||
205 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc ); |
||
206 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 ); |
||
207 | rgba[ACOMP] = CHAN_MAX; |
||
208 | } |
||
209 | |||
210 | static void FETCH(argb4444)( const struct gl_texture_image *texImage, |
||
211 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
212 | { |
||
213 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
214 | const GLushort s = *src; |
||
215 | GLchan *rgba = (GLchan *) texel; |
||
216 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf ); |
||
217 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf ); |
||
218 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf ); |
||
219 | rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf ); |
||
220 | } |
||
221 | |||
222 | static void FETCH(argb1555)( const struct gl_texture_image *texImage, |
||
223 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
224 | { |
||
225 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
226 | const GLushort s = *src; |
||
227 | GLchan *rgba = (GLchan *) texel; |
||
228 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f ); |
||
229 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f ); |
||
230 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f ); |
||
231 | rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 ); |
||
232 | } |
||
233 | |||
234 | static void FETCH(al88)( const struct gl_texture_image *texImage, |
||
235 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
236 | { |
||
237 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 ); |
||
238 | GLchan *rgba = (GLchan *) texel; |
||
239 | rgba[RCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
240 | rgba[GCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
241 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
242 | rgba[ACOMP] = UBYTE_TO_CHAN( src[1] ); |
||
243 | } |
||
244 | |||
245 | static void FETCH(rgb332)( const struct gl_texture_image *texImage, |
||
246 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
247 | { |
||
248 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
249 | const GLubyte s = *src; |
||
250 | GLchan *rgba = (GLchan *) texel; |
||
251 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 ); |
||
252 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 ); |
||
253 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 ); |
||
254 | rgba[ACOMP] = CHAN_MAX; |
||
255 | } |
||
256 | |||
257 | static void FETCH(a8)( const struct gl_texture_image *texImage, |
||
258 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
259 | { |
||
260 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
261 | GLchan *rgba = (GLchan *) texel; |
||
262 | rgba[RCOMP] = 0; |
||
263 | rgba[GCOMP] = 0; |
||
264 | rgba[BCOMP] = 0; |
||
265 | rgba[ACOMP] = UBYTE_TO_CHAN( src[0] ); |
||
266 | } |
||
267 | |||
268 | static void FETCH(l8)( const struct gl_texture_image *texImage, |
||
269 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
270 | { |
||
271 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
272 | GLchan *rgba = (GLchan *) texel; |
||
273 | rgba[RCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
274 | rgba[GCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
275 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
276 | rgba[ACOMP] = CHAN_MAX; |
||
277 | } |
||
278 | |||
279 | static void FETCH(i8)( const struct gl_texture_image *texImage, |
||
280 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
281 | { |
||
282 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
283 | GLchan *rgba = (GLchan *) texel; |
||
284 | rgba[RCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
285 | rgba[GCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
286 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
287 | rgba[ACOMP] = UBYTE_TO_CHAN( src[0] ); |
||
288 | } |
||
289 | |||
290 | static void FETCH(ci8)( const struct gl_texture_image *texImage, |
||
291 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
292 | { |
||
293 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
294 | GLchan *index = (GLchan *) texel; |
||
295 | *index = UBYTE_TO_CHAN( *src ); |
||
296 | } |
||
297 | |||
298 | /* XXX this may break if GLchan != GLubyte */ |
||
299 | static void FETCH(ycbcr)( const struct gl_texture_image *texImage, |
||
300 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
301 | { |
||
302 | const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */ |
||
303 | const GLushort *src1 = src0 + 1; /* odd */ |
||
304 | const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */ |
||
305 | const GLubyte cb = *src0 & 0xff; /* chroma U */ |
||
306 | const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */ |
||
307 | const GLubyte cr = *src1 & 0xff; /* chroma V */ |
||
308 | GLchan *rgba = (GLchan *) texel; |
||
309 | GLint r, g, b; |
||
310 | if (i & 1) { |
||
311 | /* odd pixel: use y1,cr,cb */ |
||
312 | r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128)); |
||
313 | g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128)); |
||
314 | b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128)); |
||
315 | } |
||
316 | else { |
||
317 | /* even pixel: use y0,cr,cb */ |
||
318 | r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128)); |
||
319 | g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128)); |
||
320 | b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128)); |
||
321 | } |
||
322 | rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX); |
||
323 | rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX); |
||
324 | rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX); |
||
325 | rgba[ACOMP] = CHAN_MAX; |
||
326 | } |
||
327 | |||
328 | /* XXX this may break if GLchan != GLubyte */ |
||
329 | static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage, |
||
330 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
331 | { |
||
332 | const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */ |
||
333 | const GLushort *src1 = src0 + 1; /* odd */ |
||
334 | const GLubyte y0 = *src0 & 0xff; /* luminance */ |
||
335 | const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma U */ |
||
336 | const GLubyte y1 = *src1 & 0xff; /* luminance */ |
||
337 | const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma V */ |
||
338 | GLchan *rgba = (GLchan *) texel; |
||
339 | GLint r, g, b; |
||
340 | if (i & 1) { |
||
341 | /* odd pixel: use y1,cr,cb */ |
||
342 | r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128)); |
||
343 | g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128)); |
||
344 | b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128)); |
||
345 | } |
||
346 | else { |
||
347 | /* even pixel: use y0,cr,cb */ |
||
348 | r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128)); |
||
349 | g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128)); |
||
350 | b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128)); |
||
351 | } |
||
352 | rgba[RCOMP] = CLAMP(r, 0, CHAN_MAX); |
||
353 | rgba[GCOMP] = CLAMP(g, 0, CHAN_MAX); |
||
354 | rgba[BCOMP] = CLAMP(b, 0, CHAN_MAX); |
||
355 | rgba[ACOMP] = CHAN_MAX; |
||
356 | } |
||
357 | |||
358 | |||
359 | /* big-endian */ |
||
360 | |||
361 | #if 0 |
||
362 | static void FETCH(abgr8888)( const struct gl_texture_image *texImage, |
||
363 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
364 | { |
||
365 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 ); |
||
366 | GLchan *rgba = (GLchan *) texel; |
||
367 | rgba[RCOMP] = UBYTE_TO_CHAN( src[3] ); |
||
368 | rgba[GCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
369 | rgba[BCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
370 | rgba[ACOMP] = UBYTE_TO_CHAN( src[0] ); |
||
371 | } |
||
372 | |||
373 | static void FETCH(bgra8888)( const struct gl_texture_image *texImage, |
||
374 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
375 | { |
||
376 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 ); |
||
377 | GLchan *rgba = (GLchan *) texel; |
||
378 | rgba[RCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
379 | rgba[GCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
380 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
381 | rgba[ACOMP] = UBYTE_TO_CHAN( src[3] ); |
||
382 | } |
||
383 | |||
384 | static void FETCH(bgr888)( const struct gl_texture_image *texImage, |
||
385 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
386 | { |
||
387 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 ); |
||
388 | GLchan *rgba = (GLchan *) texel; |
||
389 | rgba[RCOMP] = UBYTE_TO_CHAN( src[2] ); |
||
390 | rgba[GCOMP] = UBYTE_TO_CHAN( src[1] ); |
||
391 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
392 | rgba[ACOMP] = CHAN_MAX; |
||
393 | } |
||
394 | |||
395 | static void FETCH(bgr565)( const struct gl_texture_image *texImage, |
||
396 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
397 | { |
||
398 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
399 | const GLushort s = *src; |
||
400 | GLchan *rgba = (GLchan *) texel; |
||
401 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 ); |
||
402 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc ); |
||
403 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 ); |
||
404 | rgba[ACOMP] = CHAN_MAX; |
||
405 | } |
||
406 | |||
407 | static void FETCH(bgra4444)( const struct gl_texture_image *texImage, |
||
408 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
409 | { |
||
410 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
411 | const GLushort s = *src; |
||
412 | GLchan *rgba = (GLchan *) texel; |
||
413 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf ); |
||
414 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf ); |
||
415 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf ); |
||
416 | rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf ); |
||
417 | } |
||
418 | |||
419 | static void FETCH(bgra5551)( const struct gl_texture_image *texImage, |
||
420 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
421 | { |
||
422 | const GLushort *src = USHORT_SRC( texImage, i, j, k ); |
||
423 | const GLushort s = *src; |
||
424 | GLchan *rgba = (GLchan *) texel; |
||
425 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f ); |
||
426 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f ); |
||
427 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f ); |
||
428 | rgba[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 ); |
||
429 | } |
||
430 | |||
431 | static void FETCH(la88)( const struct gl_texture_image *texImage, |
||
432 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
433 | { |
||
434 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 ); |
||
435 | GLchan *rgba = (GLchan *) texel; |
||
436 | rgba[RCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
437 | rgba[GCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
438 | rgba[BCOMP] = UBYTE_TO_CHAN( src[0] ); |
||
439 | rgba[ACOMP] = UBYTE_TO_CHAN( src[1] ); |
||
440 | } |
||
441 | |||
442 | static void FETCH(bgr233)( const struct gl_texture_image *texImage, |
||
443 | GLint i, GLint j, GLint k, GLvoid *texel ) |
||
444 | { |
||
445 | const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 ); |
||
446 | const GLubyte s = *src; |
||
447 | GLchan *rgba = (GLchan *) texel; |
||
448 | rgba[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 ); |
||
449 | rgba[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 ); |
||
450 | rgba[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 ); |
||
451 | rgba[ACOMP] = CHAN_MAX; |
||
452 | } |
||
453 | #endif |
||
454 | |||
455 | |||
456 | #undef CHAN_SRC |
||
457 | #undef UBYTE_SRC |
||
458 | #undef USHORT_SRC |
||
459 | #undef FLOAT_SRC |
||
460 | #undef FETCH |
||
461 | #undef DIM |