1 /* $Id: texformat_tmp.h,v 1.9 2002/09/27 02:45:38 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
27 * Gareth Hughes <gareth@valinux.com>
33 * This template file generates texel fetch functions for 1-D, 2-D and 3-D
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))
49 #define FETCH(x) fetch_1d_texel_##x
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)))
62 #define FETCH(x) fetch_2d_texel_##x
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)))
79 #define FETCH(x) fetch_3d_texel_##x
82 #error illegal number of texture dimensions
86 static void FETCH(rgba
)( const struct gl_texture_image
*texImage
,
87 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
89 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 4 );
90 GLchan
*rgba
= (GLchan
*) texel
;
91 COPY_CHAN4( rgba
, src
);
94 static void FETCH(rgb
)( const struct gl_texture_image
*texImage
,
95 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
97 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 3 );
98 GLchan
*rgba
= (GLchan
*) texel
;
100 rgba
[GCOMP
] = src
[1];
101 rgba
[BCOMP
] = src
[2];
102 rgba
[ACOMP
] = CHAN_MAX
;
105 static void FETCH(alpha
)( const struct gl_texture_image
*texImage
,
106 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
108 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
109 GLchan
*rgba
= (GLchan
*) texel
;
113 rgba
[ACOMP
] = src
[0];
116 static void FETCH(luminance
)( const struct gl_texture_image
*texImage
,
117 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
127 static void FETCH(luminance_alpha
)( const struct gl_texture_image
*texImage
,
128 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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];
138 static void FETCH(intensity
)( const struct gl_texture_image
*texImage
,
139 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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];
149 static void FETCH(color_index
)( const struct gl_texture_image
*texImage
,
150 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
152 const GLchan
*src
= CHAN_SRC( texImage
, i
, j
, k
, 1 );
153 GLchan
*index
= (GLchan
*) texel
;
157 static void FETCH(depth_component
)( const struct gl_texture_image
*texImage
,
158 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
160 const GLfloat
*src
= FLOAT_SRC( texImage
, i
, j
, k
);
161 GLfloat
*depth
= (GLfloat
*) texel
;
165 static void FETCH(rgba8888
)( const struct gl_texture_image
*texImage
,
166 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
176 static void FETCH(argb8888
)( const struct gl_texture_image
*texImage
,
177 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
187 static void FETCH(rgb888
)( const struct gl_texture_image
*texImage
,
188 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
198 static void FETCH(rgb565
)( const struct gl_texture_image
*texImage
,
199 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
210 static void FETCH(argb4444
)( const struct gl_texture_image
*texImage
,
211 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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 );
222 static void FETCH(argb1555
)( const struct gl_texture_image
*texImage
,
223 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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 );
234 static void FETCH(al88
)( const struct gl_texture_image
*texImage
,
235 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
245 static void FETCH(rgb332
)( const struct gl_texture_image
*texImage
,
246 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
257 static void FETCH(a8
)( const struct gl_texture_image
*texImage
,
258 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
260 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
261 GLchan
*rgba
= (GLchan
*) texel
;
265 rgba
[ACOMP
] = UBYTE_TO_CHAN( src
[0] );
268 static void FETCH(l8
)( const struct gl_texture_image
*texImage
,
269 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
279 static void FETCH(i8
)( const struct gl_texture_image
*texImage
,
280 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
290 static void FETCH(ci8
)( const struct gl_texture_image
*texImage
,
291 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
293 const GLubyte
*src
= UBYTE_SRC( texImage
, i
, j
, k
, 1 );
294 GLchan
*index
= (GLchan
*) texel
;
295 *index
= UBYTE_TO_CHAN( *src
);
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
)
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
;
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));
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));
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
;
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
)
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
;
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));
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));
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
;
362 static void FETCH(abgr8888
)( const struct gl_texture_image
*texImage
,
363 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
373 static void FETCH(bgra8888
)( const struct gl_texture_image
*texImage
,
374 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
384 static void FETCH(bgr888
)( const struct gl_texture_image
*texImage
,
385 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
395 static void FETCH(bgr565
)( const struct gl_texture_image
*texImage
,
396 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;
407 static void FETCH(bgra4444
)( const struct gl_texture_image
*texImage
,
408 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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 );
419 static void FETCH(bgra5551
)( const struct gl_texture_image
*texImage
,
420 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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 );
431 static void FETCH(la88
)( const struct gl_texture_image
*texImage
,
432 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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] );
442 static void FETCH(bgr233
)( const struct gl_texture_image
*texImage
,
443 GLint i
, GLint j
, GLint k
, GLvoid
*texel
)
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
;