2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. 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 * THEA AUTHORS 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.
28 * Image and pixel span packing and unpacking.
40 #include "pixeltransfer.h"
43 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
44 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
46 #include "u_format_rgb9e5.h"
47 #include "u_format_r11g11b10f.h"
52 * Flip the 8 bits in each byte of the given array.
55 * \param n number of bytes.
57 * \todo try this trick to flip bytes someday:
59 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
60 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
61 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
65 flip_bytes( GLubyte
*p
, GLuint n
)
68 for (i
= 0; i
< n
; i
++) {
69 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
70 a
= ((b
& 0x01) << 7) |
85 * Unpack a 32x32 pixel polygon stipple from user memory using the
86 * current pixel unpack settings.
89 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
90 const struct gl_pixelstore_attrib
*unpacking
)
92 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
94 /* Convert pattern from GLubytes to GLuints and handle big/little
99 for (i
= 0; i
< 32; i
++) {
100 dest
[i
] = (p
[0] << 24)
112 * Pack polygon stipple into user memory given current pixel packing
116 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
117 const struct gl_pixelstore_attrib
*packing
)
119 /* Convert pattern from GLuints to GLubytes to handle big/little
120 * endian differences.
124 for (i
= 0; i
< 32; i
++) {
125 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
126 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
127 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
128 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
131 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
136 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
137 * order with row alignment = 1 byte.
140 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
141 const struct gl_pixelstore_attrib
*packing
)
143 GLint bytes
, row
, width_in_bytes
;
144 GLubyte
*buffer
, *dst
;
149 /* Alloc dest storage */
150 bytes
= ((width
+ 7) / 8 * height
);
151 buffer
= (GLubyte
*) malloc( bytes
);
155 width_in_bytes
= CEILING( width
, 8 );
157 for (row
= 0; row
< height
; row
++) {
158 const GLubyte
*src
= (const GLubyte
*)
159 _mesa_image_address2d(packing
, pixels
, width
, height
,
160 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
166 if ((packing
->SkipPixels
& 7) == 0) {
167 memcpy( dst
, src
, width_in_bytes
);
168 if (packing
->LsbFirst
) {
169 flip_bytes( dst
, width_in_bytes
);
173 /* handling SkipPixels is a bit tricky (no pun intended!) */
175 if (packing
->LsbFirst
) {
176 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
177 GLubyte dstMask
= 128;
178 const GLubyte
*s
= src
;
181 for (i
= 0; i
< width
; i
++) {
185 if (srcMask
== 128) {
190 srcMask
= srcMask
<< 1;
198 dstMask
= dstMask
>> 1;
203 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
204 GLubyte dstMask
= 128;
205 const GLubyte
*s
= src
;
208 for (i
= 0; i
< width
; i
++) {
217 srcMask
= srcMask
>> 1;
225 dstMask
= dstMask
>> 1;
230 dst
+= width_in_bytes
;
241 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
242 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
244 GLint row
, width_in_bytes
;
250 width_in_bytes
= CEILING( width
, 8 );
252 for (row
= 0; row
< height
; row
++) {
253 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
254 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
258 if ((packing
->SkipPixels
& 7) == 0) {
259 memcpy( dst
, src
, width_in_bytes
);
260 if (packing
->LsbFirst
) {
261 flip_bytes( dst
, width_in_bytes
);
265 /* handling SkipPixels is a bit tricky (no pun intended!) */
267 if (packing
->LsbFirst
) {
268 GLubyte srcMask
= 128;
269 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
270 const GLubyte
*s
= src
;
273 for (i
= 0; i
< width
; i
++) {
282 srcMask
= srcMask
>> 1;
284 if (dstMask
== 128) {
290 dstMask
= dstMask
<< 1;
295 GLubyte srcMask
= 128;
296 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
297 const GLubyte
*s
= src
;
300 for (i
= 0; i
< width
; i
++) {
309 srcMask
= srcMask
>> 1;
317 dstMask
= dstMask
>> 1;
322 src
+= width_in_bytes
;
328 * Get indexes of color components for a basic color format, such as
329 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
333 get_component_indexes(GLenum format
,
338 GLint
*luminanceIndex
,
339 GLint
*intensityIndex
)
345 *luminanceIndex
= -1;
346 *intensityIndex
= -1;
350 case GL_LUMINANCE_INTEGER_EXT
:
353 case GL_LUMINANCE_ALPHA
:
354 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
362 case GL_RED_INTEGER_EXT
:
366 case GL_GREEN_INTEGER_EXT
:
370 case GL_BLUE_INTEGER_EXT
:
374 case GL_ALPHA_INTEGER_EXT
:
383 case GL_RGB_INTEGER_EXT
:
389 case GL_BGR_INTEGER_EXT
:
395 case GL_RGBA_INTEGER_EXT
:
402 case GL_BGRA_INTEGER
:
420 assert(0 && "bad format in get_component_indexes()");
427 * For small integer types, return the min and max possible values.
428 * Used for clamping floats to unscaled integer types.
429 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
432 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
439 case GL_UNSIGNED_BYTE
:
447 case GL_UNSIGNED_SHORT
:
456 /* Customization of integer packing. We always treat src as uint, and can pack dst
457 * as any integer type/format combo.
459 #define SRC_TYPE GLuint
461 #define DST_TYPE GLuint
462 #define SRC_CONVERT(x) (x)
463 #define FN_NAME pack_uint_from_uint_rgba
464 #include "pack_tmp.h"
469 #define DST_TYPE GLushort
470 #define SRC_CONVERT(x) MIN2(x, 0xffff)
471 #define FN_NAME pack_ushort_from_uint_rgba
472 #include "pack_tmp.h"
477 #define DST_TYPE GLshort
478 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
479 #define FN_NAME pack_short_from_uint_rgba
480 #include "pack_tmp.h"
485 #define DST_TYPE GLubyte
486 #define SRC_CONVERT(x) MIN2(x, 0xff)
487 #define FN_NAME pack_ubyte_from_uint_rgba
488 #include "pack_tmp.h"
493 #define DST_TYPE GLbyte
494 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
495 #define FN_NAME pack_byte_from_uint_rgba
496 #include "pack_tmp.h"
502 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
503 GLenum dstFormat
, GLenum dstType
,
507 case GL_UNSIGNED_INT
:
508 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
511 /* No conversion necessary. */
512 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
514 case GL_UNSIGNED_SHORT
:
515 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
518 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
520 case GL_UNSIGNED_BYTE
:
521 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
524 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
534 * Used to pack an array [][4] of RGBA float colors as specified
535 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
536 * Historically, the RGBA values were in [0,1] and rescaled to fit
537 * into GLubytes, etc. But with new integer formats, the RGBA values
538 * may have any value and we don't always rescale when converting to
541 * Note: the rgba values will be modified by this function when any pixel
542 * transfer ops are enabled.
545 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
546 GLenum dstFormat
, GLenum dstType
,
548 const struct gl_pixelstore_attrib
*dstPacking
,
549 GLbitfield transferOps
)
552 const GLint comps
= _mesa_components_in_format(dstFormat
);
553 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
556 if (dstFormat
== GL_LUMINANCE
||
557 dstFormat
== GL_LUMINANCE_ALPHA
||
558 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
559 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
560 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
562 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
570 /* EXT_texture_integer specifies no transfer ops on integer
571 * types in the resolved issues section. Just set them to 0
572 * for integer surfaces.
578 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
582 * Component clamping (besides clamping to [0,1] in
583 * _mesa_apply_rgba_transfer_ops()).
586 /* clamping to dest type's min/max values */
588 if (get_type_min_max(dstType
, &min
, &max
)) {
589 for (i
= 0; i
< n
; i
++) {
590 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
591 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
592 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
593 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
597 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
598 /* compute luminance values */
599 if (transferOps
& IMAGE_CLAMP_BIT
) {
600 for (i
= 0; i
< n
; i
++) {
601 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
602 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
606 for (i
= 0; i
< n
; i
++) {
607 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
613 * Pack/store the pixels. Ugh! Lots of cases!!!
616 case GL_UNSIGNED_BYTE
:
618 GLubyte
*dst
= (GLubyte
*) dstAddr
;
622 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
626 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
630 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
634 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
638 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
640 case GL_LUMINANCE_ALPHA
:
642 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
643 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
648 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
649 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
654 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
655 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
656 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
661 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
662 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
663 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
664 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
669 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
670 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
671 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
676 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
677 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
678 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
679 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
684 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
685 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
686 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
687 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
690 case GL_RED_INTEGER_EXT
:
692 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
695 case GL_GREEN_INTEGER_EXT
:
697 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
700 case GL_BLUE_INTEGER_EXT
:
702 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
705 case GL_ALPHA_INTEGER_EXT
:
707 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
712 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
713 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
716 case GL_RGB_INTEGER_EXT
:
718 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
719 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
720 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
723 case GL_RGBA_INTEGER_EXT
:
725 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
726 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
727 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
728 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
731 case GL_BGR_INTEGER_EXT
:
733 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
734 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
735 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
738 case GL_BGRA_INTEGER_EXT
:
740 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
741 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
742 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
743 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
746 case GL_LUMINANCE_INTEGER_EXT
:
748 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
751 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
754 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
756 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
764 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
765 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
769 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
775 GLbyte
*dst
= (GLbyte
*) dstAddr
;
779 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
783 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
787 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
791 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
795 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
797 case GL_LUMINANCE_ALPHA
:
799 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
800 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
805 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
806 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
811 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
812 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
813 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
818 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
819 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
820 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
821 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
826 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
827 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
828 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
833 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
834 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
835 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
836 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
841 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
842 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
843 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
844 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
847 case GL_RED_INTEGER_EXT
:
849 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
852 case GL_GREEN_INTEGER_EXT
:
854 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
857 case GL_BLUE_INTEGER_EXT
:
859 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
862 case GL_ALPHA_INTEGER_EXT
:
864 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
869 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
870 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
873 case GL_RGB_INTEGER_EXT
:
875 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
876 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
877 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
880 case GL_RGBA_INTEGER_EXT
:
882 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
883 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
884 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
885 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
888 case GL_BGR_INTEGER_EXT
:
890 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
891 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
892 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
895 case GL_BGRA_INTEGER_EXT
:
897 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
898 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
899 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
900 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
903 case GL_LUMINANCE_INTEGER_EXT
:
905 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
908 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
911 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
913 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
921 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
922 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
926 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
930 case GL_UNSIGNED_SHORT
:
932 GLushort
*dst
= (GLushort
*) dstAddr
;
936 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
940 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
944 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
952 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
954 case GL_LUMINANCE_ALPHA
:
956 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
957 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
962 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
968 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
969 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
975 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
976 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
977 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
983 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
984 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
990 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
991 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
992 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
993 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
998 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
999 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1000 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1001 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1004 case GL_RED_INTEGER_EXT
:
1006 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1009 case GL_GREEN_INTEGER_EXT
:
1011 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1014 case GL_BLUE_INTEGER_EXT
:
1016 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1019 case GL_ALPHA_INTEGER_EXT
:
1021 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1026 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1027 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1030 case GL_RGB_INTEGER_EXT
:
1032 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1033 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1034 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1037 case GL_RGBA_INTEGER_EXT
:
1039 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1040 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1041 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1042 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1045 case GL_BGR_INTEGER_EXT
:
1047 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1048 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1049 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1052 case GL_BGRA_INTEGER_EXT
:
1054 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1055 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1056 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1057 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1060 case GL_LUMINANCE_INTEGER_EXT
:
1062 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1065 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1068 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1070 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1078 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1079 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1083 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1089 GLshort
*dst
= (GLshort
*) dstAddr
;
1090 switch (dstFormat
) {
1093 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1097 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1101 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1105 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1109 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1111 case GL_LUMINANCE_ALPHA
:
1113 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1114 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1119 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1120 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1125 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1126 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1127 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1132 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1133 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1134 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1135 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1140 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1141 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1142 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1147 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1148 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1149 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1150 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1155 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1156 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1157 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1158 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1161 case GL_RED_INTEGER_EXT
:
1163 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1166 case GL_GREEN_INTEGER_EXT
:
1168 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1171 case GL_BLUE_INTEGER_EXT
:
1173 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1176 case GL_ALPHA_INTEGER_EXT
:
1178 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1183 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1184 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1187 case GL_RGB_INTEGER_EXT
:
1189 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1190 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1191 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1194 case GL_RGBA_INTEGER_EXT
:
1196 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1197 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1198 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1199 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1202 case GL_BGR_INTEGER_EXT
:
1204 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1205 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1206 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1209 case GL_BGRA_INTEGER_EXT
:
1211 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1212 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1213 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1214 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1217 case GL_LUMINANCE_INTEGER_EXT
:
1219 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1222 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1225 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1227 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1235 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1236 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1240 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1244 case GL_UNSIGNED_INT
:
1246 GLuint
*dst
= (GLuint
*) dstAddr
;
1247 switch (dstFormat
) {
1250 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1254 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1258 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1262 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1266 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1268 case GL_LUMINANCE_ALPHA
:
1270 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1271 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1276 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1277 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1282 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1283 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1284 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1289 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1290 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1291 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1292 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1297 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1298 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1299 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1304 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1305 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1306 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1307 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1312 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1313 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1314 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1315 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1318 case GL_RED_INTEGER_EXT
:
1320 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1323 case GL_GREEN_INTEGER_EXT
:
1325 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1328 case GL_BLUE_INTEGER_EXT
:
1330 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1333 case GL_ALPHA_INTEGER_EXT
:
1335 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1340 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1341 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1344 case GL_RGB_INTEGER_EXT
:
1346 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1347 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1348 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1351 case GL_RGBA_INTEGER_EXT
:
1353 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1354 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1355 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1356 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1359 case GL_BGR_INTEGER_EXT
:
1361 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1362 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1363 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1366 case GL_BGRA_INTEGER_EXT
:
1368 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1369 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1370 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1371 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1374 case GL_LUMINANCE_INTEGER_EXT
:
1376 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1379 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1382 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1384 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1392 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1393 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1397 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1403 GLint
*dst
= (GLint
*) dstAddr
;
1404 switch (dstFormat
) {
1407 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1411 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1415 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1419 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1423 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1425 case GL_LUMINANCE_ALPHA
:
1427 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1428 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1433 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1434 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1439 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1440 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1441 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1446 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1447 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1448 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1449 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1454 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1455 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1456 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1461 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1462 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1463 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1464 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1469 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1470 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1471 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1472 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1478 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1479 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1482 case GL_RED_INTEGER_EXT
:
1484 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1487 case GL_GREEN_INTEGER_EXT
:
1489 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1492 case GL_BLUE_INTEGER_EXT
:
1494 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1497 case GL_ALPHA_INTEGER_EXT
:
1499 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1504 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1505 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1508 case GL_RGB_INTEGER_EXT
:
1510 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1511 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1512 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1515 case GL_RGBA_INTEGER_EXT
:
1517 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1518 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1519 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1520 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1523 case GL_BGR_INTEGER_EXT
:
1525 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1526 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1527 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1530 case GL_BGRA_INTEGER_EXT
:
1532 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1533 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1534 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1535 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1538 case GL_LUMINANCE_INTEGER_EXT
:
1540 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1543 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1546 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1548 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1554 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1560 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1561 switch (dstFormat
) {
1564 dst
[i
] = rgba
[i
][RCOMP
];
1568 dst
[i
] = rgba
[i
][GCOMP
];
1572 dst
[i
] = rgba
[i
][BCOMP
];
1576 dst
[i
] = rgba
[i
][ACOMP
];
1580 dst
[i
] = luminance
[i
];
1582 case GL_LUMINANCE_ALPHA
:
1584 dst
[i
*2+0] = luminance
[i
];
1585 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1590 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1591 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1596 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1597 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1598 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1603 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1604 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1605 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1606 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1611 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1612 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1613 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1618 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1619 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1620 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1621 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1626 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1627 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1628 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1629 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1635 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1636 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1640 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1644 case GL_HALF_FLOAT_ARB
:
1646 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1647 switch (dstFormat
) {
1650 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1654 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1658 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1662 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1666 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1668 case GL_LUMINANCE_ALPHA
:
1670 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1671 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1676 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1677 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1682 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1683 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1684 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1689 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1690 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1691 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1692 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1697 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1698 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1699 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1704 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1705 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1706 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1707 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1712 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1713 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1714 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1715 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1721 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1722 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1726 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1730 case GL_UNSIGNED_BYTE_3_3_2
:
1731 if (dstFormat
== GL_RGB
) {
1732 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1734 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1735 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1736 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1740 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1741 if (dstFormat
== GL_RGB
) {
1742 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1744 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1745 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1746 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1750 case GL_UNSIGNED_SHORT_5_6_5
:
1751 if (dstFormat
== GL_RGB
) {
1752 GLushort
*dst
= (GLushort
*) dstAddr
;
1754 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1755 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1756 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1760 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1761 if (dstFormat
== GL_RGB
) {
1762 GLushort
*dst
= (GLushort
*) dstAddr
;
1764 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1765 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1766 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1770 case GL_UNSIGNED_SHORT_4_4_4_4
:
1771 if (dstFormat
== GL_RGBA
) {
1772 GLushort
*dst
= (GLushort
*) dstAddr
;
1774 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1775 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1776 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1777 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1780 else if (dstFormat
== GL_BGRA
) {
1781 GLushort
*dst
= (GLushort
*) dstAddr
;
1783 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1784 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1785 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1786 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1789 else if (dstFormat
== GL_ABGR_EXT
) {
1790 GLushort
*dst
= (GLushort
*) dstAddr
;
1792 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1793 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1794 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1795 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1799 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1800 if (dstFormat
== GL_RGBA
) {
1801 GLushort
*dst
= (GLushort
*) dstAddr
;
1803 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1804 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1805 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1806 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1809 else if (dstFormat
== GL_BGRA
) {
1810 GLushort
*dst
= (GLushort
*) dstAddr
;
1812 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1813 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1814 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1815 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1818 else if (dstFormat
== GL_ABGR_EXT
) {
1819 GLushort
*dst
= (GLushort
*) dstAddr
;
1821 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1822 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1823 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1824 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1828 case GL_UNSIGNED_SHORT_5_5_5_1
:
1829 if (dstFormat
== GL_RGBA
) {
1830 GLushort
*dst
= (GLushort
*) dstAddr
;
1832 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1833 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1834 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1835 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1838 else if (dstFormat
== GL_BGRA
) {
1839 GLushort
*dst
= (GLushort
*) dstAddr
;
1841 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1842 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1843 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1844 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1847 else if (dstFormat
== GL_ABGR_EXT
) {
1848 GLushort
*dst
= (GLushort
*) dstAddr
;
1850 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1851 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1852 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1853 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1857 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1858 if (dstFormat
== GL_RGBA
) {
1859 GLushort
*dst
= (GLushort
*) dstAddr
;
1861 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1862 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1863 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1864 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1867 else if (dstFormat
== GL_BGRA
) {
1868 GLushort
*dst
= (GLushort
*) dstAddr
;
1870 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1871 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1872 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1873 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1876 else if (dstFormat
== GL_ABGR_EXT
) {
1877 GLushort
*dst
= (GLushort
*) dstAddr
;
1879 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1880 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1881 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1882 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1886 case GL_UNSIGNED_INT_8_8_8_8
:
1887 if (dstFormat
== GL_RGBA
) {
1888 GLuint
*dst
= (GLuint
*) dstAddr
;
1890 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1891 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1892 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1893 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1896 else if (dstFormat
== GL_BGRA
) {
1897 GLuint
*dst
= (GLuint
*) dstAddr
;
1899 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1900 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1901 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1902 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1905 else if (dstFormat
== GL_ABGR_EXT
) {
1906 GLuint
*dst
= (GLuint
*) dstAddr
;
1908 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1909 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1910 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1911 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1915 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1916 if (dstFormat
== GL_RGBA
) {
1917 GLuint
*dst
= (GLuint
*) dstAddr
;
1919 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1920 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1921 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1922 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1925 else if (dstFormat
== GL_BGRA
) {
1926 GLuint
*dst
= (GLuint
*) dstAddr
;
1928 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1929 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1930 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1931 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1934 else if (dstFormat
== GL_ABGR_EXT
) {
1935 GLuint
*dst
= (GLuint
*) dstAddr
;
1937 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1938 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1939 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1940 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1944 case GL_UNSIGNED_INT_10_10_10_2
:
1945 if (dstFormat
== GL_RGBA
) {
1946 GLuint
*dst
= (GLuint
*) dstAddr
;
1948 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1949 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1950 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1951 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1954 else if (dstFormat
== GL_BGRA
) {
1955 GLuint
*dst
= (GLuint
*) dstAddr
;
1957 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1958 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1959 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1960 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1963 else if (dstFormat
== GL_ABGR_EXT
) {
1964 GLuint
*dst
= (GLuint
*) dstAddr
;
1966 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1967 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1968 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1969 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1973 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1974 if (dstFormat
== GL_RGBA
) {
1975 GLuint
*dst
= (GLuint
*) dstAddr
;
1977 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1978 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1979 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1980 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1983 else if (dstFormat
== GL_BGRA
) {
1984 GLuint
*dst
= (GLuint
*) dstAddr
;
1986 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1987 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1988 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1989 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1992 else if (dstFormat
== GL_ABGR_EXT
) {
1993 GLuint
*dst
= (GLuint
*) dstAddr
;
1995 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1996 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1997 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1998 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2002 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2004 GLuint
*dst
= (GLuint
*) dstAddr
;
2005 for (i
= 0; i
< n
; i
++) {
2006 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2010 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2012 GLuint
*dst
= (GLuint
*) dstAddr
;
2013 for (i
= 0; i
< n
; i
++) {
2014 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2019 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2024 if (dstPacking
->SwapBytes
) {
2025 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2026 if (swapSize
== 2) {
2027 if (dstPacking
->SwapBytes
) {
2028 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2031 else if (swapSize
== 4) {
2032 if (dstPacking
->SwapBytes
) {
2033 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2043 #define SWAP2BYTE(VALUE) \
2045 GLubyte *bytes = (GLubyte *) &(VALUE); \
2046 GLubyte tmp = bytes[0]; \
2047 bytes[0] = bytes[1]; \
2051 #define SWAP4BYTE(VALUE) \
2053 GLubyte *bytes = (GLubyte *) &(VALUE); \
2054 GLubyte tmp = bytes[0]; \
2055 bytes[0] = bytes[3]; \
2058 bytes[1] = bytes[2]; \
2064 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2065 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2066 const struct gl_pixelstore_attrib
*unpack
)
2068 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2070 ASSERT(srcType
== GL_BITMAP
||
2071 srcType
== GL_UNSIGNED_BYTE
||
2072 srcType
== GL_BYTE
||
2073 srcType
== GL_UNSIGNED_SHORT
||
2074 srcType
== GL_SHORT
||
2075 srcType
== GL_UNSIGNED_INT
||
2076 srcType
== GL_INT
||
2077 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2078 srcType
== GL_HALF_FLOAT_ARB
||
2079 srcType
== GL_FLOAT
||
2080 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2085 GLubyte
*ubsrc
= (GLubyte
*) src
;
2086 if (unpack
->LsbFirst
) {
2087 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2089 for (i
= 0; i
< n
; i
++) {
2090 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2101 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2103 for (i
= 0; i
< n
; i
++) {
2104 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2116 case GL_UNSIGNED_BYTE
:
2119 const GLubyte
*s
= (const GLubyte
*) src
;
2120 for (i
= 0; i
< n
; i
++)
2127 const GLbyte
*s
= (const GLbyte
*) src
;
2128 for (i
= 0; i
< n
; i
++)
2132 case GL_UNSIGNED_SHORT
:
2135 const GLushort
*s
= (const GLushort
*) src
;
2136 if (unpack
->SwapBytes
) {
2137 for (i
= 0; i
< n
; i
++) {
2138 GLushort value
= s
[i
];
2144 for (i
= 0; i
< n
; i
++)
2152 const GLshort
*s
= (const GLshort
*) src
;
2153 if (unpack
->SwapBytes
) {
2154 for (i
= 0; i
< n
; i
++) {
2155 GLshort value
= s
[i
];
2161 for (i
= 0; i
< n
; i
++)
2166 case GL_UNSIGNED_INT
:
2169 const GLuint
*s
= (const GLuint
*) src
;
2170 if (unpack
->SwapBytes
) {
2171 for (i
= 0; i
< n
; i
++) {
2172 GLuint value
= s
[i
];
2178 for (i
= 0; i
< n
; i
++)
2186 const GLint
*s
= (const GLint
*) src
;
2187 if (unpack
->SwapBytes
) {
2188 for (i
= 0; i
< n
; i
++) {
2195 for (i
= 0; i
< n
; i
++)
2203 const GLfloat
*s
= (const GLfloat
*) src
;
2204 if (unpack
->SwapBytes
) {
2205 for (i
= 0; i
< n
; i
++) {
2206 GLfloat value
= s
[i
];
2208 indexes
[i
] = (GLuint
) value
;
2212 for (i
= 0; i
< n
; i
++)
2213 indexes
[i
] = (GLuint
) s
[i
];
2217 case GL_HALF_FLOAT_ARB
:
2220 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2221 if (unpack
->SwapBytes
) {
2222 for (i
= 0; i
< n
; i
++) {
2223 GLhalfARB value
= s
[i
];
2225 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2229 for (i
= 0; i
< n
; i
++)
2230 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2234 case GL_UNSIGNED_INT_24_8_EXT
:
2237 const GLuint
*s
= (const GLuint
*) src
;
2238 if (unpack
->SwapBytes
) {
2239 for (i
= 0; i
< n
; i
++) {
2240 GLuint value
= s
[i
];
2242 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2246 for (i
= 0; i
< n
; i
++)
2247 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2251 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2254 const GLuint
*s
= (const GLuint
*) src
;
2255 if (unpack
->SwapBytes
) {
2256 for (i
= 0; i
< n
; i
++) {
2257 GLuint value
= s
[i
*2+1];
2259 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2263 for (i
= 0; i
< n
; i
++)
2264 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2270 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2277 * Return source/dest RGBA indexes for unpacking pixels.
2280 get_component_mapping(GLenum format
,
2292 case GL_RED_INTEGER_EXT
:
2294 *gSrc
= *bSrc
= *aSrc
= -1;
2297 case GL_GREEN_INTEGER_EXT
:
2299 *rSrc
= *bSrc
= *aSrc
= -1;
2302 case GL_BLUE_INTEGER_EXT
:
2304 *rSrc
= *gSrc
= *aSrc
= -1;
2307 case GL_ALPHA_INTEGER_EXT
:
2308 *rSrc
= *gSrc
= *bSrc
= -1;
2312 case GL_LUMINANCE_INTEGER_EXT
:
2313 *rSrc
= *gSrc
= *bSrc
= 0;
2316 case GL_LUMINANCE_ALPHA
:
2317 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2318 *rSrc
= *gSrc
= *bSrc
= 0;
2322 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2336 case GL_RGB_INTEGER
:
2347 case GL_BGR_INTEGER
:
2358 case GL_RGBA_INTEGER
:
2369 case GL_BGRA_INTEGER
:
2397 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2398 _mesa_lookup_enum_by_nr(format
));
2406 * This function extracts floating point RGBA values from arbitrary
2407 * image data. srcFormat and srcType are the format and type parameters
2408 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2410 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2411 * implements the "Conversion to floating point", "Conversion to RGB",
2412 * and "Final Expansion to RGBA" operations.
2414 * Args: n - number of pixels
2415 * rgba - output colors
2416 * srcFormat - format of incoming data
2417 * srcType - data type of incoming data
2418 * src - source data pointer
2419 * swapBytes - perform byteswapping of incoming data?
2422 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2423 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2424 GLboolean swapBytes
)
2426 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2428 GLint rDst
, bDst
, gDst
, aDst
;
2429 GLboolean intFormat
;
2430 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2432 ASSERT(srcFormat
== GL_RED
||
2433 srcFormat
== GL_GREEN
||
2434 srcFormat
== GL_BLUE
||
2435 srcFormat
== GL_ALPHA
||
2436 srcFormat
== GL_LUMINANCE
||
2437 srcFormat
== GL_LUMINANCE_ALPHA
||
2438 srcFormat
== GL_INTENSITY
||
2439 srcFormat
== GL_RG
||
2440 srcFormat
== GL_RGB
||
2441 srcFormat
== GL_BGR
||
2442 srcFormat
== GL_RGBA
||
2443 srcFormat
== GL_BGRA
||
2444 srcFormat
== GL_ABGR_EXT
||
2445 srcFormat
== GL_DU8DV8_ATI
||
2446 srcFormat
== GL_DUDV_ATI
||
2447 srcFormat
== GL_RED_INTEGER_EXT
||
2448 srcFormat
== GL_GREEN_INTEGER_EXT
||
2449 srcFormat
== GL_BLUE_INTEGER_EXT
||
2450 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2451 srcFormat
== GL_RG_INTEGER
||
2452 srcFormat
== GL_RGB_INTEGER_EXT
||
2453 srcFormat
== GL_RGBA_INTEGER_EXT
||
2454 srcFormat
== GL_BGR_INTEGER_EXT
||
2455 srcFormat
== GL_BGRA_INTEGER_EXT
||
2456 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2457 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2459 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2460 srcType
== GL_BYTE
||
2461 srcType
== GL_UNSIGNED_SHORT
||
2462 srcType
== GL_SHORT
||
2463 srcType
== GL_UNSIGNED_INT
||
2464 srcType
== GL_INT
||
2465 srcType
== GL_HALF_FLOAT_ARB
||
2466 srcType
== GL_FLOAT
||
2467 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2468 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2469 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2470 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2471 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2472 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2473 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2474 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2475 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2476 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2477 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2478 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2479 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2480 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2482 get_component_mapping(srcFormat
,
2483 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2484 &rDst
, &gDst
, &bDst
, &aDst
);
2486 stride
= _mesa_components_in_format(srcFormat
);
2488 intFormat
= _mesa_is_integer_format(srcFormat
);
2490 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2491 if ((SRC_INDEX) < 0) { \
2494 for (i = 0; i < n; i++) { \
2495 rgba[i][DST_INDEX] = DEFAULT_INT; \
2499 for (i = 0; i < n; i++) { \
2500 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2504 else if (swapBytes) { \
2505 const TYPE *s = (const TYPE *) src; \
2507 for (i = 0; i < n; i++) { \
2508 TYPE value = s[SRC_INDEX]; \
2509 if (sizeof(TYPE) == 2) { \
2512 else if (sizeof(TYPE) == 4) { \
2516 rgba[i][DST_INDEX] = (GLfloat) value; \
2518 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2523 const TYPE *s = (const TYPE *) src; \
2526 for (i = 0; i < n; i++) { \
2527 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2532 for (i = 0; i < n; i++) { \
2533 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2540 case GL_UNSIGNED_BYTE
:
2541 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2542 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2543 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2544 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2547 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2548 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2549 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2550 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2552 case GL_UNSIGNED_SHORT
:
2553 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2554 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2555 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2556 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2559 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2560 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2561 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2562 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2564 case GL_UNSIGNED_INT
:
2565 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2566 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2567 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2568 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2571 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2572 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2573 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2574 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2577 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2578 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2579 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2580 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2582 case GL_HALF_FLOAT_ARB
:
2583 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2584 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2585 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2586 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2588 case GL_UNSIGNED_BYTE_3_3_2
:
2590 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2597 for (i
= 0; i
< n
; i
++) {
2598 GLubyte p
= ubsrc
[i
];
2599 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2600 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2601 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2602 rgba
[i
][aDst
] = 1.0F
;
2606 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2608 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2615 for (i
= 0; i
< n
; i
++) {
2616 GLubyte p
= ubsrc
[i
];
2617 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2618 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2619 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2620 rgba
[i
][aDst
] = 1.0F
;
2624 case GL_UNSIGNED_SHORT_5_6_5
:
2631 const GLushort
*ussrc
= (const GLushort
*) src
;
2633 for (i
= 0; i
< n
; i
++) {
2634 GLushort p
= ussrc
[i
];
2636 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2637 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2638 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2639 rgba
[i
][aDst
] = 1.0F
;
2643 const GLushort
*ussrc
= (const GLushort
*) src
;
2645 for (i
= 0; i
< n
; i
++) {
2646 GLushort p
= ussrc
[i
];
2647 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2648 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2649 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2650 rgba
[i
][aDst
] = 1.0F
;
2654 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2661 const GLushort
*ussrc
= (const GLushort
*) src
;
2663 for (i
= 0; i
< n
; i
++) {
2664 GLushort p
= ussrc
[i
];
2666 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2667 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2668 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2669 rgba
[i
][aDst
] = 1.0F
;
2673 const GLushort
*ussrc
= (const GLushort
*) src
;
2675 for (i
= 0; i
< n
; i
++) {
2676 GLushort p
= ussrc
[i
];
2677 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2678 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2679 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2680 rgba
[i
][aDst
] = 1.0F
;
2684 case GL_UNSIGNED_SHORT_4_4_4_4
:
2686 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2689 const GLushort
*ussrc
= (const GLushort
*) src
;
2691 for (i
= 0; i
< n
; i
++) {
2692 GLushort p
= ussrc
[i
];
2694 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2695 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2696 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2697 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2701 const GLushort
*ussrc
= (const GLushort
*) src
;
2703 for (i
= 0; i
< n
; i
++) {
2704 GLushort p
= ussrc
[i
];
2705 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2706 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2707 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2708 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2712 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2714 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2717 const GLushort
*ussrc
= (const GLushort
*) src
;
2719 for (i
= 0; i
< n
; i
++) {
2720 GLushort p
= ussrc
[i
];
2722 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2723 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2724 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2725 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2729 const GLushort
*ussrc
= (const GLushort
*) src
;
2731 for (i
= 0; i
< n
; i
++) {
2732 GLushort p
= ussrc
[i
];
2733 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2734 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2735 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2736 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2740 case GL_UNSIGNED_SHORT_5_5_5_1
:
2742 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2745 const GLushort
*ussrc
= (const GLushort
*) src
;
2747 for (i
= 0; i
< n
; i
++) {
2748 GLushort p
= ussrc
[i
];
2750 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2751 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2752 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2753 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2757 const GLushort
*ussrc
= (const GLushort
*) src
;
2759 for (i
= 0; i
< n
; i
++) {
2760 GLushort p
= ussrc
[i
];
2761 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2762 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2763 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2764 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2768 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2770 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2773 const GLushort
*ussrc
= (const GLushort
*) src
;
2775 for (i
= 0; i
< n
; i
++) {
2776 GLushort p
= ussrc
[i
];
2778 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2779 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2780 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2781 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2785 const GLushort
*ussrc
= (const GLushort
*) src
;
2787 for (i
= 0; i
< n
; i
++) {
2788 GLushort p
= ussrc
[i
];
2789 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2790 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2791 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2792 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2796 case GL_UNSIGNED_INT_8_8_8_8
:
2798 const GLuint
*uisrc
= (const GLuint
*) src
;
2801 for (i
= 0; i
< n
; i
++) {
2802 GLuint p
= uisrc
[i
];
2803 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2804 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2805 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2806 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2810 for (i
= 0; i
< n
; i
++) {
2811 GLuint p
= uisrc
[i
];
2812 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2813 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2814 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2815 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2820 const GLuint
*uisrc
= (const GLuint
*) src
;
2823 for (i
= 0; i
< n
; i
++) {
2824 GLuint p
= uisrc
[i
];
2825 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2826 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2827 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2828 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2832 for (i
= 0; i
< n
; i
++) {
2833 GLuint p
= uisrc
[i
];
2834 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2835 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2836 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2837 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2842 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2844 const GLuint
*uisrc
= (const GLuint
*) src
;
2847 for (i
= 0; i
< n
; i
++) {
2848 GLuint p
= uisrc
[i
];
2849 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2850 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2851 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2852 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2856 for (i
= 0; i
< n
; i
++) {
2857 GLuint p
= uisrc
[i
];
2858 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2859 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2860 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2861 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2866 const GLuint
*uisrc
= (const GLuint
*) src
;
2869 for (i
= 0; i
< n
; i
++) {
2870 GLuint p
= uisrc
[i
];
2871 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2872 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2873 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2874 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2878 for (i
= 0; i
< n
; i
++) {
2879 GLuint p
= uisrc
[i
];
2880 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2881 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2882 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2883 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2888 case GL_UNSIGNED_INT_10_10_10_2
:
2890 rs
= 1.0F
/ 1023.0F
;
2891 gs
= 1.0F
/ 1023.0F
;
2892 bs
= 1.0F
/ 1023.0F
;
2896 const GLuint
*uisrc
= (const GLuint
*) src
;
2898 for (i
= 0; i
< n
; i
++) {
2899 GLuint p
= uisrc
[i
];
2901 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2902 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2903 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2904 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2908 const GLuint
*uisrc
= (const GLuint
*) src
;
2910 for (i
= 0; i
< n
; i
++) {
2911 GLuint p
= uisrc
[i
];
2912 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2913 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2914 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2915 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2919 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2921 rs
= 1.0F
/ 1023.0F
;
2922 gs
= 1.0F
/ 1023.0F
;
2923 bs
= 1.0F
/ 1023.0F
;
2927 const GLuint
*uisrc
= (const GLuint
*) src
;
2929 for (i
= 0; i
< n
; i
++) {
2930 GLuint p
= uisrc
[i
];
2932 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2933 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2934 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2935 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2939 const GLuint
*uisrc
= (const GLuint
*) src
;
2941 for (i
= 0; i
< n
; i
++) {
2942 GLuint p
= uisrc
[i
];
2943 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2944 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2945 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2946 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2950 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2952 const GLuint
*uisrc
= (const GLuint
*) src
;
2955 for (i
= 0; i
< n
; i
++) {
2956 GLuint p
= uisrc
[i
];
2958 rgb9e5_to_float3(p
, f
);
2959 rgba
[i
][rDst
] = f
[0];
2960 rgba
[i
][gDst
] = f
[1];
2961 rgba
[i
][bDst
] = f
[2];
2962 rgba
[i
][aDst
] = 1.0F
;
2966 const GLuint
*uisrc
= (const GLuint
*) src
;
2969 for (i
= 0; i
< n
; i
++) {
2970 rgb9e5_to_float3(uisrc
[i
], f
);
2971 rgba
[i
][rDst
] = f
[0];
2972 rgba
[i
][gDst
] = f
[1];
2973 rgba
[i
][bDst
] = f
[2];
2974 rgba
[i
][aDst
] = 1.0F
;
2978 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2980 const GLuint
*uisrc
= (const GLuint
*) src
;
2983 for (i
= 0; i
< n
; i
++) {
2984 GLuint p
= uisrc
[i
];
2986 r11g11b10f_to_float3(p
, f
);
2987 rgba
[i
][rDst
] = f
[0];
2988 rgba
[i
][gDst
] = f
[1];
2989 rgba
[i
][bDst
] = f
[2];
2990 rgba
[i
][aDst
] = 1.0F
;
2994 const GLuint
*uisrc
= (const GLuint
*) src
;
2997 for (i
= 0; i
< n
; i
++) {
2998 r11g11b10f_to_float3(uisrc
[i
], f
);
2999 rgba
[i
][rDst
] = f
[0];
3000 rgba
[i
][gDst
] = f
[1];
3001 rgba
[i
][bDst
] = f
[2];
3002 rgba
[i
][aDst
] = 1.0F
;
3007 _mesa_problem(NULL
, "bad srcType in extract float data");
3014 static inline GLuint
3015 clamp_float_to_uint(GLfloat f
)
3017 return f
< 0.0F
? 0 : IROUND(f
);
3021 static inline GLuint
3022 clamp_half_to_uint(GLhalfARB h
)
3024 GLfloat f
= _mesa_half_to_float(h
);
3025 return f
< 0.0F
? 0 : IROUND(f
);
3030 * \sa extract_float_rgba()
3033 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3034 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3035 GLboolean swapBytes
)
3037 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3039 GLint rDst
, bDst
, gDst
, aDst
;
3041 ASSERT(srcFormat
== GL_RED
||
3042 srcFormat
== GL_GREEN
||
3043 srcFormat
== GL_BLUE
||
3044 srcFormat
== GL_ALPHA
||
3045 srcFormat
== GL_LUMINANCE
||
3046 srcFormat
== GL_LUMINANCE_ALPHA
||
3047 srcFormat
== GL_INTENSITY
||
3048 srcFormat
== GL_RG
||
3049 srcFormat
== GL_RGB
||
3050 srcFormat
== GL_BGR
||
3051 srcFormat
== GL_RGBA
||
3052 srcFormat
== GL_BGRA
||
3053 srcFormat
== GL_ABGR_EXT
||
3054 srcFormat
== GL_DU8DV8_ATI
||
3055 srcFormat
== GL_DUDV_ATI
||
3056 srcFormat
== GL_RED_INTEGER_EXT
||
3057 srcFormat
== GL_RG_INTEGER
||
3058 srcFormat
== GL_GREEN_INTEGER_EXT
||
3059 srcFormat
== GL_BLUE_INTEGER_EXT
||
3060 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3061 srcFormat
== GL_RGB_INTEGER_EXT
||
3062 srcFormat
== GL_RGBA_INTEGER_EXT
||
3063 srcFormat
== GL_BGR_INTEGER_EXT
||
3064 srcFormat
== GL_BGRA_INTEGER_EXT
||
3065 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3066 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3068 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3069 srcType
== GL_BYTE
||
3070 srcType
== GL_UNSIGNED_SHORT
||
3071 srcType
== GL_SHORT
||
3072 srcType
== GL_UNSIGNED_INT
||
3073 srcType
== GL_INT
||
3074 srcType
== GL_HALF_FLOAT_ARB
||
3075 srcType
== GL_FLOAT
||
3076 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3077 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3078 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3079 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3080 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3081 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3082 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3083 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3084 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3085 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3086 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3087 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3088 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3089 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3091 get_component_mapping(srcFormat
,
3092 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3093 &rDst
, &gDst
, &bDst
, &aDst
);
3095 stride
= _mesa_components_in_format(srcFormat
);
3097 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3098 if ((SRC_INDEX) < 0) { \
3100 for (i = 0; i < n; i++) { \
3101 rgba[i][DST_INDEX] = DEFAULT; \
3104 else if (swapBytes) { \
3105 const TYPE *s = (const TYPE *) src; \
3107 for (i = 0; i < n; i++) { \
3108 TYPE value = s[SRC_INDEX]; \
3109 if (sizeof(TYPE) == 2) { \
3112 else if (sizeof(TYPE) == 4) { \
3115 rgba[i][DST_INDEX] = CONVERSION(value); \
3120 const TYPE *s = (const TYPE *) src; \
3122 for (i = 0; i < n; i++) { \
3123 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3129 case GL_UNSIGNED_BYTE
:
3130 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3131 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3132 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3133 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3136 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3137 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3138 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3139 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3141 case GL_UNSIGNED_SHORT
:
3142 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3143 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3144 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3145 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3148 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3149 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3150 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3151 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3153 case GL_UNSIGNED_INT
:
3154 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3155 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3156 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3157 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3160 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3161 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3162 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3163 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3166 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3167 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3168 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3169 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3171 case GL_HALF_FLOAT_ARB
:
3172 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3173 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3174 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3175 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3177 case GL_UNSIGNED_BYTE_3_3_2
:
3179 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3181 for (i
= 0; i
< n
; i
++) {
3182 GLubyte p
= ubsrc
[i
];
3183 rgba
[i
][rDst
] = ((p
>> 5) );
3184 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3185 rgba
[i
][bDst
] = ((p
) & 0x3);
3190 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3192 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3194 for (i
= 0; i
< n
; i
++) {
3195 GLubyte p
= ubsrc
[i
];
3196 rgba
[i
][rDst
] = ((p
) & 0x7);
3197 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3198 rgba
[i
][bDst
] = ((p
>> 6) );
3203 case GL_UNSIGNED_SHORT_5_6_5
:
3205 const GLushort
*ussrc
= (const GLushort
*) src
;
3207 for (i
= 0; i
< n
; i
++) {
3208 GLushort p
= ussrc
[i
];
3210 rgba
[i
][rDst
] = ((p
>> 11) );
3211 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3212 rgba
[i
][bDst
] = ((p
) & 0x1f);
3217 const GLushort
*ussrc
= (const GLushort
*) src
;
3219 for (i
= 0; i
< n
; i
++) {
3220 GLushort p
= ussrc
[i
];
3221 rgba
[i
][rDst
] = ((p
>> 11) );
3222 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3223 rgba
[i
][bDst
] = ((p
) & 0x1f);
3228 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3230 const GLushort
*ussrc
= (const GLushort
*) src
;
3232 for (i
= 0; i
< n
; i
++) {
3233 GLushort p
= ussrc
[i
];
3235 rgba
[i
][rDst
] = ((p
) & 0x1f);
3236 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3237 rgba
[i
][bDst
] = ((p
>> 11) );
3242 const GLushort
*ussrc
= (const GLushort
*) src
;
3244 for (i
= 0; i
< n
; i
++) {
3245 GLushort p
= ussrc
[i
];
3246 rgba
[i
][rDst
] = ((p
) & 0x1f);
3247 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3248 rgba
[i
][bDst
] = ((p
>> 11) );
3253 case GL_UNSIGNED_SHORT_4_4_4_4
:
3255 const GLushort
*ussrc
= (const GLushort
*) src
;
3257 for (i
= 0; i
< n
; i
++) {
3258 GLushort p
= ussrc
[i
];
3260 rgba
[i
][rDst
] = ((p
>> 12) );
3261 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3262 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3263 rgba
[i
][aDst
] = ((p
) & 0xf);
3267 const GLushort
*ussrc
= (const GLushort
*) src
;
3269 for (i
= 0; i
< n
; i
++) {
3270 GLushort p
= ussrc
[i
];
3271 rgba
[i
][rDst
] = ((p
>> 12) );
3272 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3273 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3274 rgba
[i
][aDst
] = ((p
) & 0xf);
3278 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3280 const GLushort
*ussrc
= (const GLushort
*) src
;
3282 for (i
= 0; i
< n
; i
++) {
3283 GLushort p
= ussrc
[i
];
3285 rgba
[i
][rDst
] = ((p
) & 0xf);
3286 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3287 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3288 rgba
[i
][aDst
] = ((p
>> 12) );
3292 const GLushort
*ussrc
= (const GLushort
*) src
;
3294 for (i
= 0; i
< n
; i
++) {
3295 GLushort p
= ussrc
[i
];
3296 rgba
[i
][rDst
] = ((p
) & 0xf);
3297 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3298 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3299 rgba
[i
][aDst
] = ((p
>> 12) );
3303 case GL_UNSIGNED_SHORT_5_5_5_1
:
3305 const GLushort
*ussrc
= (const GLushort
*) src
;
3307 for (i
= 0; i
< n
; i
++) {
3308 GLushort p
= ussrc
[i
];
3310 rgba
[i
][rDst
] = ((p
>> 11) );
3311 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3312 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3313 rgba
[i
][aDst
] = ((p
) & 0x1 );
3317 const GLushort
*ussrc
= (const GLushort
*) src
;
3319 for (i
= 0; i
< n
; i
++) {
3320 GLushort p
= ussrc
[i
];
3321 rgba
[i
][rDst
] = ((p
>> 11) );
3322 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3323 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3324 rgba
[i
][aDst
] = ((p
) & 0x1 );
3328 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3330 const GLushort
*ussrc
= (const GLushort
*) src
;
3332 for (i
= 0; i
< n
; i
++) {
3333 GLushort p
= ussrc
[i
];
3335 rgba
[i
][rDst
] = ((p
) & 0x1f);
3336 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3337 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3338 rgba
[i
][aDst
] = ((p
>> 15) );
3342 const GLushort
*ussrc
= (const GLushort
*) src
;
3344 for (i
= 0; i
< n
; i
++) {
3345 GLushort p
= ussrc
[i
];
3346 rgba
[i
][rDst
] = ((p
) & 0x1f);
3347 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3348 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3349 rgba
[i
][aDst
] = ((p
>> 15) );
3353 case GL_UNSIGNED_INT_8_8_8_8
:
3355 const GLuint
*uisrc
= (const GLuint
*) src
;
3357 for (i
= 0; i
< n
; i
++) {
3358 GLuint p
= uisrc
[i
];
3359 rgba
[i
][rDst
] = ((p
) & 0xff);
3360 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3361 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3362 rgba
[i
][aDst
] = ((p
>> 24) );
3366 const GLuint
*uisrc
= (const GLuint
*) src
;
3368 for (i
= 0; i
< n
; i
++) {
3369 GLuint p
= uisrc
[i
];
3370 rgba
[i
][rDst
] = ((p
>> 24) );
3371 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3372 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3373 rgba
[i
][aDst
] = ((p
) & 0xff);
3377 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3379 const GLuint
*uisrc
= (const GLuint
*) src
;
3381 for (i
= 0; i
< n
; i
++) {
3382 GLuint p
= uisrc
[i
];
3383 rgba
[i
][rDst
] = ((p
>> 24) );
3384 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3385 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3386 rgba
[i
][aDst
] = ((p
) & 0xff);
3390 const GLuint
*uisrc
= (const GLuint
*) src
;
3392 for (i
= 0; i
< n
; i
++) {
3393 GLuint p
= uisrc
[i
];
3394 rgba
[i
][rDst
] = ((p
) & 0xff);
3395 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3396 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3397 rgba
[i
][aDst
] = ((p
>> 24) );
3401 case GL_UNSIGNED_INT_10_10_10_2
:
3403 const GLuint
*uisrc
= (const GLuint
*) src
;
3405 for (i
= 0; i
< n
; i
++) {
3406 GLuint p
= uisrc
[i
];
3408 rgba
[i
][rDst
] = ((p
>> 22) );
3409 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3410 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3411 rgba
[i
][aDst
] = ((p
) & 0x3 );
3415 const GLuint
*uisrc
= (const GLuint
*) src
;
3417 for (i
= 0; i
< n
; i
++) {
3418 GLuint p
= uisrc
[i
];
3419 rgba
[i
][rDst
] = ((p
>> 22) );
3420 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3421 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3422 rgba
[i
][aDst
] = ((p
) & 0x3 );
3426 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3428 const GLuint
*uisrc
= (const GLuint
*) src
;
3430 for (i
= 0; i
< n
; i
++) {
3431 GLuint p
= uisrc
[i
];
3433 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3434 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3435 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3436 rgba
[i
][aDst
] = ((p
>> 30) );
3440 const GLuint
*uisrc
= (const GLuint
*) src
;
3442 for (i
= 0; i
< n
; i
++) {
3443 GLuint p
= uisrc
[i
];
3444 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3445 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3446 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3447 rgba
[i
][aDst
] = ((p
>> 30) );
3451 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3453 const GLuint
*uisrc
= (const GLuint
*) src
;
3456 for (i
= 0; i
< n
; i
++) {
3457 GLuint p
= uisrc
[i
];
3459 rgb9e5_to_float3(p
, f
);
3460 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3461 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3462 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3467 const GLuint
*uisrc
= (const GLuint
*) src
;
3470 for (i
= 0; i
< n
; i
++) {
3471 GLuint p
= uisrc
[i
];
3472 rgb9e5_to_float3(p
, f
);
3473 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3474 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3475 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3480 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3482 const GLuint
*uisrc
= (const GLuint
*) src
;
3485 for (i
= 0; i
< n
; i
++) {
3486 GLuint p
= uisrc
[i
];
3488 r11g11b10f_to_float3(p
, f
);
3489 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3490 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3491 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3496 const GLuint
*uisrc
= (const GLuint
*) src
;
3499 for (i
= 0; i
< n
; i
++) {
3500 GLuint p
= uisrc
[i
];
3501 r11g11b10f_to_float3(p
, f
);
3502 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3503 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3504 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3510 _mesa_problem(NULL
, "bad srcType in extract uint data");
3519 * Unpack a row of color image data from a client buffer according to
3520 * the pixel unpacking parameters.
3521 * Return GLubyte values in the specified dest image format.
3522 * This is used by glDrawPixels and glTexImage?D().
3523 * \param ctx - the context
3524 * n - number of pixels in the span
3525 * dstFormat - format of destination color array
3526 * dest - the destination color array
3527 * srcFormat - source image format
3528 * srcType - source image data type
3529 * source - source image pointer
3530 * srcPacking - pixel unpacking parameters
3531 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3533 * XXX perhaps expand this to process whole images someday.
3536 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3537 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3538 GLenum srcFormat
, GLenum srcType
,
3539 const GLvoid
*source
,
3540 const struct gl_pixelstore_attrib
*srcPacking
,
3541 GLbitfield transferOps
)
3543 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3544 ASSERT(dstFormat
== GL_ALPHA
||
3545 dstFormat
== GL_LUMINANCE
||
3546 dstFormat
== GL_LUMINANCE_ALPHA
||
3547 dstFormat
== GL_INTENSITY
||
3548 dstFormat
== GL_RED
||
3549 dstFormat
== GL_RG
||
3550 dstFormat
== GL_RGB
||
3551 dstFormat
== GL_RGBA
);
3553 ASSERT(srcFormat
== GL_RED
||
3554 srcFormat
== GL_GREEN
||
3555 srcFormat
== GL_BLUE
||
3556 srcFormat
== GL_ALPHA
||
3557 srcFormat
== GL_LUMINANCE
||
3558 srcFormat
== GL_LUMINANCE_ALPHA
||
3559 srcFormat
== GL_INTENSITY
||
3560 srcFormat
== GL_RG
||
3561 srcFormat
== GL_RGB
||
3562 srcFormat
== GL_BGR
||
3563 srcFormat
== GL_RGBA
||
3564 srcFormat
== GL_BGRA
||
3565 srcFormat
== GL_ABGR_EXT
||
3566 srcFormat
== GL_COLOR_INDEX
);
3568 ASSERT(srcType
== GL_BITMAP
||
3569 srcType
== GL_UNSIGNED_BYTE
||
3570 srcType
== GL_BYTE
||
3571 srcType
== GL_UNSIGNED_SHORT
||
3572 srcType
== GL_SHORT
||
3573 srcType
== GL_UNSIGNED_INT
||
3574 srcType
== GL_INT
||
3575 srcType
== GL_HALF_FLOAT_ARB
||
3576 srcType
== GL_FLOAT
||
3577 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3578 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3579 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3580 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3581 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3582 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3583 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3584 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3585 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3586 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3587 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3588 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3589 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3590 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3592 /* EXT_texture_integer specifies no transfer ops on integer
3593 * types in the resolved issues section. Just set them to 0
3594 * for integer surfaces.
3599 /* Try simple cases first */
3600 if (transferOps
== 0) {
3601 if (srcType
== GL_UNSIGNED_BYTE
) {
3602 if (dstFormat
== GL_RGBA
) {
3603 if (srcFormat
== GL_RGBA
) {
3604 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3607 else if (srcFormat
== GL_RGB
) {
3609 const GLubyte
*src
= (const GLubyte
*) source
;
3610 GLubyte
*dst
= dest
;
3611 for (i
= 0; i
< n
; i
++) {
3622 else if (dstFormat
== GL_RGB
) {
3623 if (srcFormat
== GL_RGB
) {
3624 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3627 else if (srcFormat
== GL_RGBA
) {
3629 const GLubyte
*src
= (const GLubyte
*) source
;
3630 GLubyte
*dst
= dest
;
3631 for (i
= 0; i
< n
; i
++) {
3641 else if (dstFormat
== srcFormat
) {
3642 GLint comps
= _mesa_components_in_format(srcFormat
);
3644 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3651 /* general solution begins here */
3653 GLint dstComponents
;
3654 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3655 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3658 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3662 dstComponents
= _mesa_components_in_format( dstFormat
);
3663 /* source & dest image formats should have been error checked by now */
3664 assert(dstComponents
> 0);
3667 * Extract image data and convert to RGBA floats
3669 if (srcFormat
== GL_COLOR_INDEX
) {
3670 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3673 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3678 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3681 /* Convert indexes to RGBA */
3682 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3683 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3685 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3687 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3688 * with color indexes.
3690 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3695 /* non-color index data */
3696 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3697 srcPacking
->SwapBytes
);
3700 /* Need to clamp if returning GLubytes */
3701 transferOps
|= IMAGE_CLAMP_BIT
;
3704 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3707 get_component_indexes(dstFormat
,
3708 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3710 /* Now return the GLubyte data in the requested dstFormat */
3712 GLubyte
*dst
= dest
;
3714 for (i
= 0; i
< n
; i
++) {
3715 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3716 dst
+= dstComponents
;
3721 GLubyte
*dst
= dest
;
3723 for (i
= 0; i
< n
; i
++) {
3724 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3725 dst
+= dstComponents
;
3730 GLubyte
*dst
= dest
;
3732 for (i
= 0; i
< n
; i
++) {
3733 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3734 dst
+= dstComponents
;
3739 GLubyte
*dst
= dest
;
3741 for (i
= 0; i
< n
; i
++) {
3742 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3743 dst
+= dstComponents
;
3748 GLubyte
*dst
= dest
;
3751 assert(dstComponents
== 1);
3752 for (i
= 0; i
< n
; i
++) {
3753 /* Intensity comes from red channel */
3754 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3759 GLubyte
*dst
= dest
;
3762 for (i
= 0; i
< n
; i
++) {
3763 /* Luminance comes from red channel */
3764 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3765 dst
+= dstComponents
;
3775 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3776 * instead of GLubyte.
3779 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3780 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3781 GLenum srcFormat
, GLenum srcType
,
3782 const GLvoid
*source
,
3783 const struct gl_pixelstore_attrib
*srcPacking
,
3784 GLbitfield transferOps
)
3786 ASSERT(dstFormat
== GL_ALPHA
||
3787 dstFormat
== GL_LUMINANCE
||
3788 dstFormat
== GL_LUMINANCE_ALPHA
||
3789 dstFormat
== GL_INTENSITY
||
3790 dstFormat
== GL_RED
||
3791 dstFormat
== GL_RG
||
3792 dstFormat
== GL_RGB
||
3793 dstFormat
== GL_RGBA
);
3795 ASSERT(srcFormat
== GL_RED
||
3796 srcFormat
== GL_GREEN
||
3797 srcFormat
== GL_BLUE
||
3798 srcFormat
== GL_ALPHA
||
3799 srcFormat
== GL_LUMINANCE
||
3800 srcFormat
== GL_LUMINANCE_ALPHA
||
3801 srcFormat
== GL_INTENSITY
||
3802 srcFormat
== GL_RG
||
3803 srcFormat
== GL_RGB
||
3804 srcFormat
== GL_BGR
||
3805 srcFormat
== GL_RGBA
||
3806 srcFormat
== GL_BGRA
||
3807 srcFormat
== GL_ABGR_EXT
||
3808 srcFormat
== GL_RED_INTEGER_EXT
||
3809 srcFormat
== GL_GREEN_INTEGER_EXT
||
3810 srcFormat
== GL_BLUE_INTEGER_EXT
||
3811 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3812 srcFormat
== GL_RG_INTEGER
||
3813 srcFormat
== GL_RGB_INTEGER_EXT
||
3814 srcFormat
== GL_RGBA_INTEGER_EXT
||
3815 srcFormat
== GL_BGR_INTEGER_EXT
||
3816 srcFormat
== GL_BGRA_INTEGER_EXT
||
3817 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3818 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3819 srcFormat
== GL_COLOR_INDEX
);
3821 ASSERT(srcType
== GL_BITMAP
||
3822 srcType
== GL_UNSIGNED_BYTE
||
3823 srcType
== GL_BYTE
||
3824 srcType
== GL_UNSIGNED_SHORT
||
3825 srcType
== GL_SHORT
||
3826 srcType
== GL_UNSIGNED_INT
||
3827 srcType
== GL_INT
||
3828 srcType
== GL_HALF_FLOAT_ARB
||
3829 srcType
== GL_FLOAT
||
3830 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3831 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3832 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3833 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3834 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3835 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3836 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3837 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3838 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3839 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3840 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3841 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3842 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3843 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3845 /* general solution, no special cases, yet */
3847 GLint dstComponents
;
3848 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3849 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3850 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3853 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3857 dstComponents
= _mesa_components_in_format( dstFormat
);
3858 /* source & dest image formats should have been error checked by now */
3859 assert(dstComponents
> 0);
3861 /* EXT_texture_integer specifies no transfer ops on integer
3862 * types in the resolved issues section. Just set them to 0
3863 * for integer surfaces.
3869 * Extract image data and convert to RGBA floats
3871 if (srcFormat
== GL_COLOR_INDEX
) {
3872 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3875 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3880 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3883 /* Convert indexes to RGBA */
3884 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3885 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3887 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3889 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3890 * with color indexes.
3892 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3897 /* non-color index data */
3898 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3899 srcPacking
->SwapBytes
);
3903 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3906 get_component_indexes(dstFormat
,
3907 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3909 /* Now pack results in the requested dstFormat */
3911 GLfloat
*dst
= dest
;
3913 for (i
= 0; i
< n
; i
++) {
3914 dst
[rDst
] = rgba
[i
][RCOMP
];
3915 dst
+= dstComponents
;
3920 GLfloat
*dst
= dest
;
3922 for (i
= 0; i
< n
; i
++) {
3923 dst
[gDst
] = rgba
[i
][GCOMP
];
3924 dst
+= dstComponents
;
3929 GLfloat
*dst
= dest
;
3931 for (i
= 0; i
< n
; i
++) {
3932 dst
[bDst
] = rgba
[i
][BCOMP
];
3933 dst
+= dstComponents
;
3938 GLfloat
*dst
= dest
;
3940 for (i
= 0; i
< n
; i
++) {
3941 dst
[aDst
] = rgba
[i
][ACOMP
];
3942 dst
+= dstComponents
;
3947 GLfloat
*dst
= dest
;
3950 assert(dstComponents
== 1);
3951 for (i
= 0; i
< n
; i
++) {
3952 /* Intensity comes from red channel */
3953 dst
[i
] = rgba
[i
][RCOMP
];
3958 GLfloat
*dst
= dest
;
3961 for (i
= 0; i
< n
; i
++) {
3962 /* Luminance comes from red channel */
3963 dst
[0] = rgba
[i
][RCOMP
];
3964 dst
+= dstComponents
;
3974 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3975 * instead of GLubyte.
3976 * No pixel transfer ops are applied.
3979 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3980 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3981 GLenum srcFormat
, GLenum srcType
,
3982 const GLvoid
*source
,
3983 const struct gl_pixelstore_attrib
*srcPacking
)
3985 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3988 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3992 ASSERT(dstFormat
== GL_ALPHA
||
3993 dstFormat
== GL_LUMINANCE
||
3994 dstFormat
== GL_LUMINANCE_ALPHA
||
3995 dstFormat
== GL_INTENSITY
||
3996 dstFormat
== GL_RED
||
3997 dstFormat
== GL_RG
||
3998 dstFormat
== GL_RGB
||
3999 dstFormat
== GL_RGBA
);
4001 ASSERT(srcFormat
== GL_RED
||
4002 srcFormat
== GL_GREEN
||
4003 srcFormat
== GL_BLUE
||
4004 srcFormat
== GL_ALPHA
||
4005 srcFormat
== GL_LUMINANCE
||
4006 srcFormat
== GL_LUMINANCE_ALPHA
||
4007 srcFormat
== GL_INTENSITY
||
4008 srcFormat
== GL_RG
||
4009 srcFormat
== GL_RGB
||
4010 srcFormat
== GL_BGR
||
4011 srcFormat
== GL_RGBA
||
4012 srcFormat
== GL_BGRA
||
4013 srcFormat
== GL_ABGR_EXT
||
4014 srcFormat
== GL_RED_INTEGER_EXT
||
4015 srcFormat
== GL_GREEN_INTEGER_EXT
||
4016 srcFormat
== GL_BLUE_INTEGER_EXT
||
4017 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4018 srcFormat
== GL_RG_INTEGER
||
4019 srcFormat
== GL_RGB_INTEGER_EXT
||
4020 srcFormat
== GL_RGBA_INTEGER_EXT
||
4021 srcFormat
== GL_BGR_INTEGER_EXT
||
4022 srcFormat
== GL_BGRA_INTEGER_EXT
||
4023 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4024 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4026 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4027 srcType
== GL_BYTE
||
4028 srcType
== GL_UNSIGNED_SHORT
||
4029 srcType
== GL_SHORT
||
4030 srcType
== GL_UNSIGNED_INT
||
4031 srcType
== GL_INT
||
4032 srcType
== GL_HALF_FLOAT_ARB
||
4033 srcType
== GL_FLOAT
||
4034 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4035 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4036 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4037 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4038 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4039 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4040 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4041 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4042 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4043 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4044 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4045 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4046 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4047 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4050 /* Extract image data as uint[4] pixels */
4051 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4052 srcPacking
->SwapBytes
);
4054 if (dstFormat
== GL_RGBA
) {
4056 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4060 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4061 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4063 assert(dstComponents
> 0);
4065 get_component_indexes(dstFormat
,
4066 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4068 /* Now pack values in the requested dest format */
4072 for (i
= 0; i
< n
; i
++) {
4073 dst
[rDst
] = rgba
[i
][RCOMP
];
4074 dst
+= dstComponents
;
4081 for (i
= 0; i
< n
; i
++) {
4082 dst
[gDst
] = rgba
[i
][GCOMP
];
4083 dst
+= dstComponents
;
4090 for (i
= 0; i
< n
; i
++) {
4091 dst
[bDst
] = rgba
[i
][BCOMP
];
4092 dst
+= dstComponents
;
4099 for (i
= 0; i
< n
; i
++) {
4100 dst
[aDst
] = rgba
[i
][ACOMP
];
4101 dst
+= dstComponents
;
4109 assert(dstComponents
== 1);
4110 for (i
= 0; i
< n
; i
++) {
4111 /* Intensity comes from red channel */
4112 dst
[i
] = rgba
[i
][RCOMP
];
4120 for (i
= 0; i
< n
; i
++) {
4121 /* Luminance comes from red channel */
4122 dst
[0] = rgba
[i
][RCOMP
];
4123 dst
+= dstComponents
;
4134 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4135 * directly return GLbyte data, no transfer ops apply.
4138 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4139 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4140 GLenum srcFormat
, GLenum srcType
,
4141 const GLvoid
*source
,
4142 const struct gl_pixelstore_attrib
*srcPacking
,
4143 GLbitfield transferOps
)
4145 ASSERT(dstFormat
== GL_DUDV_ATI
);
4146 ASSERT(srcFormat
== GL_DUDV_ATI
||
4147 srcFormat
== GL_DU8DV8_ATI
);
4149 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4150 srcType
== GL_BYTE
||
4151 srcType
== GL_UNSIGNED_SHORT
||
4152 srcType
== GL_SHORT
||
4153 srcType
== GL_UNSIGNED_INT
||
4154 srcType
== GL_INT
||
4155 srcType
== GL_HALF_FLOAT_ARB
||
4156 srcType
== GL_FLOAT
);
4158 /* general solution */
4160 GLint dstComponents
;
4163 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4166 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4170 dstComponents
= _mesa_components_in_format( dstFormat
);
4171 /* source & dest image formats should have been error checked by now */
4172 assert(dstComponents
> 0);
4175 * Extract image data and convert to RGBA floats
4177 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4178 srcPacking
->SwapBytes
);
4181 /* Now determine which color channels we need to produce.
4182 * And determine the dest index (offset) within each color tuple.
4185 /* Now pack results in the requested dstFormat */
4186 for (i
= 0; i
< n
; i
++) {
4187 /* not sure - need clamp[-1,1] here? */
4188 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4189 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4190 dst
+= dstComponents
;
4198 * Unpack a row of color index data from a client buffer according to
4199 * the pixel unpacking parameters.
4200 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4202 * Args: ctx - the context
4203 * n - number of pixels
4204 * dstType - destination data type
4205 * dest - destination array
4206 * srcType - source pixel type
4207 * source - source data pointer
4208 * srcPacking - pixel unpacking parameters
4209 * transferOps - the pixel transfer operations to apply
4212 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4213 GLenum dstType
, GLvoid
*dest
,
4214 GLenum srcType
, const GLvoid
*source
,
4215 const struct gl_pixelstore_attrib
*srcPacking
,
4216 GLbitfield transferOps
)
4218 ASSERT(srcType
== GL_BITMAP
||
4219 srcType
== GL_UNSIGNED_BYTE
||
4220 srcType
== GL_BYTE
||
4221 srcType
== GL_UNSIGNED_SHORT
||
4222 srcType
== GL_SHORT
||
4223 srcType
== GL_UNSIGNED_INT
||
4224 srcType
== GL_INT
||
4225 srcType
== GL_HALF_FLOAT_ARB
||
4226 srcType
== GL_FLOAT
);
4228 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4229 dstType
== GL_UNSIGNED_SHORT
||
4230 dstType
== GL_UNSIGNED_INT
);
4233 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4236 * Try simple cases first
4238 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4239 && dstType
== GL_UNSIGNED_BYTE
) {
4240 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4242 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4243 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4244 memcpy(dest
, source
, n
* sizeof(GLuint
));
4250 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4253 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4257 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4261 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4263 /* convert to dest type */
4265 case GL_UNSIGNED_BYTE
:
4267 GLubyte
*dst
= (GLubyte
*) dest
;
4269 for (i
= 0; i
< n
; i
++) {
4270 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4274 case GL_UNSIGNED_SHORT
:
4276 GLuint
*dst
= (GLuint
*) dest
;
4278 for (i
= 0; i
< n
; i
++) {
4279 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4283 case GL_UNSIGNED_INT
:
4284 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4287 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4296 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4297 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4298 const struct gl_pixelstore_attrib
*dstPacking
,
4299 GLbitfield transferOps
)
4301 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4304 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4308 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4310 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4311 /* make a copy of input */
4312 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4313 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4318 case GL_UNSIGNED_BYTE
:
4320 GLubyte
*dst
= (GLubyte
*) dest
;
4322 for (i
= 0; i
< n
; i
++) {
4323 *dst
++ = (GLubyte
) source
[i
];
4329 GLbyte
*dst
= (GLbyte
*) dest
;
4331 for (i
= 0; i
< n
; i
++) {
4332 dst
[i
] = (GLbyte
) source
[i
];
4336 case GL_UNSIGNED_SHORT
:
4338 GLushort
*dst
= (GLushort
*) dest
;
4340 for (i
= 0; i
< n
; i
++) {
4341 dst
[i
] = (GLushort
) source
[i
];
4343 if (dstPacking
->SwapBytes
) {
4344 _mesa_swap2( (GLushort
*) dst
, n
);
4350 GLshort
*dst
= (GLshort
*) dest
;
4352 for (i
= 0; i
< n
; i
++) {
4353 dst
[i
] = (GLshort
) source
[i
];
4355 if (dstPacking
->SwapBytes
) {
4356 _mesa_swap2( (GLushort
*) dst
, n
);
4360 case GL_UNSIGNED_INT
:
4362 GLuint
*dst
= (GLuint
*) dest
;
4364 for (i
= 0; i
< n
; i
++) {
4365 dst
[i
] = (GLuint
) source
[i
];
4367 if (dstPacking
->SwapBytes
) {
4368 _mesa_swap4( (GLuint
*) dst
, n
);
4374 GLint
*dst
= (GLint
*) dest
;
4376 for (i
= 0; i
< n
; i
++) {
4377 dst
[i
] = (GLint
) source
[i
];
4379 if (dstPacking
->SwapBytes
) {
4380 _mesa_swap4( (GLuint
*) dst
, n
);
4386 GLfloat
*dst
= (GLfloat
*) dest
;
4388 for (i
= 0; i
< n
; i
++) {
4389 dst
[i
] = (GLfloat
) source
[i
];
4391 if (dstPacking
->SwapBytes
) {
4392 _mesa_swap4( (GLuint
*) dst
, n
);
4396 case GL_HALF_FLOAT_ARB
:
4398 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4400 for (i
= 0; i
< n
; i
++) {
4401 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4403 if (dstPacking
->SwapBytes
) {
4404 _mesa_swap2( (GLushort
*) dst
, n
);
4409 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4417 * Unpack a row of stencil data from a client buffer according to
4418 * the pixel unpacking parameters.
4419 * This is (or will be) used by glDrawPixels
4421 * Args: ctx - the context
4422 * n - number of pixels
4423 * dstType - destination data type
4424 * dest - destination array
4425 * srcType - source pixel type
4426 * source - source data pointer
4427 * srcPacking - pixel unpacking parameters
4428 * transferOps - apply offset/bias/lookup ops?
4431 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4432 GLenum dstType
, GLvoid
*dest
,
4433 GLenum srcType
, const GLvoid
*source
,
4434 const struct gl_pixelstore_attrib
*srcPacking
,
4435 GLbitfield transferOps
)
4437 ASSERT(srcType
== GL_BITMAP
||
4438 srcType
== GL_UNSIGNED_BYTE
||
4439 srcType
== GL_BYTE
||
4440 srcType
== GL_UNSIGNED_SHORT
||
4441 srcType
== GL_SHORT
||
4442 srcType
== GL_UNSIGNED_INT
||
4443 srcType
== GL_INT
||
4444 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4445 srcType
== GL_HALF_FLOAT_ARB
||
4446 srcType
== GL_FLOAT
||
4447 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4449 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4450 dstType
== GL_UNSIGNED_SHORT
||
4451 dstType
== GL_UNSIGNED_INT
||
4452 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4454 /* only shift and offset apply to stencil */
4455 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4458 * Try simple cases first
4460 if (transferOps
== 0 &&
4461 !ctx
->Pixel
.MapStencilFlag
&&
4462 srcType
== GL_UNSIGNED_BYTE
&&
4463 dstType
== GL_UNSIGNED_BYTE
) {
4464 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4466 else if (transferOps
== 0 &&
4467 !ctx
->Pixel
.MapStencilFlag
&&
4468 srcType
== GL_UNSIGNED_INT
&&
4469 dstType
== GL_UNSIGNED_INT
&&
4470 !srcPacking
->SwapBytes
) {
4471 memcpy(dest
, source
, n
* sizeof(GLuint
));
4477 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4480 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4484 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4487 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4488 /* shift and offset indexes */
4489 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4492 if (ctx
->Pixel
.MapStencilFlag
) {
4493 /* Apply stencil lookup table */
4494 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4496 for (i
= 0; i
< n
; i
++) {
4497 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4501 /* convert to dest type */
4503 case GL_UNSIGNED_BYTE
:
4505 GLubyte
*dst
= (GLubyte
*) dest
;
4507 for (i
= 0; i
< n
; i
++) {
4508 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4512 case GL_UNSIGNED_SHORT
:
4514 GLuint
*dst
= (GLuint
*) dest
;
4516 for (i
= 0; i
< n
; i
++) {
4517 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4521 case GL_UNSIGNED_INT
:
4522 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4524 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4526 GLuint
*dst
= (GLuint
*) dest
;
4528 for (i
= 0; i
< n
; i
++) {
4529 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4534 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4543 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4544 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4545 const struct gl_pixelstore_attrib
*dstPacking
)
4547 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4550 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4554 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4555 ctx
->Pixel
.MapStencilFlag
) {
4556 /* make a copy of input */
4557 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4558 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4563 case GL_UNSIGNED_BYTE
:
4564 memcpy(dest
, source
, n
);
4568 GLbyte
*dst
= (GLbyte
*) dest
;
4571 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4575 case GL_UNSIGNED_SHORT
:
4577 GLushort
*dst
= (GLushort
*) dest
;
4580 dst
[i
] = (GLushort
) source
[i
];
4582 if (dstPacking
->SwapBytes
) {
4583 _mesa_swap2( (GLushort
*) dst
, n
);
4589 GLshort
*dst
= (GLshort
*) dest
;
4592 dst
[i
] = (GLshort
) source
[i
];
4594 if (dstPacking
->SwapBytes
) {
4595 _mesa_swap2( (GLushort
*) dst
, n
);
4599 case GL_UNSIGNED_INT
:
4601 GLuint
*dst
= (GLuint
*) dest
;
4604 dst
[i
] = (GLuint
) source
[i
];
4606 if (dstPacking
->SwapBytes
) {
4607 _mesa_swap4( (GLuint
*) dst
, n
);
4613 GLint
*dst
= (GLint
*) dest
;
4616 dst
[i
] = (GLint
) source
[i
];
4618 if (dstPacking
->SwapBytes
) {
4619 _mesa_swap4( (GLuint
*) dst
, n
);
4625 GLfloat
*dst
= (GLfloat
*) dest
;
4628 dst
[i
] = (GLfloat
) source
[i
];
4630 if (dstPacking
->SwapBytes
) {
4631 _mesa_swap4( (GLuint
*) dst
, n
);
4635 case GL_HALF_FLOAT_ARB
:
4637 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4640 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4642 if (dstPacking
->SwapBytes
) {
4643 _mesa_swap2( (GLushort
*) dst
, n
);
4648 if (dstPacking
->LsbFirst
) {
4649 GLubyte
*dst
= (GLubyte
*) dest
;
4652 for (i
= 0; i
< n
; i
++) {
4655 *dst
|= ((source
[i
] != 0) << shift
);
4664 GLubyte
*dst
= (GLubyte
*) dest
;
4667 for (i
= 0; i
< n
; i
++) {
4670 *dst
|= ((source
[i
] != 0) << shift
);
4680 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4686 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4689 const GLTYPE *src = (const GLTYPE *)source; \
4690 for (i = 0; i < n; i++) { \
4691 GLTYPE value = src[i]; \
4692 if (srcPacking->SwapBytes) { \
4693 if (sizeof(GLTYPE) == 2) { \
4695 } else if (sizeof(GLTYPE) == 4) { \
4699 depthValues[i] = GLTYPE2FLOAT(value); \
4705 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4706 * or GLfloat values.
4707 * The glPixelTransfer (scale/bias) params will be applied.
4709 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4710 * \param depthMax max value for returned GLushort or GLuint values
4711 * (ignored for GLfloat).
4714 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4715 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4716 GLenum srcType
, const GLvoid
*source
,
4717 const struct gl_pixelstore_attrib
*srcPacking
)
4719 GLfloat
*depthTemp
= NULL
, *depthValues
;
4720 GLboolean needClamp
= GL_FALSE
;
4722 /* Look for special cases first.
4723 * Not only are these faster, they're less prone to numeric conversion
4724 * problems. Otherwise, converting from an int type to a float then
4725 * back to an int type can introduce errors that will show up as
4726 * artifacts in things like depth peeling which uses glCopyTexImage.
4728 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4729 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4730 const GLuint
*src
= (const GLuint
*) source
;
4731 GLushort
*dst
= (GLushort
*) dest
;
4733 for (i
= 0; i
< n
; i
++) {
4734 dst
[i
] = src
[i
] >> 16;
4738 if (srcType
== GL_UNSIGNED_SHORT
4739 && dstType
== GL_UNSIGNED_INT
4740 && depthMax
== 0xffffffff) {
4741 const GLushort
*src
= (const GLushort
*) source
;
4742 GLuint
*dst
= (GLuint
*) dest
;
4744 for (i
= 0; i
< n
; i
++) {
4745 dst
[i
] = src
[i
] | (src
[i
] << 16);
4749 if (srcType
== GL_UNSIGNED_INT_24_8
4750 && dstType
== GL_UNSIGNED_INT
4751 && depthMax
== 0xffffff) {
4752 const GLuint
*src
= (const GLuint
*) source
;
4753 GLuint
*dst
= (GLuint
*) dest
;
4755 for (i
= 0; i
< n
; i
++) {
4756 dst
[i
] = src
[i
] >> 8;
4760 /* XXX may want to add additional cases here someday */
4763 /* general case path follows */
4765 if (dstType
== GL_FLOAT
) {
4766 depthValues
= (GLfloat
*) dest
;
4769 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4771 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4775 depthValues
= depthTemp
;
4778 /* Convert incoming values to GLfloat. Some conversions will require
4783 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4784 needClamp
= GL_TRUE
;
4786 case GL_UNSIGNED_BYTE
:
4787 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4790 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4791 needClamp
= GL_TRUE
;
4793 case GL_UNSIGNED_SHORT
:
4794 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4797 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4798 needClamp
= GL_TRUE
;
4800 case GL_UNSIGNED_INT
:
4801 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4803 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4804 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4805 depthMax
== 0xffffff &&
4806 ctx
->Pixel
.DepthScale
== 1.0 &&
4807 ctx
->Pixel
.DepthBias
== 0.0) {
4808 const GLuint
*src
= (const GLuint
*) source
;
4809 GLuint
*zValues
= (GLuint
*) dest
;
4811 for (i
= 0; i
< n
; i
++) {
4812 GLuint value
= src
[i
];
4813 if (srcPacking
->SwapBytes
) {
4816 zValues
[i
] = value
& 0xffffff00;
4822 const GLuint
*src
= (const GLuint
*) source
;
4823 const GLfloat scale
= 1.0f
/ 0xffffff;
4825 for (i
= 0; i
< n
; i
++) {
4826 GLuint value
= src
[i
];
4827 if (srcPacking
->SwapBytes
) {
4830 depthValues
[i
] = (value
>> 8) * scale
;
4834 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4837 const GLfloat
*src
= (const GLfloat
*)source
;
4838 for (i
= 0; i
< n
; i
++) {
4839 GLfloat value
= src
[i
* 2];
4840 if (srcPacking
->SwapBytes
) {
4843 depthValues
[i
] = value
;
4845 needClamp
= GL_TRUE
;
4849 DEPTH_VALUES(GLfloat
, 1*);
4850 needClamp
= GL_TRUE
;
4852 case GL_HALF_FLOAT_ARB
:
4855 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4856 for (i
= 0; i
< n
; i
++) {
4857 GLhalfARB value
= src
[i
];
4858 if (srcPacking
->SwapBytes
) {
4861 depthValues
[i
] = _mesa_half_to_float(value
);
4863 needClamp
= GL_TRUE
;
4867 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4872 /* apply depth scale and bias */
4874 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4875 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4876 if (scale
!= 1.0 || bias
!= 0.0) {
4878 for (i
= 0; i
< n
; i
++) {
4879 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4881 needClamp
= GL_TRUE
;
4885 /* clamp to [0, 1] */
4888 for (i
= 0; i
< n
; i
++) {
4889 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4894 * Convert values to dstType
4896 if (dstType
== GL_UNSIGNED_INT
) {
4897 GLuint
*zValues
= (GLuint
*) dest
;
4899 if (depthMax
<= 0xffffff) {
4900 /* no overflow worries */
4901 for (i
= 0; i
< n
; i
++) {
4902 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4906 /* need to use double precision to prevent overflow problems */
4907 for (i
= 0; i
< n
; i
++) {
4908 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4909 if (z
>= (GLdouble
) 0xffffffff)
4910 zValues
[i
] = 0xffffffff;
4912 zValues
[i
] = (GLuint
) z
;
4916 else if (dstType
== GL_UNSIGNED_SHORT
) {
4917 GLushort
*zValues
= (GLushort
*) dest
;
4919 ASSERT(depthMax
<= 0xffff);
4920 for (i
= 0; i
< n
; i
++) {
4921 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4924 else if (dstType
== GL_FLOAT
) {
4925 /* Nothing to do. depthValues is pointing to dest. */
4927 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4928 GLfloat
*zValues
= (GLfloat
*) dest
;
4930 for (i
= 0; i
< n
; i
++) {
4931 zValues
[i
*2] = depthValues
[i
];
4943 * Pack an array of depth values. The values are floats in [0,1].
4946 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4947 GLenum dstType
, const GLfloat
*depthSpan
,
4948 const struct gl_pixelstore_attrib
*dstPacking
)
4950 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4952 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4956 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4957 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4958 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4959 depthSpan
= depthCopy
;
4963 case GL_UNSIGNED_BYTE
:
4965 GLubyte
*dst
= (GLubyte
*) dest
;
4967 for (i
= 0; i
< n
; i
++) {
4968 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4974 GLbyte
*dst
= (GLbyte
*) dest
;
4976 for (i
= 0; i
< n
; i
++) {
4977 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4981 case GL_UNSIGNED_SHORT
:
4983 GLushort
*dst
= (GLushort
*) dest
;
4985 for (i
= 0; i
< n
; i
++) {
4986 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4988 if (dstPacking
->SwapBytes
) {
4989 _mesa_swap2( (GLushort
*) dst
, n
);
4995 GLshort
*dst
= (GLshort
*) dest
;
4997 for (i
= 0; i
< n
; i
++) {
4998 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5000 if (dstPacking
->SwapBytes
) {
5001 _mesa_swap2( (GLushort
*) dst
, n
);
5005 case GL_UNSIGNED_INT
:
5007 GLuint
*dst
= (GLuint
*) dest
;
5009 for (i
= 0; i
< n
; i
++) {
5010 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5012 if (dstPacking
->SwapBytes
) {
5013 _mesa_swap4( (GLuint
*) dst
, n
);
5019 GLint
*dst
= (GLint
*) dest
;
5021 for (i
= 0; i
< n
; i
++) {
5022 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5024 if (dstPacking
->SwapBytes
) {
5025 _mesa_swap4( (GLuint
*) dst
, n
);
5031 GLfloat
*dst
= (GLfloat
*) dest
;
5033 for (i
= 0; i
< n
; i
++) {
5034 dst
[i
] = depthSpan
[i
];
5036 if (dstPacking
->SwapBytes
) {
5037 _mesa_swap4( (GLuint
*) dst
, n
);
5041 case GL_HALF_FLOAT_ARB
:
5043 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5045 for (i
= 0; i
< n
; i
++) {
5046 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5048 if (dstPacking
->SwapBytes
) {
5049 _mesa_swap2( (GLushort
*) dst
, n
);
5054 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5063 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5066 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5067 GLenum dstType
, GLuint
*dest
,
5068 const GLfloat
*depthVals
,
5069 const GLubyte
*stencilVals
,
5070 const struct gl_pixelstore_attrib
*dstPacking
)
5072 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5073 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5076 if (!depthCopy
|| !stencilCopy
) {
5077 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5083 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5084 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5085 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5086 depthVals
= depthCopy
;
5089 if (ctx
->Pixel
.IndexShift
||
5090 ctx
->Pixel
.IndexOffset
||
5091 ctx
->Pixel
.MapStencilFlag
) {
5092 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5093 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5094 stencilVals
= stencilCopy
;
5098 case GL_UNSIGNED_INT_24_8
:
5099 for (i
= 0; i
< n
; i
++) {
5100 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5101 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5104 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5105 for (i
= 0; i
< n
; i
++) {
5106 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5107 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5112 if (dstPacking
->SwapBytes
) {
5113 _mesa_swap4(dest
, n
);
5124 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5125 * Return all image data in a contiguous block. This is used when we
5126 * compile glDrawPixels, glTexImage, etc into a display list. We
5127 * need a copy of the data in a standard format.
5130 _mesa_unpack_image( GLuint dimensions
,
5131 GLsizei width
, GLsizei height
, GLsizei depth
,
5132 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5133 const struct gl_pixelstore_attrib
*unpack
)
5135 GLint bytesPerRow
, compsPerRow
;
5136 GLboolean flipBytes
, swap2
, swap4
;
5139 return NULL
; /* not necessarily an error */
5141 if (width
<= 0 || height
<= 0 || depth
<= 0)
5142 return NULL
; /* generate error later */
5144 if (type
== GL_BITMAP
) {
5145 bytesPerRow
= (width
+ 7) >> 3;
5146 flipBytes
= unpack
->LsbFirst
;
5147 swap2
= swap4
= GL_FALSE
;
5151 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5152 GLint components
= _mesa_components_in_format(format
);
5155 if (_mesa_type_is_packed(type
))
5158 if (bytesPerPixel
<= 0 || components
<= 0)
5159 return NULL
; /* bad format or type. generate error later */
5160 bytesPerRow
= bytesPerPixel
* width
;
5161 bytesPerComp
= bytesPerPixel
/ components
;
5162 flipBytes
= GL_FALSE
;
5163 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5164 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5165 compsPerRow
= components
* width
;
5166 assert(compsPerRow
>= width
);
5171 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5175 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5178 for (img
= 0; img
< depth
; img
++) {
5179 for (row
= 0; row
< height
; row
++) {
5180 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5181 width
, height
, format
, type
, img
, row
, 0);
5183 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5185 flipBytes
= GL_FALSE
;
5186 if (unpack
->LsbFirst
) {
5187 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5188 GLubyte dstMask
= 128;
5189 const GLubyte
*s
= src
;
5192 for (i
= 0; i
< width
; i
++) {
5196 if (srcMask
== 128) {
5201 srcMask
= srcMask
<< 1;
5209 dstMask
= dstMask
>> 1;
5214 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5215 GLubyte dstMask
= 128;
5216 const GLubyte
*s
= src
;
5219 for (i
= 0; i
< width
; i
++) {
5228 srcMask
= srcMask
>> 1;
5236 dstMask
= dstMask
>> 1;
5242 memcpy(dst
, src
, bytesPerRow
);
5245 /* byte flipping/swapping */
5247 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5250 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5253 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5265 * If we unpack colors from a luminance surface, we'll get pixel colors
5266 * such as (l, l, l, a).
5267 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5268 * function will compute L=R+G+B before packing. The net effect is we'll
5269 * accidentally store luminance values = 3*l.
5270 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5272 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5275 * Finally, we also need to do this when the actual surface format does
5276 * not match the logical surface format. For example, suppose the user
5277 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5278 * Again, we'll get pixel values like (l,l,l,a).
5281 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5285 switch (baseFormat
) {
5287 for (i
= 0; i
< n
; i
++) {
5288 rgba
[i
][RCOMP
] = 0.0F
;
5289 rgba
[i
][GCOMP
] = 0.0F
;
5290 rgba
[i
][BCOMP
] = 0.0F
;
5296 for (i
= 0; i
< n
; i
++) {
5297 rgba
[i
][GCOMP
] = 0.0F
;
5298 rgba
[i
][BCOMP
] = 0.0F
;
5299 rgba
[i
][ACOMP
] = 1.0F
;
5302 case GL_LUMINANCE_ALPHA
:
5303 for (i
= 0; i
< n
; i
++) {
5304 rgba
[i
][GCOMP
] = 0.0F
;
5305 rgba
[i
][BCOMP
] = 0.0F
;
5316 * As above, but GLuint components.
5319 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5323 switch (baseFormat
) {
5325 for (i
= 0; i
< n
; i
++) {
5334 for (i
= 0; i
< n
; i
++) {
5340 case GL_LUMINANCE_ALPHA
:
5341 for (i
= 0; i
< n
; i
++) {