2 * Mesa 3-D graphics library
4 * Copyright (c) 2011 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "format_unpack.h"
28 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
29 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
33 * Convert an 8-bit sRGB value from non-linear space to a
34 * linear RGB value in [0, 1].
35 * Implemented with a 256-entry lookup table.
38 nonlinear_to_linear(GLubyte cs8
)
40 static GLfloat table
[256];
41 static GLboolean tableReady
= GL_FALSE
;
43 /* compute lookup table now */
45 for (i
= 0; i
< 256; i
++) {
46 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
48 table
[i
] = cs
/ 12.92f
;
51 table
[i
] = (GLfloat
) pow((cs
+ 0.055) / 1.055, 2.4);
60 typedef void (*unpack_rgba_func
)(const void *src
, GLfloat dst
[4]);
64 unpack_RGBA8888(const void *src
, GLfloat dst
[4])
66 const GLuint s
= *((const GLuint
*) src
);
67 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
68 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
69 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
70 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
74 unpack_RGBA8888_REV(const void *src
, GLfloat dst
[4])
76 const GLuint s
= *((const GLuint
*) src
);
77 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
78 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
79 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
80 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
84 unpack_ARGB8888(const void *src
, GLfloat dst
[4])
86 const GLuint s
= *((const GLuint
*) src
);
87 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
88 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
89 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
90 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
94 unpack_ARGB8888_REV(const void *src
, GLfloat dst
[4])
96 const GLuint s
= *((const GLuint
*) src
);
97 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
98 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
99 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
100 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
104 unpack_XRGB8888(const void *src
, GLfloat dst
[4])
106 const GLuint s
= *((const GLuint
*) src
);
107 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
108 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
109 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff );
114 unpack_XRGB8888_REV(const void *src
, GLfloat dst
[4])
116 const GLuint s
= *((const GLuint
*) src
);
117 dst
[RCOMP
] = UBYTE_TO_FLOAT( (s
>> 8) & 0xff );
118 dst
[GCOMP
] = UBYTE_TO_FLOAT( (s
>> 16) & 0xff );
119 dst
[BCOMP
] = UBYTE_TO_FLOAT( (s
>> 24) );
124 unpack_RGB888(const void *src
, GLfloat dst
[4])
126 const GLubyte
*s
= (const GLubyte
*) src
;
127 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
[2] );
128 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
[1] );
129 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
[0] );
134 unpack_BGR888(const void *src
, GLfloat dst
[4])
136 const GLubyte
*s
= (const GLubyte
*) src
;
137 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
[0] );
138 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
[1] );
139 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
[2] );
144 unpack_RGB565(const void *src
, GLfloat dst
[4])
146 const GLushort s
= *((const GLushort
*) src
);
147 dst
[RCOMP
] = ((s
>> 11) & 0x1f) * (1.0F
/ 31.0F
);
148 dst
[GCOMP
] = ((s
>> 5 ) & 0x3f) * (1.0F
/ 63.0F
);
149 dst
[BCOMP
] = ((s
) & 0x1f) * (1.0F
/ 31.0F
);
154 unpack_RGB565_REV(const void *src
, GLfloat dst
[4])
156 GLushort s
= *((const GLushort
*) src
);
157 s
= (s
>> 8) | (s
<< 8); /* byte swap */
158 dst
[RCOMP
] = UBYTE_TO_FLOAT( ((s
>> 8) & 0xf8) | ((s
>> 13) & 0x7) );
159 dst
[GCOMP
] = UBYTE_TO_FLOAT( ((s
>> 3) & 0xfc) | ((s
>> 9) & 0x3) );
160 dst
[BCOMP
] = UBYTE_TO_FLOAT( ((s
<< 3) & 0xf8) | ((s
>> 2) & 0x7) );
165 unpack_ARGB4444(const void *src
, GLfloat dst
[4])
167 const GLushort s
= *((const GLushort
*) src
);
168 dst
[RCOMP
] = ((s
>> 8) & 0xf) * (1.0F
/ 15.0F
);
169 dst
[GCOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
170 dst
[BCOMP
] = ((s
) & 0xf) * (1.0F
/ 15.0F
);
171 dst
[ACOMP
] = ((s
>> 12) & 0xf) * (1.0F
/ 15.0F
);
175 unpack_ARGB4444_REV(const void *src
, GLfloat dst
[4])
177 const GLushort s
= *((const GLushort
*) src
);
178 dst
[RCOMP
] = ((s
) & 0xf) * (1.0F
/ 15.0F
);
179 dst
[GCOMP
] = ((s
>> 12) & 0xf) * (1.0F
/ 15.0F
);
180 dst
[BCOMP
] = ((s
>> 8) & 0xf) * (1.0F
/ 15.0F
);
181 dst
[ACOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
185 unpack_RGBA5551(const void *src
, GLfloat dst
[4])
187 const GLushort s
= *((const GLushort
*) src
);
188 dst
[RCOMP
] = ((s
>> 11) & 0x1f) * (1.0F
/ 31.0F
);
189 dst
[GCOMP
] = ((s
>> 6) & 0x1f) * (1.0F
/ 31.0F
);
190 dst
[BCOMP
] = ((s
>> 1) & 0x1f) * (1.0F
/ 31.0F
);
191 dst
[ACOMP
] = ((s
) & 0x01) * 1.0F
;
195 unpack_ARGB1555(const void *src
, GLfloat dst
[4])
197 const GLushort s
= *((const GLushort
*) src
);
198 dst
[RCOMP
] = ((s
>> 10) & 0x1f) * (1.0F
/ 31.0F
);
199 dst
[GCOMP
] = ((s
>> 5) & 0x1f) * (1.0F
/ 31.0F
);
200 dst
[BCOMP
] = ((s
>> 0) & 0x1f) * (1.0F
/ 31.0F
);
201 dst
[ACOMP
] = ((s
>> 15) & 0x01) * 1.0F
;
205 unpack_ARGB1555_REV(const void *src
, GLfloat dst
[4])
207 const GLushort s
= *((const GLushort
*) src
);
208 dst
[RCOMP
] = UBYTE_TO_FLOAT( ((s
>> 7) & 0xf8) | ((s
>> 12) & 0x7) );
209 dst
[GCOMP
] = UBYTE_TO_FLOAT( ((s
>> 2) & 0xf8) | ((s
>> 7) & 0x7) );
210 dst
[BCOMP
] = UBYTE_TO_FLOAT( ((s
<< 3) & 0xf8) | ((s
>> 2) & 0x7) );
211 dst
[ACOMP
] = UBYTE_TO_FLOAT( ((s
>> 15) & 0x01) * 255 );
215 unpack_AL44(const void *src
, GLfloat dst
[4])
217 const GLubyte s
= *((const GLubyte
*) src
);
220 dst
[BCOMP
] = (s
& 0xf) * (1.0F
/ 15.0F
);
221 dst
[ACOMP
] = ((s
>> 4) & 0xf) * (1.0F
/ 15.0F
);
225 unpack_AL88(const void *src
, GLfloat dst
[4])
227 const GLushort s
= *((const GLushort
*) src
);
230 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
231 dst
[ACOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
235 unpack_AL88_REV(const void *src
, GLfloat dst
[4])
237 const GLushort s
= *((const GLushort
*) src
);
240 dst
[BCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
241 dst
[ACOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
245 unpack_AL1616(const void *src
, GLfloat dst
[4])
247 const GLuint s
= *((const GLuint
*) src
);
250 dst
[BCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
251 dst
[ACOMP
] = USHORT_TO_FLOAT( s
>> 16 );
255 unpack_AL1616_REV(const void *src
, GLfloat dst
[4])
257 const GLuint s
= *((const GLuint
*) src
);
260 dst
[BCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
261 dst
[ACOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
265 unpack_RGB332(const void *src
, GLfloat dst
[4])
267 const GLubyte s
= *((const GLubyte
*) src
);
268 dst
[RCOMP
] = ((s
>> 5) & 0x7) * (1.0F
/ 7.0F
);
269 dst
[GCOMP
] = ((s
>> 2) & 0x7) * (1.0F
/ 7.0F
);
270 dst
[BCOMP
] = ((s
) & 0x3) * (1.0F
/ 3.0F
);
276 unpack_A8(const void *src
, GLfloat dst
[4])
278 const GLubyte s
= *((const GLubyte
*) src
);
282 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
);
286 unpack_A16(const void *src
, GLfloat dst
[4])
288 const GLushort s
= *((const GLushort
*) src
);
292 dst
[ACOMP
] = USHORT_TO_FLOAT(s
);
296 unpack_L8(const void *src
, GLfloat dst
[4])
298 const GLubyte s
= *((const GLubyte
*) src
);
301 dst
[BCOMP
] = UBYTE_TO_FLOAT(s
);
306 unpack_L16(const void *src
, GLfloat dst
[4])
308 const GLushort s
= *((const GLushort
*) src
);
311 dst
[BCOMP
] = USHORT_TO_FLOAT(s
);
316 unpack_I8(const void *src
, GLfloat dst
[4])
318 const GLubyte s
= *((const GLubyte
*) src
);
322 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
);
326 unpack_I16(const void *src
, GLfloat dst
[4])
328 const GLushort s
= *((const GLushort
*) src
);
332 dst
[ACOMP
] = USHORT_TO_FLOAT(s
);
336 unpack_YCBCR(const void *src
, GLfloat dst
[4])
339 const GLushort
*src0
= (const GLushort
*) src
;
340 const GLushort
*src1
= src0
+ 1; /* odd */
341 const GLubyte y0
= (*src0
>> 8) & 0xff; /* luminance */
342 const GLubyte cb
= *src0
& 0xff; /* chroma U */
343 const GLubyte y1
= (*src1
>> 8) & 0xff; /* luminance */
344 const GLubyte cr
= *src1
& 0xff; /* chroma V */
345 const GLubyte y
= (i
& 1) ? y1
: y0
; /* choose even/odd luminance */
346 GLfloat r
= 1.164F
* (y
- 16) + 1.596F
* (cr
- 128);
347 GLfloat g
= 1.164F
* (y
- 16) - 0.813F
* (cr
- 128) - 0.391F
* (cb
- 128);
348 GLfloat b
= 1.164F
* (y
- 16) + 2.018F
* (cb
- 128);
349 r
*= (1.0F
/ 255.0F
);
350 g
*= (1.0F
/ 255.0F
);
351 b
*= (1.0F
/ 255.0F
);
352 dst
[RCOMP
] = CLAMP(r
, 0.0F
, 1.0F
);
353 dst
[GCOMP
] = CLAMP(g
, 0.0F
, 1.0F
);
354 dst
[BCOMP
] = CLAMP(b
, 0.0F
, 1.0F
);
359 unpack_YCBCR_REV(const void *src
, GLfloat dst
[4])
362 const GLushort
*src0
= (const GLushort
*) src
;
363 const GLushort
*src1
= src0
+ 1; /* odd */
364 const GLubyte y0
= *src0
& 0xff; /* luminance */
365 const GLubyte cr
= (*src0
>> 8) & 0xff; /* chroma V */
366 const GLubyte y1
= *src1
& 0xff; /* luminance */
367 const GLubyte cb
= (*src1
>> 8) & 0xff; /* chroma U */
368 const GLubyte y
= (i
& 1) ? y1
: y0
; /* choose even/odd luminance */
369 GLfloat r
= 1.164F
* (y
- 16) + 1.596F
* (cr
- 128);
370 GLfloat g
= 1.164F
* (y
- 16) - 0.813F
* (cr
- 128) - 0.391F
* (cb
- 128);
371 GLfloat b
= 1.164F
* (y
- 16) + 2.018F
* (cb
- 128);
372 r
*= (1.0F
/ 255.0F
);
373 g
*= (1.0F
/ 255.0F
);
374 b
*= (1.0F
/ 255.0F
);
375 dst
[RCOMP
] = CLAMP(r
, 0.0F
, 1.0F
);
376 dst
[GCOMP
] = CLAMP(g
, 0.0F
, 1.0F
);
377 dst
[BCOMP
] = CLAMP(b
, 0.0F
, 1.0F
);
382 unpack_R8(const void *src
, GLfloat dst
[4])
384 const GLubyte s
= *((const GLubyte
*) src
);
385 dst
[0] = UBYTE_TO_FLOAT(s
);
386 dst
[1] = dst
[2] = 0.0F
;
391 unpack_RG88(const void *src
, GLfloat dst
[4])
393 const GLushort s
= *((const GLushort
*) src
);
394 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
395 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
401 unpack_RG88_REV(const void *src
, GLfloat dst
[4])
403 const GLushort s
= *((const GLushort
*) src
);
404 dst
[RCOMP
] = UBYTE_TO_FLOAT( s
& 0xff );
405 dst
[GCOMP
] = UBYTE_TO_FLOAT( s
>> 8 );
411 unpack_R16(const void *src
, GLfloat dst
[4])
413 const GLushort s
= *((const GLushort
*) src
);
414 dst
[RCOMP
] = USHORT_TO_FLOAT(s
);
421 unpack_RG1616(const void *src
, GLfloat dst
[4])
423 const GLuint s
= *((const GLuint
*) src
);
424 dst
[RCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
425 dst
[GCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
431 unpack_RG1616_REV(const void *src
, GLfloat dst
[4])
433 const GLuint s
= *((const GLuint
*) src
);
434 dst
[RCOMP
] = USHORT_TO_FLOAT( s
>> 16 );
435 dst
[GCOMP
] = USHORT_TO_FLOAT( s
& 0xffff );
441 unpack_ARGB2101010(const void *src
, GLfloat dst
[4])
443 const GLuint s
= *((const GLuint
*) src
);
444 dst
[RCOMP
] = ((s
>> 20) & 0x3ff) * (1.0F
/ 1023.0F
);
445 dst
[GCOMP
] = ((s
>> 10) & 0x3ff) * (1.0F
/ 1023.0F
);
446 dst
[BCOMP
] = ((s
>> 0) & 0x3ff) * (1.0F
/ 1023.0F
);
447 dst
[ACOMP
] = ((s
>> 30) & 0x03) * (1.0F
/ 3.0F
);
452 unpack_Z24_S8(const void *src
, GLfloat dst
[4])
454 /* only return Z, not stencil data */
455 const GLuint s
= *((const GLuint
*) src
);
456 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
457 dst
[0] = dst
[1] = dst
[2] = (s
>> 8) * scale
;
459 ASSERT(dst
[0] >= 0.0F
);
460 ASSERT(dst
[0] <= 1.0F
);
464 unpack_S8_Z24(const void *src
, GLfloat dst
[4])
466 /* only return Z, not stencil data */
467 const GLuint s
= *((const GLuint
*) src
);
468 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
469 dst
[0] = dst
[1] = dst
[2] = (s
& 0x00ffffff) * scale
;
471 ASSERT(dst
[0] >= 0.0F
);
472 ASSERT(dst
[0] <= 1.0F
);
476 unpack_Z16(const void *src
, GLfloat dst
[4])
478 const GLushort s
= *((const GLushort
*) src
);
479 dst
[0] = dst
[1] = dst
[2] = s
* (1.0F
/ 65535.0F
);
484 unpack_X8_Z24(const void *src
, GLfloat dst
[4])
486 unpack_S8_Z24(src
, dst
);
490 unpack_Z24_X8(const void *src
, GLfloat dst
[4])
492 unpack_Z24_S8(src
, dst
);
496 unpack_Z32(const void *src
, GLfloat dst
[4])
498 const GLuint s
= *((const GLuint
*) src
);
499 dst
[0] = dst
[1] = dst
[2] = s
* (1.0F
/ 0xffffffff);
504 unpack_Z32_FLOAT(const void *src
, GLfloat dst
[4])
506 const GLfloat s
= *((const GLfloat
*) src
);
507 dst
[0] = dst
[1] = dst
[2] = s
;
512 unpack_Z32_FLOAT_X24S8(const void *src
, GLfloat dst
[4])
514 const GLfloat s
= *((const GLfloat
*) src
);
515 dst
[0] = dst
[1] = dst
[2] = s
;
521 unpack_S8(const void *src
, GLfloat dst
[4])
523 /* should never be used */
524 dst
[0] = dst
[1] = dst
[2] = 0.0F
;
530 unpack_SRGB8(const void *src
, GLfloat dst
[4])
532 const GLubyte
*s
= (const GLubyte
*) src
;
533 dst
[RCOMP
] = nonlinear_to_linear(s
[2]);
534 dst
[GCOMP
] = nonlinear_to_linear(s
[1]);
535 dst
[BCOMP
] = nonlinear_to_linear(s
[0]);
540 unpack_SRGBA8(const void *src
, GLfloat dst
[4])
542 const GLuint s
= *((const GLuint
*) src
);
543 dst
[RCOMP
] = nonlinear_to_linear( (s
>> 24) );
544 dst
[GCOMP
] = nonlinear_to_linear( (s
>> 16) & 0xff );
545 dst
[BCOMP
] = nonlinear_to_linear( (s
>> 8) & 0xff );
546 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
) & 0xff ); /* linear! */
550 unpack_SARGB8(const void *src
, GLfloat dst
[4])
552 const GLuint s
= *((const GLuint
*) src
);
553 dst
[RCOMP
] = nonlinear_to_linear( (s
>> 16) & 0xff );
554 dst
[GCOMP
] = nonlinear_to_linear( (s
>> 8) & 0xff );
555 dst
[BCOMP
] = nonlinear_to_linear( (s
) & 0xff );
556 dst
[ACOMP
] = UBYTE_TO_FLOAT( (s
>> 24) ); /* linear! */
560 unpack_SL8(const void *src
, GLfloat dst
[4])
562 const GLubyte s
= *((const GLubyte
*) src
);
565 dst
[BCOMP
] = nonlinear_to_linear(s
);
570 unpack_SLA8(const void *src
, GLfloat dst
[4])
572 const GLubyte
*s
= (const GLubyte
*) src
;
575 dst
[BCOMP
] = nonlinear_to_linear(s
[0]);
576 dst
[ACOMP
] = UBYTE_TO_FLOAT(s
[1]); /* linear */
580 unpack_SRGB_DXT1(const void *src
, GLfloat dst
[4])
585 unpack_SRGBA_DXT1(const void *src
, GLfloat dst
[4])
590 unpack_SRGBA_DXT3(const void *src
, GLfloat dst
[4])
595 unpack_SRGBA_DXT5(const void *src
, GLfloat dst
[4])
600 unpack_RGB_FXT1(const void *src
, GLfloat dst
[4])
605 unpack_RGBA_FXT1(const void *src
, GLfloat dst
[4])
610 unpack_RGB_DXT1(const void *src
, GLfloat dst
[4])
615 unpack_RGBA_DXT1(const void *src
, GLfloat dst
[4])
620 unpack_RGBA_DXT3(const void *src
, GLfloat dst
[4])
625 unpack_RGBA_DXT5(const void *src
, GLfloat dst
[4])
631 unpack_RGBA_FLOAT32(const void *src
, GLfloat dst
[4])
633 const GLfloat
*s
= (const GLfloat
*) src
;
641 unpack_RGBA_FLOAT16(const void *src
, GLfloat dst
[4])
643 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
644 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
645 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
646 dst
[BCOMP
] = _mesa_half_to_float(s
[2]);
647 dst
[ACOMP
] = _mesa_half_to_float(s
[3]);
651 unpack_RGB_FLOAT32(const void *src
, GLfloat dst
[4])
653 const GLfloat
*s
= (const GLfloat
*) src
;
661 unpack_RGB_FLOAT16(const void *src
, GLfloat dst
[4])
663 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
664 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
665 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
666 dst
[BCOMP
] = _mesa_half_to_float(s
[2]);
671 unpack_ALPHA_FLOAT32(const void *src
, GLfloat dst
[4])
673 const GLfloat
*s
= (const GLfloat
*) src
;
681 unpack_ALPHA_FLOAT16(const void *src
, GLfloat dst
[4])
683 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
687 dst
[ACOMP
] = _mesa_half_to_float(s
[0]);
691 unpack_LUMINANCE_FLOAT32(const void *src
, GLfloat dst
[4])
693 const GLfloat
*s
= (const GLfloat
*) src
;
701 unpack_LUMINANCE_FLOAT16(const void *src
, GLfloat dst
[4])
703 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
706 dst
[BCOMP
] = _mesa_half_to_float(s
[0]);
711 unpack_LUMINANCE_ALPHA_FLOAT32(const void *src
, GLfloat dst
[4])
713 const GLfloat
*s
= (const GLfloat
*) src
;
721 unpack_LUMINANCE_ALPHA_FLOAT16(const void *src
, GLfloat dst
[4])
723 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
726 dst
[BCOMP
] = _mesa_half_to_float(s
[0]);
727 dst
[ACOMP
] = _mesa_half_to_float(s
[1]);
731 unpack_INTENSITY_FLOAT32(const void *src
, GLfloat dst
[4])
733 const GLfloat
*s
= (const GLfloat
*) src
;
741 unpack_INTENSITY_FLOAT16(const void *src
, GLfloat dst
[4])
743 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
751 unpack_R_FLOAT32(const void *src
, GLfloat dst
[4])
753 const GLfloat
*s
= (const GLfloat
*) src
;
761 unpack_R_FLOAT16(const void *src
, GLfloat dst
[4])
763 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
764 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
771 unpack_RG_FLOAT32(const void *src
, GLfloat dst
[4])
773 const GLfloat
*s
= (const GLfloat
*) src
;
781 unpack_RG_FLOAT16(const void *src
, GLfloat dst
[4])
783 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
784 dst
[RCOMP
] = _mesa_half_to_float(s
[0]);
785 dst
[GCOMP
] = _mesa_half_to_float(s
[1]);
792 unpack_RGBA_INT8(const void *src
, GLfloat dst
[4])
794 const GLbyte
*s
= (const GLbyte
*) src
;
795 dst
[RCOMP
] = (GLfloat
) s
[0];
796 dst
[GCOMP
] = (GLfloat
) s
[1];
797 dst
[BCOMP
] = (GLfloat
) s
[2];
798 dst
[ACOMP
] = (GLfloat
) s
[3];
802 unpack_RGBA_INT16(const void *src
, GLfloat dst
[4])
804 const GLshort
*s
= (const GLshort
*) src
;
805 dst
[RCOMP
] = (GLfloat
) s
[0];
806 dst
[GCOMP
] = (GLfloat
) s
[1];
807 dst
[BCOMP
] = (GLfloat
) s
[2];
808 dst
[ACOMP
] = (GLfloat
) s
[3];
812 unpack_RGBA_INT32(const void *src
, GLfloat dst
[4])
814 const GLint
*s
= (const GLint
*) src
;
815 dst
[RCOMP
] = (GLfloat
) s
[0];
816 dst
[GCOMP
] = (GLfloat
) s
[1];
817 dst
[BCOMP
] = (GLfloat
) s
[2];
818 dst
[ACOMP
] = (GLfloat
) s
[3];
822 unpack_RGBA_UINT8(const void *src
, GLfloat dst
[4])
824 const GLubyte
*s
= (const GLubyte
*) src
;
825 dst
[RCOMP
] = (GLfloat
) s
[0];
826 dst
[GCOMP
] = (GLfloat
) s
[1];
827 dst
[BCOMP
] = (GLfloat
) s
[2];
828 dst
[ACOMP
] = (GLfloat
) s
[3];
832 unpack_RGBA_UINT16(const void *src
, GLfloat dst
[4])
834 const GLushort
*s
= (const GLushort
*) src
;
835 dst
[RCOMP
] = (GLfloat
) s
[0];
836 dst
[GCOMP
] = (GLfloat
) s
[1];
837 dst
[BCOMP
] = (GLfloat
) s
[2];
838 dst
[ACOMP
] = (GLfloat
) s
[3];
842 unpack_RGBA_UINT32(const void *src
, GLfloat dst
[4])
844 const GLuint
*s
= (const GLuint
*) src
;
845 dst
[RCOMP
] = (GLfloat
) s
[0];
846 dst
[GCOMP
] = (GLfloat
) s
[1];
847 dst
[BCOMP
] = (GLfloat
) s
[2];
848 dst
[ACOMP
] = (GLfloat
) s
[3];
852 unpack_DUDV8(const void *src
, GLfloat dst
[4])
854 const GLbyte
*s
= (const GLbyte
*) src
;
855 dst
[RCOMP
] = BYTE_TO_FLOAT(s
[0]);
856 dst
[GCOMP
] = BYTE_TO_FLOAT(s
[1]);
862 unpack_SIGNED_R8(const void *src
, GLfloat dst
[4])
864 const GLbyte s
= *((const GLbyte
*) src
);
865 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( s
);
872 unpack_SIGNED_RG88_REV(const void *src
, GLfloat dst
[4])
874 const GLushort s
= *((const GLushort
*) src
);
875 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
& 0xff) );
876 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
882 unpack_SIGNED_RGBX8888(const void *src
, GLfloat dst
[4])
884 const GLuint s
= *((const GLuint
*) src
);
885 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
886 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
887 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
892 unpack_SIGNED_RGBA8888(const void *src
, GLfloat dst
[4])
894 const GLuint s
= *((const GLuint
*) src
);
895 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
896 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
897 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
898 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
) );
902 unpack_SIGNED_RGBA8888_REV(const void *src
, GLfloat dst
[4])
904 const GLuint s
= *((const GLuint
*) src
);
905 dst
[RCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
) );
906 dst
[GCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
907 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 16) );
908 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 24) );
912 unpack_SIGNED_R16(const void *src
, GLfloat dst
[4])
914 const GLshort s
= *((const GLshort
*) src
);
915 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
);
922 unpack_SIGNED_GR1616(const void *src
, GLfloat dst
[4])
928 unpack_SIGNED_RGB_16(const void *src
, GLfloat dst
[4])
930 const GLshort
*s
= (const GLshort
*) src
;
931 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
932 dst
[GCOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
933 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[2] );
938 unpack_SIGNED_RGBA_16(const void *src
, GLfloat dst
[4])
940 const GLshort
*s
= (const GLshort
*) src
;
941 dst
[RCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
942 dst
[GCOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
943 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[2] );
944 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
[3] );
948 unpack_RGBA_16(const void *src
, GLfloat dst
[4])
950 const GLshort
*s
= (const GLshort
*) src
;
951 dst
[RCOMP
] = USHORT_TO_FLOAT( s
[0] );
952 dst
[GCOMP
] = USHORT_TO_FLOAT( s
[1] );
953 dst
[BCOMP
] = USHORT_TO_FLOAT( s
[2] );
954 dst
[ACOMP
] = USHORT_TO_FLOAT( s
[3] );
958 unpack_RED_RGTC1(const void *src
, GLfloat dst
[4])
964 unpack_SIGNED_RED_RGTC1(const void *src
, GLfloat dst
[4])
970 unpack_RG_RGTC2(const void *src
, GLfloat dst
[4])
976 unpack_SIGNED_RG_RGTC2(const void *src
, GLfloat dst
[4])
982 unpack_L_LATC1(const void *src
, GLfloat dst
[4])
988 unpack_SIGNED_L_LATC1(const void *src
, GLfloat dst
[4])
994 unpack_LA_LATC2(const void *src
, GLfloat dst
[4])
1000 unpack_SIGNED_LA_LATC2(const void *src
, GLfloat dst
[4])
1006 unpack_SIGNED_A8(const void *src
, GLfloat dst
[4])
1008 const GLbyte s
= *((const GLbyte
*) src
);
1012 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( s
);
1016 unpack_SIGNED_L8(const void *src
, GLfloat dst
[4])
1018 const GLbyte s
= *((const GLbyte
*) src
);
1021 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( s
);
1026 unpack_SIGNED_AL88(const void *src
, GLfloat dst
[4])
1028 const GLushort s
= *((const GLshort
*) src
);
1031 dst
[BCOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
& 0xff) );
1032 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( (GLbyte
) (s
>> 8) );
1036 unpack_SIGNED_I8(const void *src
, GLfloat dst
[4])
1038 const GLbyte s
= *((const GLbyte
*) src
);
1042 dst
[ACOMP
] = BYTE_TO_FLOAT_TEX( s
);
1046 unpack_SIGNED_A16(const void *src
, GLfloat dst
[4])
1048 const GLshort s
= *((const GLshort
*) src
);
1052 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
);
1056 unpack_SIGNED_L16(const void *src
, GLfloat dst
[4])
1058 const GLshort s
= *((const GLshort
*) src
);
1061 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
);
1066 unpack_SIGNED_AL1616(const void *src
, GLfloat dst
[4])
1068 const GLshort
*s
= (const GLshort
*) src
;
1071 dst
[BCOMP
] = SHORT_TO_FLOAT_TEX( s
[0] );
1072 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
[1] );
1076 unpack_SIGNED_I16(const void *src
, GLfloat dst
[4])
1078 const GLshort s
= *((const GLshort
*) src
);
1082 dst
[ACOMP
] = SHORT_TO_FLOAT_TEX( s
);
1086 unpack_RGB9_E5_FLOAT(const void *src
, GLfloat dst
[4])
1088 const GLuint
*s
= (const GLuint
*) src
;
1089 rgb9e5_to_float3(*s
, dst
);
1094 unpack_R11_G11_B10_FLOAT(const void *src
, GLfloat dst
[4])
1096 const GLuint
*s
= (const GLuint
*) src
;
1097 r11g11b10f_to_float3(*s
, dst
);
1103 * Return the unpacker function for the given format.
1105 static unpack_rgba_func
1106 get_unpack_rgba_function(gl_format format
)
1108 static unpack_rgba_func table
[MESA_FORMAT_COUNT
];
1109 static GLboolean initialized
= GL_FALSE
;
1112 table
[MESA_FORMAT_NONE
] = NULL
;
1114 table
[MESA_FORMAT_RGBA8888
] = unpack_RGBA8888
;
1115 table
[MESA_FORMAT_RGBA8888_REV
] = unpack_RGBA8888_REV
;
1116 table
[MESA_FORMAT_ARGB8888
] = unpack_ARGB8888
;
1117 table
[MESA_FORMAT_ARGB8888_REV
] = unpack_ARGB8888_REV
;
1118 table
[MESA_FORMAT_XRGB8888
] = unpack_XRGB8888
;
1119 table
[MESA_FORMAT_XRGB8888_REV
] = unpack_XRGB8888_REV
;
1120 table
[MESA_FORMAT_RGB888
] = unpack_RGB888
;
1121 table
[MESA_FORMAT_BGR888
] = unpack_BGR888
;
1122 table
[MESA_FORMAT_RGB565
] = unpack_RGB565
;
1123 table
[MESA_FORMAT_RGB565_REV
] = unpack_RGB565_REV
;
1124 table
[MESA_FORMAT_ARGB4444
] = unpack_ARGB4444
;
1125 table
[MESA_FORMAT_ARGB4444_REV
] = unpack_ARGB4444_REV
;
1126 table
[MESA_FORMAT_RGBA5551
] = unpack_RGBA5551
;
1127 table
[MESA_FORMAT_ARGB1555
] = unpack_ARGB1555
;
1128 table
[MESA_FORMAT_ARGB1555_REV
] = unpack_ARGB1555_REV
;
1129 table
[MESA_FORMAT_AL44
] = unpack_AL44
;
1130 table
[MESA_FORMAT_AL88
] = unpack_AL88
;
1131 table
[MESA_FORMAT_AL88_REV
] = unpack_AL88_REV
;
1132 table
[MESA_FORMAT_AL1616
] = unpack_AL1616
;
1133 table
[MESA_FORMAT_AL1616_REV
] = unpack_AL1616_REV
;
1134 table
[MESA_FORMAT_RGB332
] = unpack_RGB332
;
1135 table
[MESA_FORMAT_A8
] = unpack_A8
;
1136 table
[MESA_FORMAT_A16
] = unpack_A16
;
1137 table
[MESA_FORMAT_L8
] = unpack_L8
;
1138 table
[MESA_FORMAT_L16
] = unpack_L16
;
1139 table
[MESA_FORMAT_I8
] = unpack_I8
;
1140 table
[MESA_FORMAT_I16
] = unpack_I16
;
1141 table
[MESA_FORMAT_YCBCR
] = unpack_YCBCR
;
1142 table
[MESA_FORMAT_YCBCR_REV
] = unpack_YCBCR_REV
;
1143 table
[MESA_FORMAT_R8
] = unpack_R8
;
1144 table
[MESA_FORMAT_RG88
] = unpack_RG88
;
1145 table
[MESA_FORMAT_RG88_REV
] = unpack_RG88_REV
;
1146 table
[MESA_FORMAT_R16
] = unpack_R16
;
1147 table
[MESA_FORMAT_RG1616
] = unpack_RG1616
;
1148 table
[MESA_FORMAT_RG1616_REV
] = unpack_RG1616_REV
;
1149 table
[MESA_FORMAT_ARGB2101010
] = unpack_ARGB2101010
;
1150 table
[MESA_FORMAT_Z24_S8
] = unpack_Z24_S8
;
1151 table
[MESA_FORMAT_S8_Z24
] = unpack_S8_Z24
;
1152 table
[MESA_FORMAT_Z16
] = unpack_Z16
;
1153 table
[MESA_FORMAT_X8_Z24
] = unpack_X8_Z24
;
1154 table
[MESA_FORMAT_Z24_X8
] = unpack_Z24_X8
;
1155 table
[MESA_FORMAT_Z32
] = unpack_Z32
;
1156 table
[MESA_FORMAT_S8
] = unpack_S8
;
1157 table
[MESA_FORMAT_SRGB8
] = unpack_SRGB8
;
1158 table
[MESA_FORMAT_SRGBA8
] = unpack_SRGBA8
;
1159 table
[MESA_FORMAT_SARGB8
] = unpack_SARGB8
;
1160 table
[MESA_FORMAT_SL8
] = unpack_SL8
;
1161 table
[MESA_FORMAT_SLA8
] = unpack_SLA8
;
1162 table
[MESA_FORMAT_SRGB_DXT1
] = unpack_SRGB_DXT1
;
1163 table
[MESA_FORMAT_SRGBA_DXT1
] = unpack_SRGBA_DXT1
;
1164 table
[MESA_FORMAT_SRGBA_DXT3
] = unpack_SRGBA_DXT3
;
1165 table
[MESA_FORMAT_SRGBA_DXT5
] = unpack_SRGBA_DXT5
;
1167 table
[MESA_FORMAT_RGB_FXT1
] = unpack_RGB_FXT1
;
1168 table
[MESA_FORMAT_RGBA_FXT1
] = unpack_RGBA_FXT1
;
1169 table
[MESA_FORMAT_RGB_DXT1
] = unpack_RGB_DXT1
;
1170 table
[MESA_FORMAT_RGBA_DXT1
] = unpack_RGBA_DXT1
;
1171 table
[MESA_FORMAT_RGBA_DXT3
] = unpack_RGBA_DXT3
;
1172 table
[MESA_FORMAT_RGBA_DXT5
] = unpack_RGBA_DXT5
;
1174 table
[MESA_FORMAT_RGBA_FLOAT32
] = unpack_RGBA_FLOAT32
;
1175 table
[MESA_FORMAT_RGBA_FLOAT16
] = unpack_RGBA_FLOAT16
;
1176 table
[MESA_FORMAT_RGB_FLOAT32
] = unpack_RGB_FLOAT32
;
1177 table
[MESA_FORMAT_RGB_FLOAT16
] = unpack_RGB_FLOAT16
;
1178 table
[MESA_FORMAT_ALPHA_FLOAT32
] = unpack_ALPHA_FLOAT32
;
1179 table
[MESA_FORMAT_ALPHA_FLOAT16
] = unpack_ALPHA_FLOAT16
;
1180 table
[MESA_FORMAT_LUMINANCE_FLOAT32
] = unpack_LUMINANCE_FLOAT32
;
1181 table
[MESA_FORMAT_LUMINANCE_FLOAT16
] = unpack_LUMINANCE_FLOAT16
;
1182 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
] = unpack_LUMINANCE_ALPHA_FLOAT32
;
1183 table
[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
] = unpack_LUMINANCE_ALPHA_FLOAT16
;
1184 table
[MESA_FORMAT_INTENSITY_FLOAT32
] = unpack_INTENSITY_FLOAT32
;
1185 table
[MESA_FORMAT_INTENSITY_FLOAT16
] = unpack_INTENSITY_FLOAT16
;
1186 table
[MESA_FORMAT_R_FLOAT32
] = unpack_R_FLOAT32
;
1187 table
[MESA_FORMAT_R_FLOAT16
] = unpack_R_FLOAT16
;
1188 table
[MESA_FORMAT_RG_FLOAT32
] = unpack_RG_FLOAT32
;
1189 table
[MESA_FORMAT_RG_FLOAT16
] = unpack_RG_FLOAT16
;
1191 table
[MESA_FORMAT_RGBA_INT8
] = unpack_RGBA_INT8
;
1192 table
[MESA_FORMAT_RGBA_INT16
] = unpack_RGBA_INT16
;
1193 table
[MESA_FORMAT_RGBA_INT32
] = unpack_RGBA_INT32
;
1194 table
[MESA_FORMAT_RGBA_UINT8
] = unpack_RGBA_UINT8
;
1195 table
[MESA_FORMAT_RGBA_UINT16
] = unpack_RGBA_UINT16
;
1196 table
[MESA_FORMAT_RGBA_UINT32
] = unpack_RGBA_UINT32
;
1198 table
[MESA_FORMAT_DUDV8
] = unpack_DUDV8
;
1199 table
[MESA_FORMAT_SIGNED_R8
] = unpack_SIGNED_R8
;
1200 table
[MESA_FORMAT_SIGNED_RG88_REV
] = unpack_SIGNED_RG88_REV
;
1201 table
[MESA_FORMAT_SIGNED_RGBX8888
] = unpack_SIGNED_RGBX8888
;
1202 table
[MESA_FORMAT_SIGNED_RGBA8888
] = unpack_SIGNED_RGBA8888
;
1203 table
[MESA_FORMAT_SIGNED_RGBA8888_REV
] = unpack_SIGNED_RGBA8888_REV
;
1204 table
[MESA_FORMAT_SIGNED_R16
] = unpack_SIGNED_R16
;
1205 table
[MESA_FORMAT_SIGNED_GR1616
] = unpack_SIGNED_GR1616
;
1206 table
[MESA_FORMAT_SIGNED_RGB_16
] = unpack_SIGNED_RGB_16
;
1207 table
[MESA_FORMAT_SIGNED_RGBA_16
] = unpack_SIGNED_RGBA_16
;
1208 table
[MESA_FORMAT_RGBA_16
] = unpack_RGBA_16
;
1210 table
[MESA_FORMAT_RED_RGTC1
] = unpack_RED_RGTC1
;
1211 table
[MESA_FORMAT_SIGNED_RED_RGTC1
] = unpack_SIGNED_RED_RGTC1
;
1212 table
[MESA_FORMAT_RG_RGTC2
] = unpack_RG_RGTC2
;
1213 table
[MESA_FORMAT_SIGNED_RG_RGTC2
] = unpack_SIGNED_RG_RGTC2
;
1215 table
[MESA_FORMAT_L_LATC1
] = unpack_L_LATC1
;
1216 table
[MESA_FORMAT_SIGNED_L_LATC1
] = unpack_SIGNED_L_LATC1
;
1217 table
[MESA_FORMAT_LA_LATC2
] = unpack_LA_LATC2
;
1218 table
[MESA_FORMAT_SIGNED_LA_LATC2
] = unpack_SIGNED_LA_LATC2
;
1220 table
[MESA_FORMAT_SIGNED_A8
] = unpack_SIGNED_A8
;
1221 table
[MESA_FORMAT_SIGNED_L8
] = unpack_SIGNED_L8
;
1222 table
[MESA_FORMAT_SIGNED_AL88
] = unpack_SIGNED_AL88
;
1223 table
[MESA_FORMAT_SIGNED_I8
] = unpack_SIGNED_I8
;
1224 table
[MESA_FORMAT_SIGNED_A16
] = unpack_SIGNED_A16
;
1225 table
[MESA_FORMAT_SIGNED_L16
] = unpack_SIGNED_L16
;
1226 table
[MESA_FORMAT_SIGNED_AL1616
] = unpack_SIGNED_AL1616
;
1227 table
[MESA_FORMAT_SIGNED_I16
] = unpack_SIGNED_I16
;
1229 table
[MESA_FORMAT_RGB9_E5_FLOAT
] = unpack_RGB9_E5_FLOAT
;
1230 table
[MESA_FORMAT_R11_G11_B10_FLOAT
] = unpack_R11_G11_B10_FLOAT
;
1232 table
[MESA_FORMAT_Z32_FLOAT
] = unpack_Z32_FLOAT
;
1233 table
[MESA_FORMAT_Z32_FLOAT_X24S8
] = unpack_Z32_FLOAT_X24S8
;
1235 initialized
= GL_TRUE
;
1238 return table
[format
];
1243 _mesa_unpack_rgba_row(gl_format format
, GLuint n
,
1244 const void *src
, GLfloat dst
[][4])
1246 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
1247 GLuint srcStride
= _mesa_get_format_bytes(format
);
1248 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1251 for (i
= 0; i
< n
; i
++) {
1252 unpack(srcPtr
, dst
[i
]);
1253 srcPtr
+= srcStride
;
1260 * Unpack a 2D rect of pixels returning float RGBA colors.
1261 * \param format the source image format
1262 * \param src start address of the source image
1263 * \param srcRowStride source image row stride in bytes
1264 * \param dst start address of the dest image
1265 * \param dstRowStride dest image row stride in bytes
1266 * \param x source image start X pos
1267 * \param y source image start Y pos
1268 * \param width width of rect region to convert
1269 * \param height height of rect region to convert
1272 _mesa_unpack_rgba_block(gl_format format
,
1273 const void *src
, GLint srcRowStride
,
1274 GLfloat dst
[][4], GLint dstRowStride
,
1275 GLuint x
, GLuint y
, GLuint width
, GLuint height
)
1277 unpack_rgba_func unpack
= get_unpack_rgba_function(format
);
1278 const GLuint srcPixStride
= _mesa_get_format_bytes(format
);
1279 const GLuint dstPixStride
= 4 * sizeof(GLfloat
);
1280 const GLubyte
*srcRow
, *srcPix
;
1285 /* XXX needs to be fixed for compressed formats */
1287 srcRow
= ((const GLubyte
*) src
) + srcRowStride
* y
+ srcPixStride
* x
;
1288 dstRow
= ((GLubyte
*) dst
) + dstRowStride
* y
+ dstPixStride
* x
;
1290 for (i
= 0; i
< height
; i
++) {
1292 dstPix
= (GLfloat
*) dstRow
;
1294 for (j
= 0; j
< width
; j
++) {
1295 unpack(srcPix
, dstPix
);
1296 srcPix
+= srcPixStride
;
1297 dstPix
+= dstPixStride
;
1300 dstRow
+= dstRowStride
;
1301 srcRow
+= srcRowStride
;
1308 typedef void (*unpack_float_z_func
)(const void *src
, GLfloat
*dst
);
1311 unpack_float_z_Z24_S8(const void *src
, GLfloat
*dst
)
1313 /* only return Z, not stencil data */
1314 const GLuint s
= *((const GLuint
*) src
);
1315 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
1316 *dst
= (s
>> 8) * scale
;
1317 ASSERT(*dst
>= 0.0F
);
1318 ASSERT(*dst
<= 1.0F
);
1322 unpack_float_z_S8_Z24(const void *src
, GLfloat
*dst
)
1324 /* only return Z, not stencil data */
1325 const GLuint s
= *((const GLuint
*) src
);
1326 const GLfloat scale
= 1.0F
/ (GLfloat
) 0xffffff;
1327 *dst
= (s
& 0x00ffffff) * scale
;
1328 ASSERT(*dst
>= 0.0F
);
1329 ASSERT(*dst
<= 1.0F
);
1333 unpack_float_z_Z16(const void *src
, GLfloat
*dst
)
1335 const GLushort s
= *((const GLushort
*) src
);
1336 *dst
= s
* (1.0F
/ 65535.0F
);
1340 unpack_float_z_X8_Z24(const void *src
, GLfloat
*dst
)
1342 unpack_float_z_S8_Z24(src
, dst
);
1346 unpack_float_z_Z24_X8(const void *src
, GLfloat
*dst
)
1348 unpack_float_z_Z24_S8(src
, dst
);
1352 unpack_float_z_Z32(const void *src
, GLfloat
*dst
)
1354 const GLuint s
= *((const GLuint
*) src
);
1355 *dst
= s
* (1.0F
/ 0xffffffff);
1359 unpack_float_z_Z32X24S8(const void *src
, GLfloat
*dst
)
1361 *dst
= *((const GLfloat
*) src
);
1367 _mesa_unpack_float_z_row(gl_format format
, GLuint n
,
1368 const void *src
, GLfloat
*dst
)
1370 unpack_float_z_func unpack
;
1371 GLuint srcStride
= _mesa_get_format_bytes(format
);
1372 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1376 case MESA_FORMAT_Z24_S8
:
1377 unpack
= unpack_float_z_Z24_S8
;
1379 case MESA_FORMAT_S8_Z24
:
1380 unpack
= unpack_float_z_S8_Z24
;
1382 case MESA_FORMAT_Z16
:
1383 unpack
= unpack_float_z_Z16
;
1385 case MESA_FORMAT_X8_Z24
:
1386 unpack
= unpack_float_z_X8_Z24
;
1388 case MESA_FORMAT_Z24_X8
:
1389 unpack
= unpack_float_z_Z24_X8
;
1391 case MESA_FORMAT_Z32
:
1392 unpack
= unpack_float_z_Z32
;
1394 case MESA_FORMAT_Z32_FLOAT_X24S8
:
1395 unpack
= unpack_float_z_Z32X24S8
;
1398 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_float_z_row",
1399 _mesa_get_format_name(format
));
1403 for (i
= 0; i
< n
; i
++) {
1404 unpack(srcPtr
, &dst
[i
]);
1405 srcPtr
+= srcStride
;
1411 typedef void (*unpack_uint_z_func
)(const void *src
, GLuint
*dst
);
1414 unpack_uint_z_Z24_S8(const void *src
, GLuint
*dst
)
1416 /* only return Z, not stencil data */
1417 const GLuint s
= *((const GLuint
*) src
);
1422 unpack_uint_z_S8_Z24(const void *src
, GLuint
*dst
)
1424 /* only return Z, not stencil data */
1425 const GLuint s
= *((const GLuint
*) src
);
1426 *dst
= s
& 0x00ffffff;
1430 unpack_uint_z_Z16(const void *src
, GLuint
*dst
)
1432 *dst
= *((const GLushort
*) src
);
1436 unpack_uint_z_X8_Z24(const void *src
, GLuint
*dst
)
1438 unpack_uint_z_S8_Z24(src
, dst
);
1442 unpack_uint_z_Z24_X8(const void *src
, GLuint
*dst
)
1444 unpack_uint_z_Z24_S8(src
, dst
);
1448 unpack_uint_z_Z32(const void *src
, GLuint
*dst
)
1450 *dst
= *((const GLuint
*) src
);
1455 _mesa_unpack_uint_z_row(gl_format format
, GLuint n
,
1456 const void *src
, GLuint
*dst
)
1458 unpack_uint_z_func unpack
;
1459 GLuint srcStride
= _mesa_get_format_bytes(format
);
1460 const GLubyte
*srcPtr
= (GLubyte
*) src
;
1464 case MESA_FORMAT_Z24_S8
:
1465 unpack
= unpack_uint_z_Z24_S8
;
1467 case MESA_FORMAT_S8_Z24
:
1468 unpack
= unpack_uint_z_S8_Z24
;
1470 case MESA_FORMAT_Z16
:
1471 unpack
= unpack_uint_z_Z16
;
1473 case MESA_FORMAT_X8_Z24
:
1474 unpack
= unpack_uint_z_X8_Z24
;
1476 case MESA_FORMAT_Z24_X8
:
1477 unpack
= unpack_uint_z_Z24_X8
;
1479 case MESA_FORMAT_Z32
:
1480 unpack
= unpack_uint_z_Z32
;
1483 _mesa_problem(NULL
, "bad format %s in _mesa_unpack_uint_z_row",
1484 _mesa_get_format_name(format
));
1488 for (i
= 0; i
< n
; i
++) {
1489 unpack(srcPtr
, &dst
[i
]);
1490 srcPtr
+= srcStride
;