Removed the old teximage code.
[mesa.git] / src / mesa / main / texformat_tmp.h
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.1
4 *
5 * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26 /**
27 * \file texformat_tmp.h
28 * Texel fetch functions template.
29 *
30 * This template file is used by texformat.c to generate texel fetch functions
31 * for 1-D, 2-D and 3-D texture images.
32 *
33 * It should be expanded by defining \p DIM as the number texture dimensions
34 * (1, 2 or 3). According to the value of \p DIM a series of macros is defined
35 * for the texel lookup in the gl_texture_image::Data.
36 *
37 * \sa texformat.c and FetchTexel.
38 *
39 * \author Gareth Hughes
40 * \author Brian Paul
41 */
42
43
44 #if DIM == 1
45
46 #define CHAN_SRC( t, i, j, k, sz ) \
47 ((GLchan *)(t)->Data + (i) * (sz))
48 #define UBYTE_SRC( t, i, j, k, sz ) \
49 ((GLubyte *)(t)->Data + (i) * (sz))
50 #define USHORT_SRC( t, i, j, k ) \
51 ((GLushort *)(t)->Data + (i))
52 #define FLOAT_SRC( t, i, j, k, sz ) \
53 ((GLfloat *)(t)->Data + (i) * (sz))
54 #define HALF_SRC( t, i, j, k, sz ) \
55 ((GLhalfARB *)(t)->Data + (i) * (sz))
56
57 #define FETCH(x) fetch_texel_1d_##x
58
59 #elif DIM == 2
60
61 #define CHAN_SRC( t, i, j, k, sz ) \
62 ((GLchan *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
63 #define UBYTE_SRC( t, i, j, k, sz ) \
64 ((GLubyte *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
65 #define USHORT_SRC( t, i, j, k ) \
66 ((GLushort *)(t)->Data + ((t)->RowStride * (j) + (i)))
67 #define FLOAT_SRC( t, i, j, k, sz ) \
68 ((GLfloat *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
69 #define HALF_SRC( t, i, j, k, sz ) \
70 ((GLhalfARB *)(t)->Data + ((t)->RowStride * (j) + (i)) * (sz))
71
72 #define FETCH(x) fetch_texel_2d_##x
73
74 #elif DIM == 3
75
76 #define CHAN_SRC( t, i, j, k, sz ) \
77 (GLchan *)(t)->Data + (((t)->Height * (k) + (j)) * \
78 (t)->RowStride + (i)) * (sz)
79 #define UBYTE_SRC( t, i, j, k, sz ) \
80 ((GLubyte *)(t)->Data + (((t)->Height * (k) + (j)) * \
81 (t)->RowStride + (i)) * (sz))
82 #define USHORT_SRC( t, i, j, k ) \
83 ((GLushort *)(t)->Data + (((t)->Height * (k) + (j)) * \
84 (t)->RowStride + (i)))
85 #define FLOAT_SRC( t, i, j, k, sz ) \
86 ((GLfloat *)(t)->Data + (((t)->Height * (k) + (j)) * \
87 (t)->RowStride + (i)) * (sz))
88 #define HALF_SRC( t, i, j, k, sz ) \
89 ((GLhalfARB *)(t)->Data + (((t)->Height * (k) + (j)) * \
90 (t)->RowStride + (i)) * (sz))
91
92 #define FETCH(x) fetch_texel_3d_##x
93
94 #else
95 #error illegal number of texture dimensions
96 #endif
97
98
99 /* Fetch color texel from 1D, 2D or 3D RGBA texture, returning 4 GLchans */
100 static void FETCH(rgba)( const struct gl_texture_image *texImage,
101 GLint i, GLint j, GLint k, GLchan *texel )
102 {
103 const GLchan *src = CHAN_SRC( texImage, i, j, k, 4 );
104 COPY_CHAN4( texel, src );
105 }
106
107 /* Fetch color texel from 1D, 2D or 3D RGBA texture, returning 4 GLfloats */
108 static void FETCH(f_rgba)( const struct gl_texture_image *texImage,
109 GLint i, GLint j, GLint k, GLfloat *texel )
110 {
111 const GLchan *src = CHAN_SRC( texImage, i, j, k, 4 );
112 texel[RCOMP] = CHAN_TO_FLOAT(src[0]);
113 texel[GCOMP] = CHAN_TO_FLOAT(src[1]);
114 texel[BCOMP] = CHAN_TO_FLOAT(src[2]);
115 texel[ACOMP] = CHAN_TO_FLOAT(src[3]);
116 }
117
118
119 /* Fetch color texel from 1D, 2D or 3D RGB texture, returning 4 GLchans */
120 static void FETCH(rgb)( const struct gl_texture_image *texImage,
121 GLint i, GLint j, GLint k, GLchan *texel )
122 {
123 const GLchan *src = CHAN_SRC( texImage, i, j, k, 3 );
124 texel[RCOMP] = src[0];
125 texel[GCOMP] = src[1];
126 texel[BCOMP] = src[2];
127 texel[ACOMP] = CHAN_MAX;
128 }
129
130 /* Fetch color texel from 1D, 2D or 3D RGB texture, returning 4 GLfloats */
131 static void FETCH(f_rgb)( const struct gl_texture_image *texImage,
132 GLint i, GLint j, GLint k, GLfloat *texel )
133 {
134 const GLchan *src = CHAN_SRC( texImage, i, j, k, 3 );
135 texel[RCOMP] = CHAN_TO_FLOAT(src[0]);
136 texel[GCOMP] = CHAN_TO_FLOAT(src[1]);
137 texel[BCOMP] = CHAN_TO_FLOAT(src[2]);
138 texel[ACOMP] = CHAN_MAXF;
139 }
140
141 /* Fetch color texel from 1D, 2D or 3D ALPHA texture, returning 4 GLchans */
142 static void FETCH(alpha)( const struct gl_texture_image *texImage,
143 GLint i, GLint j, GLint k, GLchan *texel )
144 {
145 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
146 texel[RCOMP] =
147 texel[GCOMP] =
148 texel[BCOMP] = 0;
149 texel[ACOMP] = src[0];
150 }
151
152 /* Fetch color texel from 1D, 2D or 3D ALPHA texture, returning 4 GLfloats */
153 static void FETCH(f_alpha)( const struct gl_texture_image *texImage,
154 GLint i, GLint j, GLint k, GLfloat *texel )
155 {
156 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
157 texel[RCOMP] =
158 texel[GCOMP] =
159 texel[BCOMP] = 0.0;
160 texel[ACOMP] = CHAN_TO_FLOAT(src[0]);
161 }
162
163 /* Fetch color texel from 1D, 2D or 3D LUMIN texture, returning 4 GLchans */
164 static void FETCH(luminance)( const struct gl_texture_image *texImage,
165 GLint i, GLint j, GLint k, GLchan *texel )
166 {
167 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
168 texel[RCOMP] =
169 texel[GCOMP] =
170 texel[BCOMP] = src[0];
171 texel[ACOMP] = CHAN_MAX;
172 }
173
174 /* Fetch color texel from 1D, 2D or 3D LUMIN texture, returning 4 GLchans */
175 static void FETCH(f_luminance)( const struct gl_texture_image *texImage,
176 GLint i, GLint j, GLint k, GLfloat *texel )
177 {
178 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
179 texel[RCOMP] =
180 texel[GCOMP] =
181 texel[BCOMP] = CHAN_TO_FLOAT(src[0]);
182 texel[ACOMP] = CHAN_MAXF;
183 }
184
185 /* Fetch color texel from 1D, 2D or 3D L_A texture, returning 4 GLchans */
186 static void FETCH(luminance_alpha)( const struct gl_texture_image *texImage,
187 GLint i, GLint j, GLint k, GLchan *texel )
188 {
189 const GLchan *src = CHAN_SRC( texImage, i, j, k, 2 );
190 texel[RCOMP] = src[0];
191 texel[GCOMP] = src[0];
192 texel[BCOMP] = src[0];
193 texel[ACOMP] = src[1];
194 }
195
196 /* Fetch color texel from 1D, 2D or 3D L_A texture, returning 4 GLfloats */
197 static void FETCH(f_luminance_alpha)( const struct gl_texture_image *texImage,
198 GLint i, GLint j, GLint k, GLfloat *texel )
199 {
200 const GLchan *src = CHAN_SRC( texImage, i, j, k, 2 );
201 texel[RCOMP] =
202 texel[GCOMP] =
203 texel[BCOMP] = CHAN_TO_FLOAT(src[0]);
204 texel[ACOMP] = CHAN_TO_FLOAT(src[1]);
205 }
206
207
208 /* Fetch color texel from 1D, 2D or 3D INT. texture, returning 4 GLchans */
209 static void FETCH(intensity)( const struct gl_texture_image *texImage,
210 GLint i, GLint j, GLint k, GLchan *texel )
211 {
212 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
213 texel[RCOMP] = src[0];
214 texel[GCOMP] = src[0];
215 texel[BCOMP] = src[0];
216 texel[ACOMP] = src[0];
217 }
218
219 /* Fetch color texel from 1D, 2D or 3D INT. texture, returning 4 GLfloats */
220 static void FETCH(f_intensity)( const struct gl_texture_image *texImage,
221 GLint i, GLint j, GLint k, GLfloat *texel )
222 {
223 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
224 texel[RCOMP] =
225 texel[GCOMP] =
226 texel[BCOMP] =
227 texel[ACOMP] = CHAN_TO_FLOAT(src[0]);
228 }
229
230
231 /* Fetch CI texel from 1D, 2D or 3D CI texture, returning 1 GLchan */
232 static void FETCH(color_index)( const struct gl_texture_image *texImage,
233 GLint i, GLint j, GLint k, GLchan *texel )
234 {
235 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
236 texel[0] = src[0];
237 }
238
239 /* Fetch CI texel from 1D, 2D or 3D CI texture, returning 1 GLfloat */
240 static void FETCH(f_color_index)( const struct gl_texture_image *texImage,
241 GLint i, GLint j, GLint k, GLfloat *texel )
242 {
243 const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
244 texel[0] = (GLfloat) src[0];
245 }
246
247
248 /* Fetch depth texel from 1D, 2D or 3D float32 DEPTH texture,
249 * returning 1 GLfloat.
250 * Note: no GLchan version of this function.
251 */
252 static void FETCH(f_depth_component_f32)( const struct gl_texture_image *texImage,
253 GLint i, GLint j, GLint k, GLfloat *texel )
254 {
255 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
256 texel[0] = src[0];
257 }
258
259
260 /* Fetch depth texel from 1D, 2D or 3D float32 DEPTH texture,
261 * returning 1 GLfloat.
262 * Note: no GLchan version of this function.
263 */
264 static void FETCH(f_depth_component16)( const struct gl_texture_image *texImage,
265 GLint i, GLint j, GLint k, GLfloat *texel )
266 {
267 const GLushort *src = USHORT_SRC( texImage, i, j, k );
268 texel[0] = src[0] * (1.0F / 65535.0F);
269 }
270
271
272 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT32 texture,
273 * returning 4 GLchans.
274 */
275 static void FETCH(rgba_f32)( const struct gl_texture_image *texImage,
276 GLint i, GLint j, GLint k, GLchan *texel )
277 {
278 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 4 );
279 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], src[0]);
280 UNCLAMPED_FLOAT_TO_CHAN(texel[GCOMP], src[1]);
281 UNCLAMPED_FLOAT_TO_CHAN(texel[BCOMP], src[2]);
282 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], src[3]);
283 }
284
285 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT32 texture,
286 * returning 4 GLfloats.
287 */
288 static void FETCH(f_rgba_f32)( const struct gl_texture_image *texImage,
289 GLint i, GLint j, GLint k, GLfloat *texel )
290 {
291 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 4 );
292 texel[RCOMP] = src[0];
293 texel[GCOMP] = src[1];
294 texel[BCOMP] = src[2];
295 texel[ACOMP] = src[3];
296 }
297
298 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
299 * returning 4 GLchans.
300 */
301 static void FETCH(rgba_f16)( const struct gl_texture_image *texImage,
302 GLint i, GLint j, GLint k, GLchan *texel )
303 {
304 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 4 );
305 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], _mesa_half_to_float(src[0]));
306 UNCLAMPED_FLOAT_TO_CHAN(texel[GCOMP], _mesa_half_to_float(src[1]));
307 UNCLAMPED_FLOAT_TO_CHAN(texel[BCOMP], _mesa_half_to_float(src[2]));
308 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], _mesa_half_to_float(src[3]));
309 }
310
311 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
312 * returning 4 GLfloats.
313 */
314 static void FETCH(f_rgba_f16)( const struct gl_texture_image *texImage,
315 GLint i, GLint j, GLint k, GLfloat *texel )
316 {
317 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 4 );
318 texel[RCOMP] = _mesa_half_to_float(src[0]);
319 texel[GCOMP] = _mesa_half_to_float(src[1]);
320 texel[BCOMP] = _mesa_half_to_float(src[2]);
321 texel[ACOMP] = _mesa_half_to_float(src[3]);
322 }
323
324 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT32 texture,
325 * returning 4 GLchans.
326 */
327 static void FETCH(rgb_f32)( const struct gl_texture_image *texImage,
328 GLint i, GLint j, GLint k, GLchan *texel )
329 {
330 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 3 );
331 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], src[0]);
332 UNCLAMPED_FLOAT_TO_CHAN(texel[GCOMP], src[1]);
333 UNCLAMPED_FLOAT_TO_CHAN(texel[BCOMP], src[2]);
334 texel[ACOMP] = CHAN_MAX;
335 }
336
337 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT32 texture,
338 * returning 4 GLfloats.
339 */
340 static void FETCH(f_rgb_f32)( const struct gl_texture_image *texImage,
341 GLint i, GLint j, GLint k, GLfloat *texel )
342 {
343 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 3 );
344 texel[RCOMP] = src[0];
345 texel[GCOMP] = src[1];
346 texel[BCOMP] = src[2];
347 texel[ACOMP] = CHAN_MAXF;
348 }
349
350 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
351 * returning 4 GLchans.
352 */
353 static void FETCH(rgb_f16)( const struct gl_texture_image *texImage,
354 GLint i, GLint j, GLint k, GLchan *texel )
355 {
356 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 3 );
357 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], _mesa_half_to_float(src[0]));
358 UNCLAMPED_FLOAT_TO_CHAN(texel[GCOMP], _mesa_half_to_float(src[1]));
359 UNCLAMPED_FLOAT_TO_CHAN(texel[BCOMP], _mesa_half_to_float(src[2]));
360 texel[ACOMP] = CHAN_MAX;
361 }
362
363 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT16 texture,
364 * returning 4 GLfloats.
365 */
366 static void FETCH(f_rgb_f16)( const struct gl_texture_image *texImage,
367 GLint i, GLint j, GLint k, GLfloat *texel )
368 {
369 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 3 );
370 texel[RCOMP] = _mesa_half_to_float(src[0]);
371 texel[GCOMP] = _mesa_half_to_float(src[1]);
372 texel[BCOMP] = _mesa_half_to_float(src[2]);
373 texel[ACOMP] = CHAN_MAXF;
374 }
375
376 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
377 * returning 4 GLchans.
378 */
379 static void FETCH(alpha_f32)( const struct gl_texture_image *texImage,
380 GLint i, GLint j, GLint k, GLchan *texel )
381 {
382 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
383 texel[RCOMP] =
384 texel[GCOMP] =
385 texel[BCOMP] = 0;
386 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], src[0]);
387 }
388
389 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
390 * returning 4 GLfloats.
391 */
392 static void FETCH(f_alpha_f32)( const struct gl_texture_image *texImage,
393 GLint i, GLint j, GLint k, GLfloat *texel )
394 {
395 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
396 texel[RCOMP] =
397 texel[GCOMP] =
398 texel[BCOMP] = 0.0F;
399 texel[ACOMP] = src[0];
400 }
401
402 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
403 * returning 4 GLchans.
404 */
405 static void FETCH(alpha_f16)( const struct gl_texture_image *texImage,
406 GLint i, GLint j, GLint k, GLchan *texel )
407 {
408 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
409 texel[RCOMP] =
410 texel[GCOMP] =
411 texel[BCOMP] = 0;
412 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], _mesa_half_to_float(src[0]));
413 }
414
415 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
416 * returning 4 GLfloats.
417 */
418 static void FETCH(f_alpha_f16)( const struct gl_texture_image *texImage,
419 GLint i, GLint j, GLint k, GLfloat *texel )
420 {
421 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
422 texel[RCOMP] =
423 texel[GCOMP] =
424 texel[BCOMP] = 0.0F;
425 texel[ACOMP] = _mesa_half_to_float(src[0]);
426 }
427
428 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
429 * returning 4 GLchans.
430 */
431 static void FETCH(luminance_f32)( const struct gl_texture_image *texImage,
432 GLint i, GLint j, GLint k, GLchan *texel )
433 {
434 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
435 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], src[0]);
436 texel[GCOMP] =
437 texel[BCOMP] = texel[RCOMP];
438 texel[ACOMP] = CHAN_MAX;
439 }
440
441 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
442 * returning 4 GLfloats.
443 */
444 static void FETCH(f_luminance_f32)( const struct gl_texture_image *texImage,
445 GLint i, GLint j, GLint k, GLfloat *texel )
446 {
447 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
448 texel[RCOMP] =
449 texel[GCOMP] =
450 texel[BCOMP] = src[0];
451 texel[ACOMP] = CHAN_MAXF;
452 }
453
454 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
455 * returning 4 GLchans.
456 */
457 static void FETCH(luminance_f16)( const struct gl_texture_image *texImage,
458 GLint i, GLint j, GLint k, GLchan *texel )
459 {
460 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
461 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], _mesa_half_to_float(src[0]));
462 texel[GCOMP] =
463 texel[BCOMP] = texel[RCOMP];
464 texel[ACOMP] = CHAN_MAX;
465 }
466
467 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
468 * returning 4 GLfloats.
469 */
470 static void FETCH(f_luminance_f16)( const struct gl_texture_image *texImage,
471 GLint i, GLint j, GLint k, GLfloat *texel )
472 {
473 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
474 texel[RCOMP] =
475 texel[GCOMP] =
476 texel[BCOMP] = _mesa_half_to_float(src[0]);
477 texel[ACOMP] = CHAN_MAXF;
478 }
479
480 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
481 * returning 4 GLchans.
482 */
483 static void FETCH(luminance_alpha_f32)( const struct gl_texture_image *texImage,
484 GLint i, GLint j, GLint k, GLchan *texel )
485 {
486 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 2 );
487 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], src[0]);
488 texel[GCOMP] =
489 texel[BCOMP] = texel[RCOMP];
490 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], src[1]);
491 }
492
493 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
494 * returning 4 GLfloats.
495 */
496 static void FETCH(f_luminance_alpha_f32)( const struct gl_texture_image *texImage,
497 GLint i, GLint j, GLint k, GLfloat *texel )
498 {
499 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 2 );
500 texel[RCOMP] =
501 texel[GCOMP] =
502 texel[BCOMP] = src[0];
503 texel[ACOMP] = src[1];
504 }
505
506 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
507 * returning 4 GLfloats.
508 */
509 static void FETCH(luminance_alpha_f16)( const struct gl_texture_image *texImage,
510 GLint i, GLint j, GLint k, GLchan *texel )
511 {
512 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 2 );
513 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], _mesa_half_to_float(src[0]));
514 texel[GCOMP] =
515 texel[BCOMP] = texel[RCOMP];
516 UNCLAMPED_FLOAT_TO_CHAN(texel[ACOMP], _mesa_half_to_float(src[1]));
517 }
518
519 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
520 * returning 4 GLfloats.
521 */
522 static void FETCH(f_luminance_alpha_f16)( const struct gl_texture_image *texImage,
523 GLint i, GLint j, GLint k, GLfloat *texel )
524 {
525 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 2 );
526 texel[RCOMP] =
527 texel[GCOMP] =
528 texel[BCOMP] = _mesa_half_to_float(src[0]);
529 texel[ACOMP] = _mesa_half_to_float(src[1]);
530 }
531
532 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
533 * returning 4 GLchans.
534 */
535 static void FETCH(intensity_f32)( const struct gl_texture_image *texImage,
536 GLint i, GLint j, GLint k, GLchan *texel )
537 {
538 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
539 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], src[0]);
540 texel[GCOMP] =
541 texel[BCOMP] =
542 texel[ACOMP] = texel[RCOMP];
543 }
544
545 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
546 * returning 4 GLfloats.
547 */
548 static void FETCH(f_intensity_f32)( const struct gl_texture_image *texImage,
549 GLint i, GLint j, GLint k, GLfloat *texel )
550 {
551 const GLfloat *src = FLOAT_SRC( texImage, i, j, k, 1 );
552 texel[RCOMP] =
553 texel[GCOMP] =
554 texel[BCOMP] =
555 texel[ACOMP] = src[0];
556 }
557
558 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
559 * returning 4 GLchans.
560 */
561 static void FETCH(intensity_f16)( const struct gl_texture_image *texImage,
562 GLint i, GLint j, GLint k, GLchan *texel )
563 {
564 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
565 UNCLAMPED_FLOAT_TO_CHAN(texel[RCOMP], _mesa_half_to_float(src[0]));
566 texel[GCOMP] =
567 texel[BCOMP] =
568 texel[ACOMP] = texel[RCOMP];
569 }
570
571 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
572 * returning 4 GLfloats.
573 */
574 static void FETCH(f_intensity_f16)( const struct gl_texture_image *texImage,
575 GLint i, GLint j, GLint k, GLfloat *texel )
576 {
577 const GLhalfARB *src = HALF_SRC( texImage, i, j, k, 1 );
578 texel[RCOMP] =
579 texel[GCOMP] =
580 texel[BCOMP] =
581 texel[ACOMP] = _mesa_half_to_float(src[0]);
582 }
583
584
585
586 /*
587 * Begin Hardware formats
588 */
589
590 /* Fetch color texel from 1D, 2D or 3D rgba8888 texture, return 4 GLchans */
591 static void FETCH(rgba8888)( const struct gl_texture_image *texImage,
592 GLint i, GLint j, GLint k, GLchan *texel )
593 {
594 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
595 texel[RCOMP] = UBYTE_TO_CHAN( src[3] );
596 texel[GCOMP] = UBYTE_TO_CHAN( src[2] );
597 texel[BCOMP] = UBYTE_TO_CHAN( src[1] );
598 texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
599 }
600
601 /* Fetch color texel from 1D, 2D or 3D rgba8888 texture, return 4 GLfloats */
602 static void FETCH(f_rgba8888)( const struct gl_texture_image *texImage,
603 GLint i, GLint j, GLint k, GLfloat *texel )
604 {
605 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
606 texel[RCOMP] = UBYTE_TO_FLOAT( src[3] );
607 texel[GCOMP] = UBYTE_TO_FLOAT( src[2] );
608 texel[BCOMP] = UBYTE_TO_FLOAT( src[1] );
609 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
610 }
611
612
613 /* Fetch color texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */
614 static void FETCH(argb8888)( const struct gl_texture_image *texImage,
615 GLint i, GLint j, GLint k, GLchan *texel )
616 {
617 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
618 texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
619 texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
620 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
621 texel[ACOMP] = UBYTE_TO_CHAN( src[3] );
622 }
623
624 /* Fetch color texel from 1D, 2D or 3D argb8888 texture, return 4 GLfloats */
625 static void FETCH(f_argb8888)( const struct gl_texture_image *texImage,
626 GLint i, GLint j, GLint k, GLfloat *texel )
627 {
628 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
629 texel[RCOMP] = UBYTE_TO_FLOAT( src[2] );
630 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
631 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
632 texel[ACOMP] = UBYTE_TO_FLOAT( src[3] );
633 }
634
635
636 /* Fetch color texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */
637 static void FETCH(rgb888)( const struct gl_texture_image *texImage,
638 GLint i, GLint j, GLint k, GLchan *texel )
639 {
640 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
641 texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
642 texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
643 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
644 texel[ACOMP] = CHAN_MAX;
645 }
646
647 /* Fetch color texel from 1D, 2D or 3D rgb888 texture, return 4 GLfloats */
648 static void FETCH(f_rgb888)( const struct gl_texture_image *texImage,
649 GLint i, GLint j, GLint k, GLfloat *texel )
650 {
651 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
652 texel[RCOMP] = UBYTE_TO_FLOAT( src[2] );
653 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
654 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
655 texel[ACOMP] = CHAN_MAXF;
656 }
657
658
659 /* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
660 static void FETCH(rgb565)( const struct gl_texture_image *texImage,
661 GLint i, GLint j, GLint k, GLchan *texel )
662 {
663 const GLushort *src = USHORT_SRC( texImage, i, j, k );
664 const GLushort s = *src;
665 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
666 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
667 texel[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
668 texel[ACOMP] = CHAN_MAX;
669 }
670
671 /* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLfloats */
672 static void FETCH(f_rgb565)( const struct gl_texture_image *texImage,
673 GLint i, GLint j, GLint k, GLfloat *texel )
674 {
675 const GLushort *src = USHORT_SRC( texImage, i, j, k );
676 const GLushort s = *src;
677 texel[RCOMP] = ((s >> 8) & 0xf8) * (1.0F / 248.0F);
678 texel[GCOMP] = ((s >> 3) & 0xfc) * (1.0F / 252.0F);
679 texel[BCOMP] = ((s << 3) & 0xf8) * (1.0F / 248.0F);
680 texel[ACOMP] = CHAN_MAXF;
681 }
682
683
684 /* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
685 static void FETCH(argb4444)( const struct gl_texture_image *texImage,
686 GLint i, GLint j, GLint k, GLchan *texel )
687 {
688 const GLushort *src = USHORT_SRC( texImage, i, j, k );
689 const GLushort s = *src;
690 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
691 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
692 texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
693 texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
694 }
695
696 /* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLfloats */
697 static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
698 GLint i, GLint j, GLint k, GLfloat *texel )
699 {
700 const GLushort *src = USHORT_SRC( texImage, i, j, k );
701 const GLushort s = *src;
702 texel[RCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F);
703 texel[GCOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
704 texel[BCOMP] = ((s ) & 0xf) * (1.0F / 15.0F);
705 texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
706 }
707
708
709 /* Fetch color texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
710 static void FETCH(argb1555)( const struct gl_texture_image *texImage,
711 GLint i, GLint j, GLint k, GLchan *texel )
712 {
713 const GLushort *src = USHORT_SRC( texImage, i, j, k );
714 const GLushort s = *src;
715 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
716 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f );
717 texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f );
718 texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
719 }
720
721 /* Fetch color texel from 1D, 2D or 3D argb1555 texture, return 4 GLfloats */
722 static void FETCH(f_argb1555)( const struct gl_texture_image *texImage,
723 GLint i, GLint j, GLint k, GLfloat *texel )
724 {
725 const GLushort *src = USHORT_SRC( texImage, i, j, k );
726 const GLushort s = *src;
727 texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F);
728 texel[GCOMP] = ((s >> 5) & 0x1f) * (1.0F / 31.0F);
729 texel[BCOMP] = ((s ) & 0x1f) * (1.0F / 31.0F);
730 texel[ACOMP] = ((s >> 15) & 0x01);
731 }
732
733
734 /* Fetch color texel from 1D, 2D or 3D al88 texture, return 4 GLchans */
735 static void FETCH(al88)( const struct gl_texture_image *texImage,
736 GLint i, GLint j, GLint k, GLchan *texel )
737 {
738 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
739 texel[RCOMP] =
740 texel[GCOMP] =
741 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
742 texel[ACOMP] = UBYTE_TO_CHAN( src[1] );
743 }
744
745 /* Fetch color texel from 1D, 2D or 3D al88 texture, return 4 GLfloats */
746 static void FETCH(f_al88)( const struct gl_texture_image *texImage,
747 GLint i, GLint j, GLint k, GLfloat *texel )
748 {
749 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
750 texel[RCOMP] =
751 texel[GCOMP] =
752 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
753 texel[ACOMP] = UBYTE_TO_FLOAT( src[1] );
754 }
755
756
757 /* Fetch color texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */
758 static void FETCH(rgb332)( const struct gl_texture_image *texImage,
759 GLint i, GLint j, GLint k, GLchan *texel )
760 {
761 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
762 const GLubyte s = *src;
763 texel[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 );
764 texel[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
765 texel[BCOMP] = UBYTE_TO_CHAN( ((s << 6) & 0xc0) * 255 / 0xc0 );
766 texel[ACOMP] = CHAN_MAX;
767 }
768
769 /* Fetch color texel from 1D, 2D or 3D rgb332 texture, return 4 GLfloats */
770 static void FETCH(f_rgb332)( const struct gl_texture_image *texImage,
771 GLint i, GLint j, GLint k, GLfloat *texel )
772 {
773 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
774 const GLubyte s = *src;
775 texel[RCOMP] = ((s ) & 0xe0) * (1.0F / 224.0F);
776 texel[GCOMP] = ((s << 3) & 0xe0) * (1.0F / 224.0F);
777 texel[BCOMP] = ((s << 6) & 0xc0) * (1.0F / 192.0F);
778 texel[ACOMP] = CHAN_MAXF;
779 }
780
781
782 /* Fetch color texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
783 static void FETCH(a8)( const struct gl_texture_image *texImage,
784 GLint i, GLint j, GLint k, GLchan *texel )
785 {
786 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
787 texel[RCOMP] =
788 texel[GCOMP] =
789 texel[BCOMP] = 0;
790 texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
791 }
792
793 /* Fetch color texel from 1D, 2D or 3D a8 texture, return 4 GLfloats */
794 static void FETCH(f_a8)( const struct gl_texture_image *texImage,
795 GLint i, GLint j, GLint k, GLfloat *texel )
796 {
797 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
798 texel[RCOMP] =
799 texel[GCOMP] =
800 texel[BCOMP] = 0.0;
801 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
802 }
803
804
805 /* Fetch color texel from 1D, 2D or 3D l8 texture, return 4 GLchans */
806 static void FETCH(l8)( const struct gl_texture_image *texImage,
807 GLint i, GLint j, GLint k, GLchan *texel )
808 {
809 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
810 texel[RCOMP] =
811 texel[GCOMP] =
812 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
813 texel[ACOMP] = CHAN_MAX;
814 }
815
816 /* Fetch color texel from 1D, 2D or 3D l8 texture, return 4 GLfloats */
817 static void FETCH(f_l8)( const struct gl_texture_image *texImage,
818 GLint i, GLint j, GLint k, GLfloat *texel )
819 {
820 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
821 texel[RCOMP] =
822 texel[GCOMP] =
823 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
824 texel[ACOMP] = CHAN_MAXF;
825 }
826
827
828 /* Fetch color texel from 1D, 2D or 3D i8 texture, return 4 GLchans */
829 static void FETCH(i8)( const struct gl_texture_image *texImage,
830 GLint i, GLint j, GLint k, GLchan *texel )
831 {
832 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
833 texel[RCOMP] =
834 texel[GCOMP] =
835 texel[BCOMP] =
836 texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
837 }
838
839 /* Fetch color texel from 1D, 2D or 3D i8 texture, return 4 GLfloats */
840 static void FETCH(f_i8)( const struct gl_texture_image *texImage,
841 GLint i, GLint j, GLint k, GLfloat *texel )
842 {
843 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
844 texel[RCOMP] =
845 texel[GCOMP] =
846 texel[BCOMP] =
847 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
848 }
849
850
851 /* Fetch color texel from 1D, 2D or 3D ci8 texture, return 1 GLchan */
852 static void FETCH(ci8)( const struct gl_texture_image *texImage,
853 GLint i, GLint j, GLint k, GLchan *texel )
854 {
855 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
856 GLchan *index = (GLchan *) texel;
857 *index = UBYTE_TO_CHAN( *src );
858 }
859
860
861 /* Fetch color texel from 1D, 2D or 3D ci8 texture, return 1 GLfloat */
862 static void FETCH(f_ci8)( const struct gl_texture_image *texImage,
863 GLint i, GLint j, GLint k, GLfloat *texel )
864 {
865 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
866 texel[0] = UBYTE_TO_FLOAT( *src );
867 }
868
869
870 /* Fetch color texel from 1D, 2D or 3D ycbcr texture, return 4 GLchans */
871 /* We convert YCbCr to RGB here */
872 /* XXX this may break if GLchan != GLubyte */
873 static void FETCH(ycbcr)( const struct gl_texture_image *texImage,
874 GLint i, GLint j, GLint k, GLchan *texel )
875 {
876 const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
877 const GLushort *src1 = src0 + 1; /* odd */
878 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
879 const GLubyte cb = *src0 & 0xff; /* chroma U */
880 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
881 const GLubyte cr = *src1 & 0xff; /* chroma V */
882 GLint r, g, b;
883 if (i & 1) {
884 /* odd pixel: use y1,cr,cb */
885 r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
886 g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
887 b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
888 }
889 else {
890 /* even pixel: use y0,cr,cb */
891 r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
892 g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
893 b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
894 }
895 texel[RCOMP] = CLAMP(r, 0, CHAN_MAX);
896 texel[GCOMP] = CLAMP(g, 0, CHAN_MAX);
897 texel[BCOMP] = CLAMP(b, 0, CHAN_MAX);
898 texel[ACOMP] = CHAN_MAX;
899 }
900
901 /* Fetch color texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats */
902 /* We convert YCbCr to RGB here */
903 static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
904 GLint i, GLint j, GLint k, GLfloat *texel )
905 {
906 const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
907 const GLushort *src1 = src0 + 1; /* odd */
908 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
909 const GLubyte cb = *src0 & 0xff; /* chroma U */
910 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
911 const GLubyte cr = *src1 & 0xff; /* chroma V */
912 GLfloat r, g, b;
913 if (i & 1) {
914 /* odd pixel: use y1,cr,cb */
915 r = (1.164 * (y1-16) + 1.596 * (cr-128));
916 g = (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
917 b = (1.164 * (y1-16) + 2.018 * (cb-128));
918 }
919 else {
920 /* even pixel: use y0,cr,cb */
921 r = (1.164 * (y0-16) + 1.596 * (cr-128));
922 g = (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
923 b = (1.164 * (y0-16) + 2.018 * (cb-128));
924 }
925 /* XXX remove / 255 here by tweaking arithmetic above */
926 r /= 255.0;
927 g /= 255.0;
928 b /= 255.0;
929 /* XXX should we really clamp??? */
930 texel[RCOMP] = CLAMP(r, 0.0, 1.0);
931 texel[GCOMP] = CLAMP(g, 0.0, 1.0);
932 texel[BCOMP] = CLAMP(b, 0.0, 1.0);
933 texel[ACOMP] = CHAN_MAXF;
934 }
935
936
937 /* Fetch color texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLchans */
938 /* We convert YCbCr to RGB here */
939 /* XXX this may break if GLchan != GLubyte */
940 static void FETCH(ycbcr_rev)( const struct gl_texture_image *texImage,
941 GLint i, GLint j, GLint k, GLchan *texel )
942 {
943 const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
944 const GLushort *src1 = src0 + 1; /* odd */
945 const GLubyte y0 = *src0 & 0xff; /* luminance */
946 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
947 const GLubyte y1 = *src1 & 0xff; /* luminance */
948 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
949 GLint r, g, b;
950 if (i & 1) {
951 /* odd pixel: use y1,cr,cb */
952 r = (GLint) (1.164 * (y1-16) + 1.596 * (cr-128));
953 g = (GLint) (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
954 b = (GLint) (1.164 * (y1-16) + 2.018 * (cb-128));
955 }
956 else {
957 /* even pixel: use y0,cr,cb */
958 r = (GLint) (1.164 * (y0-16) + 1.596 * (cr-128));
959 g = (GLint) (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
960 b = (GLint) (1.164 * (y0-16) + 2.018 * (cb-128));
961 }
962 texel[RCOMP] = CLAMP(r, 0, CHAN_MAX);
963 texel[GCOMP] = CLAMP(g, 0, CHAN_MAX);
964 texel[BCOMP] = CLAMP(b, 0, CHAN_MAX);
965 texel[ACOMP] = CHAN_MAX;
966 }
967
968 /* Fetch color texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats */
969 /* We convert YCbCr to RGB here */
970 static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
971 GLint i, GLint j, GLint k, GLfloat *texel )
972 {
973 const GLushort *src0 = USHORT_SRC( texImage, (i & ~1), j, k ); /* even */
974 const GLushort *src1 = src0 + 1; /* odd */
975 const GLubyte y0 = *src0 & 0xff; /* luminance */
976 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
977 const GLubyte y1 = *src1 & 0xff; /* luminance */
978 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
979 GLfloat r, g, b;
980 if (i & 1) {
981 /* odd pixel: use y1,cr,cb */
982 r = (1.164 * (y1-16) + 1.596 * (cr-128));
983 g = (1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
984 b = (1.164 * (y1-16) + 2.018 * (cb-128));
985 }
986 else {
987 /* even pixel: use y0,cr,cb */
988 r = (1.164 * (y0-16) + 1.596 * (cr-128));
989 g = (1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128));
990 b = (1.164 * (y0-16) + 2.018 * (cb-128));
991 }
992 /* XXX remove / 255 here by tweaking arithmetic above */
993 r /= 255.0;
994 g /= 255.0;
995 b /= 255.0;
996 /* XXX should we really clamp??? */
997 texel[RCOMP] = CLAMP(r, 0.0, 1.0);
998 texel[GCOMP] = CLAMP(g, 0.0, 1.0);
999 texel[BCOMP] = CLAMP(b, 0.0, 1.0);
1000 texel[ACOMP] = CHAN_MAXF;
1001 }
1002
1003
1004
1005 /* big-endian */
1006
1007 #if 0
1008 static void FETCH(abgr8888)( const struct gl_texture_image *texImage,
1009 GLint i, GLint j, GLint k, GLchan *texel )
1010 {
1011 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
1012 texel[RCOMP] = UBYTE_TO_CHAN( src[3] );
1013 texel[GCOMP] = UBYTE_TO_CHAN( src[2] );
1014 texel[BCOMP] = UBYTE_TO_CHAN( src[1] );
1015 texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
1016 }
1017
1018 static void FETCH(bgra8888)( const struct gl_texture_image *texImage,
1019 GLint i, GLint j, GLint k, GLchan *texel )
1020 {
1021 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
1022 texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
1023 texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
1024 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
1025 texel[ACOMP] = UBYTE_TO_CHAN( src[3] );
1026 }
1027
1028 static void FETCH(bgr888)( const struct gl_texture_image *texImage,
1029 GLint i, GLint j, GLint k, GLchan *texel )
1030 {
1031 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
1032 texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
1033 texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
1034 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
1035 texel[ACOMP] = CHAN_MAX;
1036 }
1037
1038 static void FETCH(bgr565)( const struct gl_texture_image *texImage,
1039 GLint i, GLint j, GLint k, GLchan *texel )
1040 {
1041 const GLushort *src = USHORT_SRC( texImage, i, j, k );
1042 const GLushort s = *src;
1043 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
1044 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
1045 texel[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
1046 texel[ACOMP] = CHAN_MAX;
1047 }
1048
1049 static void FETCH(bgra4444)( const struct gl_texture_image *texImage,
1050 GLint i, GLint j, GLint k, GLchan *texel )
1051 {
1052 const GLushort *src = USHORT_SRC( texImage, i, j, k );
1053 const GLushort s = *src;
1054 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
1055 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
1056 texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
1057 texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
1058 }
1059
1060 static void FETCH(bgra5551)( const struct gl_texture_image *texImage,
1061 GLint i, GLint j, GLint k, GLchan *texel )
1062 {
1063 const GLushort *src = USHORT_SRC( texImage, i, j, k );
1064 const GLushort s = *src;
1065 texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
1066 texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f );
1067 texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f );
1068 texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
1069 }
1070
1071 static void FETCH(la88)( const struct gl_texture_image *texImage,
1072 GLint i, GLint j, GLint k, GLchan *texel )
1073 {
1074 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
1075 texel[RCOMP] = UBYTE_TO_CHAN( src[0] );
1076 texel[GCOMP] = UBYTE_TO_CHAN( src[0] );
1077 texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
1078 texel[ACOMP] = UBYTE_TO_CHAN( src[1] );
1079 }
1080
1081 static void FETCH(bgr233)( const struct gl_texture_image *texImage,
1082 GLint i, GLint j, GLint k, GLchan *texel )
1083 {
1084 const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
1085 const GLubyte s = *src;
1086 texel[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 );
1087 texel[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
1088 texel[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
1089 texel[ACOMP] = CHAN_MAX;
1090 }
1091 #endif
1092
1093
1094 #undef CHAN_SRC
1095 #undef UBYTE_SRC
1096 #undef USHORT_SRC
1097 #undef FLOAT_SRC
1098 #undef HALF_SRC
1099 #undef FETCH
1100 #undef DIM