2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
27 * \file texformat_tmp.h
28 * Texel fetch functions template.
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.
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.
37 * \sa texformat.c and FetchTexel.
39 * \author Gareth Hughes
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))
57 #define FETCH(x) fetch_texel_1d_##x
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))
72 #define FETCH(x) fetch_texel_2d_##x
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))
92 #define FETCH(x) fetch_texel_3d_##x
95 #error illegal number of texture dimensions
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
)
103 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 4 );
104 COPY_CHAN4( texel
, src
);
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
)
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]);
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
)
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
;
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
)
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
;
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
)
145 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
149 texel
[ACOMP
] = src
[0];
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
)
156 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
160 texel
[ACOMP
] = CHAN_TO_FLOAT(src
[0]);
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
)
167 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
170 texel
[BCOMP
] = src
[0];
171 texel
[ACOMP
] = CHAN_MAX
;
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
)
178 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
181 texel
[BCOMP
] = CHAN_TO_FLOAT(src
[0]);
182 texel
[ACOMP
] = CHAN_MAXF
;
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
)
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];
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
)
200 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 2 );
203 texel
[BCOMP
] = CHAN_TO_FLOAT(src
[0]);
204 texel
[ACOMP
] = CHAN_TO_FLOAT(src
[1]);
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
)
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];
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
)
223 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
227 texel
[ACOMP
] = CHAN_TO_FLOAT(src
[0]);
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
)
235 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
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
)
243 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
244 texel
[0] = (GLfloat
) src
[0];
248 /* Fetch depth texel from 1D, 2D or 3D float32 DEPTH texture,
249 * returning 1 GLfloat.
250 * Note: no GLchan version of this function.
252 static void FETCH(f_depth_component_f32
)( const struct gl_texture_image
*texImage
,
253 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
255 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
260 /* Fetch depth texel from 1D, 2D or 3D float32 DEPTH texture,
261 * returning 1 GLfloat.
262 * Note: no GLchan version of this function.
264 static void FETCH(f_depth_component16
)( const struct gl_texture_image
*texImage
,
265 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
267 const GLushort
*src
= USHORT_SRC( texImage
, i
, j
, k
);
268 texel
[0] = src
[0] * (1.0F
/ 65535.0F
);
272 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT32 texture,
273 * returning 4 GLchans.
275 static void FETCH(rgba_f32
)( const struct gl_texture_image
*texImage
,
276 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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]);
285 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT32 texture,
286 * returning 4 GLfloats.
288 static void FETCH(f_rgba_f32
)( const struct gl_texture_image
*texImage
,
289 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
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];
298 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
299 * returning 4 GLchans.
301 static void FETCH(rgba_f16
)( const struct gl_texture_image
*texImage
,
302 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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]));
311 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
312 * returning 4 GLfloats.
314 static void FETCH(f_rgba_f16
)( const struct gl_texture_image
*texImage
,
315 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
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]);
324 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT32 texture,
325 * returning 4 GLchans.
327 static void FETCH(rgb_f32
)( const struct gl_texture_image
*texImage
,
328 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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
;
337 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT32 texture,
338 * returning 4 GLfloats.
340 static void FETCH(f_rgb_f32
)( const struct gl_texture_image
*texImage
,
341 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
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
;
350 /* Fetch color texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
351 * returning 4 GLchans.
353 static void FETCH(rgb_f16
)( const struct gl_texture_image
*texImage
,
354 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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
;
363 /* Fetch color texel from 1D, 2D or 3D RGB_FLOAT16 texture,
364 * returning 4 GLfloats.
366 static void FETCH(f_rgb_f16
)( const struct gl_texture_image
*texImage
,
367 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
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
;
376 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
377 * returning 4 GLchans.
379 static void FETCH(alpha_f32
)( const struct gl_texture_image
*texImage
,
380 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
382 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
386 UNCLAMPED_FLOAT_TO_CHAN(texel
[ACOMP
], src
[0]);
389 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
390 * returning 4 GLfloats.
392 static void FETCH(f_alpha_f32
)( const struct gl_texture_image
*texImage
,
393 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
395 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
399 texel
[ACOMP
] = src
[0];
402 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
403 * returning 4 GLchans.
405 static void FETCH(alpha_f16
)( const struct gl_texture_image
*texImage
,
406 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
408 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
412 UNCLAMPED_FLOAT_TO_CHAN(texel
[ACOMP
], _mesa_half_to_float(src
[0]));
415 /* Fetch color texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
416 * returning 4 GLfloats.
418 static void FETCH(f_alpha_f16
)( const struct gl_texture_image
*texImage
,
419 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
421 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
425 texel
[ACOMP
] = _mesa_half_to_float(src
[0]);
428 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
429 * returning 4 GLchans.
431 static void FETCH(luminance_f32
)( const struct gl_texture_image
*texImage
,
432 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
434 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
435 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], src
[0]);
437 texel
[BCOMP
] = texel
[RCOMP
];
438 texel
[ACOMP
] = CHAN_MAX
;
441 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
442 * returning 4 GLfloats.
444 static void FETCH(f_luminance_f32
)( const struct gl_texture_image
*texImage
,
445 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
447 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
450 texel
[BCOMP
] = src
[0];
451 texel
[ACOMP
] = CHAN_MAXF
;
454 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
455 * returning 4 GLchans.
457 static void FETCH(luminance_f16
)( const struct gl_texture_image
*texImage
,
458 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
460 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
461 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], _mesa_half_to_float(src
[0]));
463 texel
[BCOMP
] = texel
[RCOMP
];
464 texel
[ACOMP
] = CHAN_MAX
;
467 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
468 * returning 4 GLfloats.
470 static void FETCH(f_luminance_f16
)( const struct gl_texture_image
*texImage
,
471 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
473 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
476 texel
[BCOMP
] = _mesa_half_to_float(src
[0]);
477 texel
[ACOMP
] = CHAN_MAXF
;
480 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
481 * returning 4 GLchans.
483 static void FETCH(luminance_alpha_f32
)( const struct gl_texture_image
*texImage
,
484 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
486 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 2 );
487 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], src
[0]);
489 texel
[BCOMP
] = texel
[RCOMP
];
490 UNCLAMPED_FLOAT_TO_CHAN(texel
[ACOMP
], src
[1]);
493 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
494 * returning 4 GLfloats.
496 static void FETCH(f_luminance_alpha_f32
)( const struct gl_texture_image
*texImage
,
497 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
499 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 2 );
502 texel
[BCOMP
] = src
[0];
503 texel
[ACOMP
] = src
[1];
506 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
507 * returning 4 GLfloats.
509 static void FETCH(luminance_alpha_f16
)( const struct gl_texture_image
*texImage
,
510 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
512 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 2 );
513 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], _mesa_half_to_float(src
[0]));
515 texel
[BCOMP
] = texel
[RCOMP
];
516 UNCLAMPED_FLOAT_TO_CHAN(texel
[ACOMP
], _mesa_half_to_float(src
[1]));
519 /* Fetch color texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
520 * returning 4 GLfloats.
522 static void FETCH(f_luminance_alpha_f16
)( const struct gl_texture_image
*texImage
,
523 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
525 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 2 );
528 texel
[BCOMP
] = _mesa_half_to_float(src
[0]);
529 texel
[ACOMP
] = _mesa_half_to_float(src
[1]);
532 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
533 * returning 4 GLchans.
535 static void FETCH(intensity_f32
)( const struct gl_texture_image
*texImage
,
536 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
538 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
539 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], src
[0]);
542 texel
[ACOMP
] = texel
[RCOMP
];
545 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
546 * returning 4 GLfloats.
548 static void FETCH(f_intensity_f32
)( const struct gl_texture_image
*texImage
,
549 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
551 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
, 1 );
555 texel
[ACOMP
] = src
[0];
558 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
559 * returning 4 GLchans.
561 static void FETCH(intensity_f16
)( const struct gl_texture_image
*texImage
,
562 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
564 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
565 UNCLAMPED_FLOAT_TO_CHAN(texel
[RCOMP
], _mesa_half_to_float(src
[0]));
568 texel
[ACOMP
] = texel
[RCOMP
];
571 /* Fetch color texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
572 * returning 4 GLfloats.
574 static void FETCH(f_intensity_f16
)( const struct gl_texture_image
*texImage
,
575 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
577 const GLhalfARB
*src
= HALF_SRC( texImage
, i
, j
, k
, 1 );
581 texel
[ACOMP
] = _mesa_half_to_float(src
[0]);
587 * Begin Hardware formats
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
)
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] );
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
)
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] );
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
)
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] );
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
)
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] );
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
)
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
;
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
)
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
;
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
)
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
;
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
)
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
;
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
)
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 );
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
)
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
);
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
)
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 );
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
)
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);
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
)
738 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 2 );
741 texel
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
742 texel
[ACOMP
] = UBYTE_TO_CHAN( src
[1] );
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
)
749 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 2 );
752 texel
[BCOMP
] = UBYTE_TO_FLOAT( src
[0] );
753 texel
[ACOMP
] = UBYTE_TO_FLOAT( src
[1] );
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
)
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
;
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
)
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
;
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
)
786 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
790 texel
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
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
)
797 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
801 texel
[ACOMP
] = UBYTE_TO_FLOAT( src
[0] );
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
)
809 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
812 texel
[BCOMP
] = UBYTE_TO_CHAN( src
[0] );
813 texel
[ACOMP
] = CHAN_MAX
;
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
)
820 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
823 texel
[BCOMP
] = UBYTE_TO_FLOAT( src
[0] );
824 texel
[ACOMP
] = CHAN_MAXF
;
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
)
832 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
836 texel
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
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
)
843 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
847 texel
[ACOMP
] = UBYTE_TO_FLOAT( src
[0] );
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
)
855 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
856 GLchan
*index
= (GLchan
*) texel
;
857 *index
= UBYTE_TO_CHAN( *src
);
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
)
865 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
866 texel
[0] = UBYTE_TO_FLOAT( *src
);
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
)
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 */
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));
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));
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
;
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
)
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 */
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));
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));
925 /* XXX remove / 255 here by tweaking arithmetic above */
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
;
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
)
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 */
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));
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));
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
;
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
)
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 */
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));
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));
992 /* XXX remove / 255 here by tweaking arithmetic above */
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
;
1008 static void FETCH(abgr8888
)( const struct gl_texture_image
*texImage
,
1009 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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] );
1018 static void FETCH(bgra8888
)( const struct gl_texture_image
*texImage
,
1019 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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] );
1028 static void FETCH(bgr888
)( const struct gl_texture_image
*texImage
,
1029 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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
;
1038 static void FETCH(bgr565
)( const struct gl_texture_image
*texImage
,
1039 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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
;
1049 static void FETCH(bgra4444
)( const struct gl_texture_image
*texImage
,
1050 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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 );
1060 static void FETCH(bgra5551
)( const struct gl_texture_image
*texImage
,
1061 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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 );
1071 static void FETCH(la88
)( const struct gl_texture_image
*texImage
,
1072 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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] );
1081 static void FETCH(bgr233
)( const struct gl_texture_image
*texImage
,
1082 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
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
;