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.
33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34 * this global optimization.
37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
40 #if defined(_MSC_VER) && defined(_M_X64)
41 # pragma optimize( "g", off )
53 #include "pixeltransfer.h"
55 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
56 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
60 * Flip the 8 bits in each byte of the given array.
63 * \param n number of bytes.
65 * \todo try this trick to flip bytes someday:
67 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
68 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
69 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
73 flip_bytes( GLubyte
*p
, GLuint n
)
76 for (i
= 0; i
< n
; i
++) {
77 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
78 a
= ((b
& 0x01) << 7) |
93 * Unpack a 32x32 pixel polygon stipple from user memory using the
94 * current pixel unpack settings.
97 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
98 const struct gl_pixelstore_attrib
*unpacking
)
100 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
102 /* Convert pattern from GLubytes to GLuints and handle big/little
107 for (i
= 0; i
< 32; i
++) {
108 dest
[i
] = (p
[0] << 24)
120 * Pack polygon stipple into user memory given current pixel packing
124 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
125 const struct gl_pixelstore_attrib
*packing
)
127 /* Convert pattern from GLuints to GLubytes to handle big/little
128 * endian differences.
132 for (i
= 0; i
< 32; i
++) {
133 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
134 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
135 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
136 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
139 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
144 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
145 * order with row alignment = 1 byte.
148 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
149 const struct gl_pixelstore_attrib
*packing
)
151 GLint bytes
, row
, width_in_bytes
;
152 GLubyte
*buffer
, *dst
;
157 /* Alloc dest storage */
158 bytes
= ((width
+ 7) / 8 * height
);
159 buffer
= (GLubyte
*) malloc( bytes
);
163 width_in_bytes
= CEILING( width
, 8 );
165 for (row
= 0; row
< height
; row
++) {
166 const GLubyte
*src
= (const GLubyte
*)
167 _mesa_image_address2d(packing
, pixels
, width
, height
,
168 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
174 if ((packing
->SkipPixels
& 7) == 0) {
175 memcpy( dst
, src
, width_in_bytes
);
176 if (packing
->LsbFirst
) {
177 flip_bytes( dst
, width_in_bytes
);
181 /* handling SkipPixels is a bit tricky (no pun intended!) */
183 if (packing
->LsbFirst
) {
184 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
185 GLubyte dstMask
= 128;
186 const GLubyte
*s
= src
;
189 for (i
= 0; i
< width
; i
++) {
193 if (srcMask
== 128) {
198 srcMask
= srcMask
<< 1;
206 dstMask
= dstMask
>> 1;
211 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
212 GLubyte dstMask
= 128;
213 const GLubyte
*s
= src
;
216 for (i
= 0; i
< width
; i
++) {
225 srcMask
= srcMask
>> 1;
233 dstMask
= dstMask
>> 1;
238 dst
+= width_in_bytes
;
249 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
250 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
252 GLint row
, width_in_bytes
;
258 width_in_bytes
= CEILING( width
, 8 );
260 for (row
= 0; row
< height
; row
++) {
261 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
262 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
266 if ((packing
->SkipPixels
& 7) == 0) {
267 memcpy( dst
, src
, width_in_bytes
);
268 if (packing
->LsbFirst
) {
269 flip_bytes( dst
, width_in_bytes
);
273 /* handling SkipPixels is a bit tricky (no pun intended!) */
275 if (packing
->LsbFirst
) {
276 GLubyte srcMask
= 128;
277 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
278 const GLubyte
*s
= src
;
281 for (i
= 0; i
< width
; i
++) {
290 srcMask
= srcMask
>> 1;
292 if (dstMask
== 128) {
298 dstMask
= dstMask
<< 1;
303 GLubyte srcMask
= 128;
304 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
305 const GLubyte
*s
= src
;
308 for (i
= 0; i
< width
; i
++) {
317 srcMask
= srcMask
>> 1;
325 dstMask
= dstMask
>> 1;
330 src
+= width_in_bytes
;
336 * Get indexes of color components for a basic color format, such as
337 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
341 get_component_indexes(GLenum format
,
346 GLint
*luminanceIndex
,
347 GLint
*intensityIndex
)
353 *luminanceIndex
= -1;
354 *intensityIndex
= -1;
358 case GL_LUMINANCE_INTEGER_EXT
:
361 case GL_LUMINANCE_ALPHA
:
362 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
370 case GL_RED_INTEGER_EXT
:
374 case GL_GREEN_INTEGER_EXT
:
378 case GL_BLUE_INTEGER_EXT
:
382 case GL_ALPHA_INTEGER_EXT
:
391 case GL_RGB_INTEGER_EXT
:
397 case GL_BGR_INTEGER_EXT
:
403 case GL_RGBA_INTEGER_EXT
:
410 case GL_BGRA_INTEGER
:
428 assert(0 && "bad format in get_component_indexes()");
435 * For small integer types, return the min and max possible values.
436 * Used for clamping floats to unscaled integer types.
437 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
440 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
447 case GL_UNSIGNED_BYTE
:
455 case GL_UNSIGNED_SHORT
:
464 /* Customization of integer packing. We always treat src as uint, and can pack dst
465 * as any integer type/format combo.
467 #define SRC_TYPE GLuint
469 #define DST_TYPE GLuint
470 #define SRC_CONVERT(x) (x)
471 #define FN_NAME pack_uint_from_uint_rgba
472 #include "pack_tmp.h"
477 #define DST_TYPE GLushort
478 #define SRC_CONVERT(x) MIN2(x, 0xffff)
479 #define FN_NAME pack_ushort_from_uint_rgba
480 #include "pack_tmp.h"
485 #define DST_TYPE GLshort
486 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
487 #define FN_NAME pack_short_from_uint_rgba
488 #include "pack_tmp.h"
493 #define DST_TYPE GLubyte
494 #define SRC_CONVERT(x) MIN2(x, 0xff)
495 #define FN_NAME pack_ubyte_from_uint_rgba
496 #include "pack_tmp.h"
501 #define DST_TYPE GLbyte
502 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
503 #define FN_NAME pack_byte_from_uint_rgba
504 #include "pack_tmp.h"
510 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
511 GLenum dstFormat
, GLenum dstType
,
515 case GL_UNSIGNED_INT
:
516 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
519 /* No conversion necessary. */
520 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
522 case GL_UNSIGNED_SHORT
:
523 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
526 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
528 case GL_UNSIGNED_BYTE
:
529 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
532 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
542 * Used to pack an array [][4] of RGBA float colors as specified
543 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
544 * Historically, the RGBA values were in [0,1] and rescaled to fit
545 * into GLubytes, etc. But with new integer formats, the RGBA values
546 * may have any value and we don't always rescale when converting to
549 * Note: the rgba values will be modified by this function when any pixel
550 * transfer ops are enabled.
553 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
554 GLenum dstFormat
, GLenum dstType
,
556 const struct gl_pixelstore_attrib
*dstPacking
,
557 GLbitfield transferOps
)
560 const GLint comps
= _mesa_components_in_format(dstFormat
);
561 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
564 if (dstFormat
== GL_LUMINANCE
||
565 dstFormat
== GL_LUMINANCE_ALPHA
||
566 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
567 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
568 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
570 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
578 /* EXT_texture_integer specifies no transfer ops on integer
579 * types in the resolved issues section. Just set them to 0
580 * for integer surfaces.
586 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
590 * Component clamping (besides clamping to [0,1] in
591 * _mesa_apply_rgba_transfer_ops()).
594 /* clamping to dest type's min/max values */
596 if (get_type_min_max(dstType
, &min
, &max
)) {
597 for (i
= 0; i
< n
; i
++) {
598 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
599 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
600 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
601 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
605 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
606 /* compute luminance values */
607 if (transferOps
& IMAGE_CLAMP_BIT
) {
608 for (i
= 0; i
< n
; i
++) {
609 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
610 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
614 for (i
= 0; i
< n
; i
++) {
615 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
621 * Pack/store the pixels. Ugh! Lots of cases!!!
624 case GL_UNSIGNED_BYTE
:
626 GLubyte
*dst
= (GLubyte
*) dstAddr
;
630 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
634 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
638 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
642 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
646 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
648 case GL_LUMINANCE_ALPHA
:
650 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
651 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
656 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
657 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
662 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
663 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
664 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
669 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
670 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
671 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
672 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
677 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
678 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
679 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
684 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
685 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
686 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
687 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
692 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
693 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
694 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
695 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
698 case GL_RED_INTEGER_EXT
:
700 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
703 case GL_GREEN_INTEGER_EXT
:
705 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
708 case GL_BLUE_INTEGER_EXT
:
710 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
713 case GL_ALPHA_INTEGER_EXT
:
715 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
720 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
721 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
724 case GL_RGB_INTEGER_EXT
:
726 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
727 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
728 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
731 case GL_RGBA_INTEGER_EXT
:
733 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
734 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
735 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
736 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
739 case GL_BGR_INTEGER_EXT
:
741 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
742 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
743 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
746 case GL_BGRA_INTEGER_EXT
:
748 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
749 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
750 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
751 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
754 case GL_LUMINANCE_INTEGER_EXT
:
756 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
759 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
762 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
764 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
772 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
773 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
777 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
783 GLbyte
*dst
= (GLbyte
*) dstAddr
;
787 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
791 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
795 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
799 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
803 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
805 case GL_LUMINANCE_ALPHA
:
807 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
808 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
813 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
814 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
819 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
820 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
821 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
826 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
827 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
828 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
829 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
834 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
835 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
836 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
841 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
842 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
843 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
844 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
849 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
850 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
851 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
852 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
855 case GL_RED_INTEGER_EXT
:
857 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
860 case GL_GREEN_INTEGER_EXT
:
862 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
865 case GL_BLUE_INTEGER_EXT
:
867 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
870 case GL_ALPHA_INTEGER_EXT
:
872 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
877 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
878 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
881 case GL_RGB_INTEGER_EXT
:
883 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
884 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
885 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
888 case GL_RGBA_INTEGER_EXT
:
890 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
891 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
892 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
893 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
896 case GL_BGR_INTEGER_EXT
:
898 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
899 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
900 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
903 case GL_BGRA_INTEGER_EXT
:
905 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
906 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
907 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
908 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
911 case GL_LUMINANCE_INTEGER_EXT
:
913 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
916 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
919 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
921 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
929 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
930 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
934 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
938 case GL_UNSIGNED_SHORT
:
940 GLushort
*dst
= (GLushort
*) dstAddr
;
944 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
952 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
956 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
960 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
962 case GL_LUMINANCE_ALPHA
:
964 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
965 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
976 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
977 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
983 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
984 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
986 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
991 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
992 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
993 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
998 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
999 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1000 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1001 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1006 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1007 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1008 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1009 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1012 case GL_RED_INTEGER_EXT
:
1014 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1017 case GL_GREEN_INTEGER_EXT
:
1019 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1022 case GL_BLUE_INTEGER_EXT
:
1024 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1027 case GL_ALPHA_INTEGER_EXT
:
1029 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1034 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1035 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1038 case GL_RGB_INTEGER_EXT
:
1040 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1041 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1042 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1045 case GL_RGBA_INTEGER_EXT
:
1047 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1048 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1049 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1050 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1053 case GL_BGR_INTEGER_EXT
:
1055 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1056 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1057 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1060 case GL_BGRA_INTEGER_EXT
:
1062 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1063 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1064 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1065 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1068 case GL_LUMINANCE_INTEGER_EXT
:
1070 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1073 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1076 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1078 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1086 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1087 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1091 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1097 GLshort
*dst
= (GLshort
*) dstAddr
;
1098 switch (dstFormat
) {
1101 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1105 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1109 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1113 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1117 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1119 case GL_LUMINANCE_ALPHA
:
1121 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1122 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1127 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1128 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1133 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1134 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1135 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1140 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1141 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1142 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1143 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1148 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1149 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1150 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1155 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1156 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1157 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1158 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1163 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1164 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1165 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1166 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1169 case GL_RED_INTEGER_EXT
:
1171 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1174 case GL_GREEN_INTEGER_EXT
:
1176 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1179 case GL_BLUE_INTEGER_EXT
:
1181 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1184 case GL_ALPHA_INTEGER_EXT
:
1186 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1191 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1192 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1195 case GL_RGB_INTEGER_EXT
:
1197 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1198 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1199 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1202 case GL_RGBA_INTEGER_EXT
:
1204 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1205 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1206 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1207 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1210 case GL_BGR_INTEGER_EXT
:
1212 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1213 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1214 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1217 case GL_BGRA_INTEGER_EXT
:
1219 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1220 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1221 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1222 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1225 case GL_LUMINANCE_INTEGER_EXT
:
1227 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1230 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1233 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1235 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1243 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1244 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1248 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1252 case GL_UNSIGNED_INT
:
1254 GLuint
*dst
= (GLuint
*) dstAddr
;
1255 switch (dstFormat
) {
1258 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1262 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1266 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1270 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1274 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1276 case GL_LUMINANCE_ALPHA
:
1278 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1279 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1284 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1285 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1290 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1291 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1292 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1297 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1298 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1299 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1300 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1305 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1306 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1307 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1312 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1313 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1314 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1315 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1320 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1321 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1322 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1323 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1326 case GL_RED_INTEGER_EXT
:
1328 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1331 case GL_GREEN_INTEGER_EXT
:
1333 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1336 case GL_BLUE_INTEGER_EXT
:
1338 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1341 case GL_ALPHA_INTEGER_EXT
:
1343 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1348 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1349 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1352 case GL_RGB_INTEGER_EXT
:
1354 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1355 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1356 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1359 case GL_RGBA_INTEGER_EXT
:
1361 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1362 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1363 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1364 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1367 case GL_BGR_INTEGER_EXT
:
1369 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1370 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1371 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1374 case GL_BGRA_INTEGER_EXT
:
1376 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1377 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1378 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1379 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1382 case GL_LUMINANCE_INTEGER_EXT
:
1384 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1387 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1390 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1392 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1400 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1401 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1405 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1411 GLint
*dst
= (GLint
*) dstAddr
;
1412 switch (dstFormat
) {
1415 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1419 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1423 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1427 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1431 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1433 case GL_LUMINANCE_ALPHA
:
1435 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1436 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1441 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1442 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1447 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1448 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1449 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1454 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1455 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1456 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1457 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1462 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1463 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1464 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1469 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1470 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1471 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1472 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1477 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1478 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1479 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1480 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1486 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1487 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1490 case GL_RED_INTEGER_EXT
:
1492 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1495 case GL_GREEN_INTEGER_EXT
:
1497 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1500 case GL_BLUE_INTEGER_EXT
:
1502 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1505 case GL_ALPHA_INTEGER_EXT
:
1507 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1512 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1513 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1516 case GL_RGB_INTEGER_EXT
:
1518 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1519 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1520 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1523 case GL_RGBA_INTEGER_EXT
:
1525 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1526 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1527 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1528 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1531 case GL_BGR_INTEGER_EXT
:
1533 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1534 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1535 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1538 case GL_BGRA_INTEGER_EXT
:
1540 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1541 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1542 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1543 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1546 case GL_LUMINANCE_INTEGER_EXT
:
1548 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1551 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1554 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1556 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1562 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1568 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1569 switch (dstFormat
) {
1572 dst
[i
] = rgba
[i
][RCOMP
];
1576 dst
[i
] = rgba
[i
][GCOMP
];
1580 dst
[i
] = rgba
[i
][BCOMP
];
1584 dst
[i
] = rgba
[i
][ACOMP
];
1588 dst
[i
] = luminance
[i
];
1590 case GL_LUMINANCE_ALPHA
:
1592 dst
[i
*2+0] = luminance
[i
];
1593 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1598 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1599 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1604 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1605 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1606 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1611 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1612 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1613 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1614 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1619 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1620 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1621 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1626 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1627 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1628 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1629 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1634 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1635 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1636 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1637 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1643 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1644 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1648 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1652 case GL_HALF_FLOAT_ARB
:
1654 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1655 switch (dstFormat
) {
1658 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1662 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1666 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1670 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1674 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1676 case GL_LUMINANCE_ALPHA
:
1678 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1679 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1684 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1685 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1690 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1691 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1692 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1697 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1698 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1699 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1700 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1705 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1706 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1707 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1712 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1713 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1714 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1715 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1720 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1721 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1722 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1723 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1729 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1730 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1734 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1738 case GL_UNSIGNED_BYTE_3_3_2
:
1739 if (dstFormat
== GL_RGB
) {
1740 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1742 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1743 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1744 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
1748 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1749 if (dstFormat
== GL_RGB
) {
1750 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1752 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
1753 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1754 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1758 case GL_UNSIGNED_SHORT_5_6_5
:
1759 if (dstFormat
== GL_RGB
) {
1760 GLushort
*dst
= (GLushort
*) dstAddr
;
1762 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1763 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1764 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
1768 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1769 if (dstFormat
== GL_RGB
) {
1770 GLushort
*dst
= (GLushort
*) dstAddr
;
1772 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1773 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1774 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1778 case GL_UNSIGNED_SHORT_4_4_4_4
:
1779 if (dstFormat
== GL_RGBA
) {
1780 GLushort
*dst
= (GLushort
*) dstAddr
;
1782 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1783 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1784 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1785 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1788 else if (dstFormat
== GL_BGRA
) {
1789 GLushort
*dst
= (GLushort
*) dstAddr
;
1791 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1792 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1793 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1794 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1797 else if (dstFormat
== GL_ABGR_EXT
) {
1798 GLushort
*dst
= (GLushort
*) dstAddr
;
1800 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1801 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1802 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1803 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
1807 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1808 if (dstFormat
== GL_RGBA
) {
1809 GLushort
*dst
= (GLushort
*) dstAddr
;
1811 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
1812 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1813 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1814 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1817 else if (dstFormat
== GL_BGRA
) {
1818 GLushort
*dst
= (GLushort
*) dstAddr
;
1820 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
1821 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1822 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1823 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1826 else if (dstFormat
== GL_ABGR_EXT
) {
1827 GLushort
*dst
= (GLushort
*) dstAddr
;
1829 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
1830 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1831 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1832 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1836 case GL_UNSIGNED_SHORT_5_5_5_1
:
1837 if (dstFormat
== GL_RGBA
) {
1838 GLushort
*dst
= (GLushort
*) dstAddr
;
1840 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1841 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1842 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1843 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1846 else if (dstFormat
== GL_BGRA
) {
1847 GLushort
*dst
= (GLushort
*) dstAddr
;
1849 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1850 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1851 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1852 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1855 else if (dstFormat
== GL_ABGR_EXT
) {
1856 GLushort
*dst
= (GLushort
*) dstAddr
;
1858 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1859 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1860 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1861 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
1865 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1866 if (dstFormat
== GL_RGBA
) {
1867 GLushort
*dst
= (GLushort
*) dstAddr
;
1869 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1870 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1871 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1872 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1875 else if (dstFormat
== GL_BGRA
) {
1876 GLushort
*dst
= (GLushort
*) dstAddr
;
1878 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
1879 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1880 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1881 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1884 else if (dstFormat
== GL_ABGR_EXT
) {
1885 GLushort
*dst
= (GLushort
*) dstAddr
;
1887 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
1888 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1889 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1890 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1894 case GL_UNSIGNED_INT_8_8_8_8
:
1895 if (dstFormat
== GL_RGBA
) {
1896 GLuint
*dst
= (GLuint
*) dstAddr
;
1898 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
1899 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1900 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
1901 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1904 else if (dstFormat
== GL_BGRA
) {
1905 GLuint
*dst
= (GLuint
*) dstAddr
;
1907 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
1908 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1909 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
1910 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1913 else if (dstFormat
== GL_ABGR_EXT
) {
1914 GLuint
*dst
= (GLuint
*) dstAddr
;
1916 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
1917 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
1918 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
1919 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
1923 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1924 if (dstFormat
== GL_RGBA
) {
1925 GLuint
*dst
= (GLuint
*) dstAddr
;
1927 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
1928 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1929 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1930 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1933 else if (dstFormat
== GL_BGRA
) {
1934 GLuint
*dst
= (GLuint
*) dstAddr
;
1936 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
1937 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1938 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1939 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1942 else if (dstFormat
== GL_ABGR_EXT
) {
1943 GLuint
*dst
= (GLuint
*) dstAddr
;
1945 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
1946 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1947 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1948 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1952 case GL_UNSIGNED_INT_10_10_10_2
:
1953 if (dstFormat
== GL_RGBA
) {
1954 GLuint
*dst
= (GLuint
*) dstAddr
;
1956 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1957 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1958 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1959 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1962 else if (dstFormat
== GL_BGRA
) {
1963 GLuint
*dst
= (GLuint
*) dstAddr
;
1965 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1966 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1967 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1968 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1971 else if (dstFormat
== GL_ABGR_EXT
) {
1972 GLuint
*dst
= (GLuint
*) dstAddr
;
1974 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1975 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1976 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1977 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
1981 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1982 if (dstFormat
== GL_RGBA
) {
1983 GLuint
*dst
= (GLuint
*) dstAddr
;
1985 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
1986 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1987 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1988 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1991 else if (dstFormat
== GL_BGRA
) {
1992 GLuint
*dst
= (GLuint
*) dstAddr
;
1994 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
1995 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1996 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1997 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2000 else if (dstFormat
== GL_ABGR_EXT
) {
2001 GLuint
*dst
= (GLuint
*) dstAddr
;
2003 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2004 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2005 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2006 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2010 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2012 GLuint
*dst
= (GLuint
*) dstAddr
;
2013 for (i
= 0; i
< n
; i
++) {
2014 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2018 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2020 GLuint
*dst
= (GLuint
*) dstAddr
;
2021 for (i
= 0; i
< n
; i
++) {
2022 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2027 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2032 if (dstPacking
->SwapBytes
) {
2033 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2034 if (swapSize
== 2) {
2035 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2037 else if (swapSize
== 4) {
2038 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2047 #define SWAP2BYTE(VALUE) \
2049 GLubyte *bytes = (GLubyte *) &(VALUE); \
2050 GLubyte tmp = bytes[0]; \
2051 bytes[0] = bytes[1]; \
2055 #define SWAP4BYTE(VALUE) \
2057 GLubyte *bytes = (GLubyte *) &(VALUE); \
2058 GLubyte tmp = bytes[0]; \
2059 bytes[0] = bytes[3]; \
2062 bytes[1] = bytes[2]; \
2068 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2069 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2070 const struct gl_pixelstore_attrib
*unpack
)
2072 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2074 ASSERT(srcType
== GL_BITMAP
||
2075 srcType
== GL_UNSIGNED_BYTE
||
2076 srcType
== GL_BYTE
||
2077 srcType
== GL_UNSIGNED_SHORT
||
2078 srcType
== GL_SHORT
||
2079 srcType
== GL_UNSIGNED_INT
||
2080 srcType
== GL_INT
||
2081 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2082 srcType
== GL_HALF_FLOAT_ARB
||
2083 srcType
== GL_FLOAT
||
2084 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2089 GLubyte
*ubsrc
= (GLubyte
*) src
;
2090 if (unpack
->LsbFirst
) {
2091 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2093 for (i
= 0; i
< n
; i
++) {
2094 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2105 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2107 for (i
= 0; i
< n
; i
++) {
2108 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2120 case GL_UNSIGNED_BYTE
:
2123 const GLubyte
*s
= (const GLubyte
*) src
;
2124 for (i
= 0; i
< n
; i
++)
2131 const GLbyte
*s
= (const GLbyte
*) src
;
2132 for (i
= 0; i
< n
; i
++)
2136 case GL_UNSIGNED_SHORT
:
2139 const GLushort
*s
= (const GLushort
*) src
;
2140 if (unpack
->SwapBytes
) {
2141 for (i
= 0; i
< n
; i
++) {
2142 GLushort value
= s
[i
];
2148 for (i
= 0; i
< n
; i
++)
2156 const GLshort
*s
= (const GLshort
*) src
;
2157 if (unpack
->SwapBytes
) {
2158 for (i
= 0; i
< n
; i
++) {
2159 GLshort value
= s
[i
];
2165 for (i
= 0; i
< n
; i
++)
2170 case GL_UNSIGNED_INT
:
2173 const GLuint
*s
= (const GLuint
*) src
;
2174 if (unpack
->SwapBytes
) {
2175 for (i
= 0; i
< n
; i
++) {
2176 GLuint value
= s
[i
];
2182 for (i
= 0; i
< n
; i
++)
2190 const GLint
*s
= (const GLint
*) src
;
2191 if (unpack
->SwapBytes
) {
2192 for (i
= 0; i
< n
; i
++) {
2199 for (i
= 0; i
< n
; i
++)
2207 const GLfloat
*s
= (const GLfloat
*) src
;
2208 if (unpack
->SwapBytes
) {
2209 for (i
= 0; i
< n
; i
++) {
2210 GLfloat value
= s
[i
];
2212 indexes
[i
] = (GLuint
) value
;
2216 for (i
= 0; i
< n
; i
++)
2217 indexes
[i
] = (GLuint
) s
[i
];
2221 case GL_HALF_FLOAT_ARB
:
2224 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2225 if (unpack
->SwapBytes
) {
2226 for (i
= 0; i
< n
; i
++) {
2227 GLhalfARB value
= s
[i
];
2229 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2233 for (i
= 0; i
< n
; i
++)
2234 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2238 case GL_UNSIGNED_INT_24_8_EXT
:
2241 const GLuint
*s
= (const GLuint
*) src
;
2242 if (unpack
->SwapBytes
) {
2243 for (i
= 0; i
< n
; i
++) {
2244 GLuint value
= s
[i
];
2246 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2250 for (i
= 0; i
< n
; i
++)
2251 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2255 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2258 const GLuint
*s
= (const GLuint
*) src
;
2259 if (unpack
->SwapBytes
) {
2260 for (i
= 0; i
< n
; i
++) {
2261 GLuint value
= s
[i
*2+1];
2263 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2267 for (i
= 0; i
< n
; i
++)
2268 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2274 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2281 * Return source/dest RGBA indexes for unpacking pixels.
2284 get_component_mapping(GLenum format
,
2296 case GL_RED_INTEGER_EXT
:
2298 *gSrc
= *bSrc
= *aSrc
= -1;
2301 case GL_GREEN_INTEGER_EXT
:
2303 *rSrc
= *bSrc
= *aSrc
= -1;
2306 case GL_BLUE_INTEGER_EXT
:
2308 *rSrc
= *gSrc
= *aSrc
= -1;
2311 case GL_ALPHA_INTEGER_EXT
:
2312 *rSrc
= *gSrc
= *bSrc
= -1;
2316 case GL_LUMINANCE_INTEGER_EXT
:
2317 *rSrc
= *gSrc
= *bSrc
= 0;
2320 case GL_LUMINANCE_ALPHA
:
2321 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2322 *rSrc
= *gSrc
= *bSrc
= 0;
2326 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2340 case GL_RGB_INTEGER
:
2351 case GL_BGR_INTEGER
:
2362 case GL_RGBA_INTEGER
:
2373 case GL_BGRA_INTEGER
:
2401 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2402 _mesa_lookup_enum_by_nr(format
));
2410 * This function extracts floating point RGBA values from arbitrary
2411 * image data. srcFormat and srcType are the format and type parameters
2412 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2414 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2415 * implements the "Conversion to floating point", "Conversion to RGB",
2416 * and "Final Expansion to RGBA" operations.
2418 * Args: n - number of pixels
2419 * rgba - output colors
2420 * srcFormat - format of incoming data
2421 * srcType - data type of incoming data
2422 * src - source data pointer
2423 * swapBytes - perform byteswapping of incoming data?
2426 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2427 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2428 GLboolean swapBytes
)
2430 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2432 GLint rDst
, bDst
, gDst
, aDst
;
2433 GLboolean intFormat
;
2434 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2436 ASSERT(srcFormat
== GL_RED
||
2437 srcFormat
== GL_GREEN
||
2438 srcFormat
== GL_BLUE
||
2439 srcFormat
== GL_ALPHA
||
2440 srcFormat
== GL_LUMINANCE
||
2441 srcFormat
== GL_LUMINANCE_ALPHA
||
2442 srcFormat
== GL_INTENSITY
||
2443 srcFormat
== GL_RG
||
2444 srcFormat
== GL_RGB
||
2445 srcFormat
== GL_BGR
||
2446 srcFormat
== GL_RGBA
||
2447 srcFormat
== GL_BGRA
||
2448 srcFormat
== GL_ABGR_EXT
||
2449 srcFormat
== GL_DU8DV8_ATI
||
2450 srcFormat
== GL_DUDV_ATI
||
2451 srcFormat
== GL_RED_INTEGER_EXT
||
2452 srcFormat
== GL_GREEN_INTEGER_EXT
||
2453 srcFormat
== GL_BLUE_INTEGER_EXT
||
2454 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2455 srcFormat
== GL_RG_INTEGER
||
2456 srcFormat
== GL_RGB_INTEGER_EXT
||
2457 srcFormat
== GL_RGBA_INTEGER_EXT
||
2458 srcFormat
== GL_BGR_INTEGER_EXT
||
2459 srcFormat
== GL_BGRA_INTEGER_EXT
||
2460 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2461 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2463 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2464 srcType
== GL_BYTE
||
2465 srcType
== GL_UNSIGNED_SHORT
||
2466 srcType
== GL_SHORT
||
2467 srcType
== GL_UNSIGNED_INT
||
2468 srcType
== GL_INT
||
2469 srcType
== GL_HALF_FLOAT_ARB
||
2470 srcType
== GL_FLOAT
||
2471 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2472 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2473 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2474 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2475 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2476 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2477 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2478 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2479 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2480 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2481 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2482 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2483 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2484 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2486 get_component_mapping(srcFormat
,
2487 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2488 &rDst
, &gDst
, &bDst
, &aDst
);
2490 stride
= _mesa_components_in_format(srcFormat
);
2492 intFormat
= _mesa_is_integer_format(srcFormat
);
2494 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2495 if ((SRC_INDEX) < 0) { \
2498 for (i = 0; i < n; i++) { \
2499 rgba[i][DST_INDEX] = DEFAULT_INT; \
2503 for (i = 0; i < n; i++) { \
2504 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2508 else if (swapBytes) { \
2509 const TYPE *s = (const TYPE *) src; \
2511 for (i = 0; i < n; i++) { \
2512 TYPE value = s[SRC_INDEX]; \
2513 if (sizeof(TYPE) == 2) { \
2516 else if (sizeof(TYPE) == 4) { \
2520 rgba[i][DST_INDEX] = (GLfloat) value; \
2522 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2527 const TYPE *s = (const TYPE *) src; \
2530 for (i = 0; i < n; i++) { \
2531 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2536 for (i = 0; i < n; i++) { \
2537 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2544 case GL_UNSIGNED_BYTE
:
2545 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2546 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2547 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2548 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2551 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2552 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2553 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2554 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2556 case GL_UNSIGNED_SHORT
:
2557 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2558 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2559 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2560 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2563 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2564 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2565 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2566 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2568 case GL_UNSIGNED_INT
:
2569 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2570 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2571 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2572 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2575 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2576 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2577 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2578 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2581 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2582 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2583 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2584 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2586 case GL_HALF_FLOAT_ARB
:
2587 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2588 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2589 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2590 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2592 case GL_UNSIGNED_BYTE_3_3_2
:
2594 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2601 for (i
= 0; i
< n
; i
++) {
2602 GLubyte p
= ubsrc
[i
];
2603 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2604 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2605 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2606 rgba
[i
][aDst
] = 1.0F
;
2610 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2612 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2619 for (i
= 0; i
< n
; i
++) {
2620 GLubyte p
= ubsrc
[i
];
2621 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2622 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2623 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2624 rgba
[i
][aDst
] = 1.0F
;
2628 case GL_UNSIGNED_SHORT_5_6_5
:
2635 const GLushort
*ussrc
= (const GLushort
*) src
;
2637 for (i
= 0; i
< n
; i
++) {
2638 GLushort p
= ussrc
[i
];
2640 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2641 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2642 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2643 rgba
[i
][aDst
] = 1.0F
;
2647 const GLushort
*ussrc
= (const GLushort
*) src
;
2649 for (i
= 0; i
< n
; i
++) {
2650 GLushort p
= ussrc
[i
];
2651 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2652 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2653 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2654 rgba
[i
][aDst
] = 1.0F
;
2658 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2665 const GLushort
*ussrc
= (const GLushort
*) src
;
2667 for (i
= 0; i
< n
; i
++) {
2668 GLushort p
= ussrc
[i
];
2670 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2671 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2672 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2673 rgba
[i
][aDst
] = 1.0F
;
2677 const GLushort
*ussrc
= (const GLushort
*) src
;
2679 for (i
= 0; i
< n
; i
++) {
2680 GLushort p
= ussrc
[i
];
2681 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2682 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2683 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2684 rgba
[i
][aDst
] = 1.0F
;
2688 case GL_UNSIGNED_SHORT_4_4_4_4
:
2690 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2693 const GLushort
*ussrc
= (const GLushort
*) src
;
2695 for (i
= 0; i
< n
; i
++) {
2696 GLushort p
= ussrc
[i
];
2698 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2699 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2700 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2701 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2705 const GLushort
*ussrc
= (const GLushort
*) src
;
2707 for (i
= 0; i
< n
; i
++) {
2708 GLushort p
= ussrc
[i
];
2709 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2710 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2711 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2712 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2716 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2718 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2721 const GLushort
*ussrc
= (const GLushort
*) src
;
2723 for (i
= 0; i
< n
; i
++) {
2724 GLushort p
= ussrc
[i
];
2726 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2727 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2728 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2729 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2733 const GLushort
*ussrc
= (const GLushort
*) src
;
2735 for (i
= 0; i
< n
; i
++) {
2736 GLushort p
= ussrc
[i
];
2737 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2738 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2739 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2740 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2744 case GL_UNSIGNED_SHORT_5_5_5_1
:
2746 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2749 const GLushort
*ussrc
= (const GLushort
*) src
;
2751 for (i
= 0; i
< n
; i
++) {
2752 GLushort p
= ussrc
[i
];
2754 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2755 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2756 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2757 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2761 const GLushort
*ussrc
= (const GLushort
*) src
;
2763 for (i
= 0; i
< n
; i
++) {
2764 GLushort p
= ussrc
[i
];
2765 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2766 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2767 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2768 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2772 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2774 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2777 const GLushort
*ussrc
= (const GLushort
*) src
;
2779 for (i
= 0; i
< n
; i
++) {
2780 GLushort p
= ussrc
[i
];
2782 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2783 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2784 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2785 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2789 const GLushort
*ussrc
= (const GLushort
*) src
;
2791 for (i
= 0; i
< n
; i
++) {
2792 GLushort p
= ussrc
[i
];
2793 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2794 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2795 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2796 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2800 case GL_UNSIGNED_INT_8_8_8_8
:
2802 const GLuint
*uisrc
= (const GLuint
*) src
;
2805 for (i
= 0; i
< n
; i
++) {
2806 GLuint p
= uisrc
[i
];
2807 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2808 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2809 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2810 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2814 for (i
= 0; i
< n
; i
++) {
2815 GLuint p
= uisrc
[i
];
2816 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2817 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2818 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2819 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2824 const GLuint
*uisrc
= (const GLuint
*) src
;
2827 for (i
= 0; i
< n
; i
++) {
2828 GLuint p
= uisrc
[i
];
2829 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2830 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2831 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2832 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2836 for (i
= 0; i
< n
; i
++) {
2837 GLuint p
= uisrc
[i
];
2838 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2839 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2840 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2841 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2846 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2848 const GLuint
*uisrc
= (const GLuint
*) src
;
2851 for (i
= 0; i
< n
; i
++) {
2852 GLuint p
= uisrc
[i
];
2853 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2854 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2855 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2856 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2860 for (i
= 0; i
< n
; i
++) {
2861 GLuint p
= uisrc
[i
];
2862 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2863 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2864 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2865 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2870 const GLuint
*uisrc
= (const GLuint
*) src
;
2873 for (i
= 0; i
< n
; i
++) {
2874 GLuint p
= uisrc
[i
];
2875 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2876 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2877 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2878 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2882 for (i
= 0; i
< n
; i
++) {
2883 GLuint p
= uisrc
[i
];
2884 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2885 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2886 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2887 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2892 case GL_UNSIGNED_INT_10_10_10_2
:
2894 rs
= 1.0F
/ 1023.0F
;
2895 gs
= 1.0F
/ 1023.0F
;
2896 bs
= 1.0F
/ 1023.0F
;
2900 const GLuint
*uisrc
= (const GLuint
*) src
;
2902 for (i
= 0; i
< n
; i
++) {
2903 GLuint p
= uisrc
[i
];
2905 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2906 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2907 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2908 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2912 const GLuint
*uisrc
= (const GLuint
*) src
;
2914 for (i
= 0; i
< n
; i
++) {
2915 GLuint p
= uisrc
[i
];
2916 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2917 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2918 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2919 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2923 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2925 rs
= 1.0F
/ 1023.0F
;
2926 gs
= 1.0F
/ 1023.0F
;
2927 bs
= 1.0F
/ 1023.0F
;
2931 const GLuint
*uisrc
= (const GLuint
*) src
;
2933 for (i
= 0; i
< n
; i
++) {
2934 GLuint p
= uisrc
[i
];
2936 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2937 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2938 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2939 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2943 const GLuint
*uisrc
= (const GLuint
*) src
;
2945 for (i
= 0; i
< n
; i
++) {
2946 GLuint p
= uisrc
[i
];
2947 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2948 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2949 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2950 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2954 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2956 const GLuint
*uisrc
= (const GLuint
*) src
;
2959 for (i
= 0; i
< n
; i
++) {
2960 GLuint p
= uisrc
[i
];
2962 rgb9e5_to_float3(p
, f
);
2963 rgba
[i
][rDst
] = f
[0];
2964 rgba
[i
][gDst
] = f
[1];
2965 rgba
[i
][bDst
] = f
[2];
2966 rgba
[i
][aDst
] = 1.0F
;
2970 const GLuint
*uisrc
= (const GLuint
*) src
;
2973 for (i
= 0; i
< n
; i
++) {
2974 rgb9e5_to_float3(uisrc
[i
], f
);
2975 rgba
[i
][rDst
] = f
[0];
2976 rgba
[i
][gDst
] = f
[1];
2977 rgba
[i
][bDst
] = f
[2];
2978 rgba
[i
][aDst
] = 1.0F
;
2982 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2984 const GLuint
*uisrc
= (const GLuint
*) src
;
2987 for (i
= 0; i
< n
; i
++) {
2988 GLuint p
= uisrc
[i
];
2990 r11g11b10f_to_float3(p
, f
);
2991 rgba
[i
][rDst
] = f
[0];
2992 rgba
[i
][gDst
] = f
[1];
2993 rgba
[i
][bDst
] = f
[2];
2994 rgba
[i
][aDst
] = 1.0F
;
2998 const GLuint
*uisrc
= (const GLuint
*) src
;
3001 for (i
= 0; i
< n
; i
++) {
3002 r11g11b10f_to_float3(uisrc
[i
], f
);
3003 rgba
[i
][rDst
] = f
[0];
3004 rgba
[i
][gDst
] = f
[1];
3005 rgba
[i
][bDst
] = f
[2];
3006 rgba
[i
][aDst
] = 1.0F
;
3011 _mesa_problem(NULL
, "bad srcType in extract float data");
3018 static inline GLuint
3019 clamp_float_to_uint(GLfloat f
)
3021 return f
< 0.0F
? 0 : F_TO_I(f
);
3025 static inline GLuint
3026 clamp_half_to_uint(GLhalfARB h
)
3028 GLfloat f
= _mesa_half_to_float(h
);
3029 return f
< 0.0F
? 0 : F_TO_I(f
);
3034 * \sa extract_float_rgba()
3037 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3038 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3039 GLboolean swapBytes
)
3041 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3043 GLint rDst
, bDst
, gDst
, aDst
;
3045 ASSERT(srcFormat
== GL_RED
||
3046 srcFormat
== GL_GREEN
||
3047 srcFormat
== GL_BLUE
||
3048 srcFormat
== GL_ALPHA
||
3049 srcFormat
== GL_LUMINANCE
||
3050 srcFormat
== GL_LUMINANCE_ALPHA
||
3051 srcFormat
== GL_INTENSITY
||
3052 srcFormat
== GL_RG
||
3053 srcFormat
== GL_RGB
||
3054 srcFormat
== GL_BGR
||
3055 srcFormat
== GL_RGBA
||
3056 srcFormat
== GL_BGRA
||
3057 srcFormat
== GL_ABGR_EXT
||
3058 srcFormat
== GL_DU8DV8_ATI
||
3059 srcFormat
== GL_DUDV_ATI
||
3060 srcFormat
== GL_RED_INTEGER_EXT
||
3061 srcFormat
== GL_RG_INTEGER
||
3062 srcFormat
== GL_GREEN_INTEGER_EXT
||
3063 srcFormat
== GL_BLUE_INTEGER_EXT
||
3064 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3065 srcFormat
== GL_RGB_INTEGER_EXT
||
3066 srcFormat
== GL_RGBA_INTEGER_EXT
||
3067 srcFormat
== GL_BGR_INTEGER_EXT
||
3068 srcFormat
== GL_BGRA_INTEGER_EXT
||
3069 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3070 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3072 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3073 srcType
== GL_BYTE
||
3074 srcType
== GL_UNSIGNED_SHORT
||
3075 srcType
== GL_SHORT
||
3076 srcType
== GL_UNSIGNED_INT
||
3077 srcType
== GL_INT
||
3078 srcType
== GL_HALF_FLOAT_ARB
||
3079 srcType
== GL_FLOAT
||
3080 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3081 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3082 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3083 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3084 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3085 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3086 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3087 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3088 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3089 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3090 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3091 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3092 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3093 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3095 get_component_mapping(srcFormat
,
3096 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3097 &rDst
, &gDst
, &bDst
, &aDst
);
3099 stride
= _mesa_components_in_format(srcFormat
);
3101 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3102 if ((SRC_INDEX) < 0) { \
3104 for (i = 0; i < n; i++) { \
3105 rgba[i][DST_INDEX] = DEFAULT; \
3108 else if (swapBytes) { \
3109 const TYPE *s = (const TYPE *) src; \
3111 for (i = 0; i < n; i++) { \
3112 TYPE value = s[SRC_INDEX]; \
3113 if (sizeof(TYPE) == 2) { \
3116 else if (sizeof(TYPE) == 4) { \
3119 rgba[i][DST_INDEX] = CONVERSION(value); \
3124 const TYPE *s = (const TYPE *) src; \
3126 for (i = 0; i < n; i++) { \
3127 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3133 case GL_UNSIGNED_BYTE
:
3134 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3135 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3136 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3137 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3140 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3141 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3142 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3143 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3145 case GL_UNSIGNED_SHORT
:
3146 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3147 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3148 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3149 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3152 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3153 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3154 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3155 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3157 case GL_UNSIGNED_INT
:
3158 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3159 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3160 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3161 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3164 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3165 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3166 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3167 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3170 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3171 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3172 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3173 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3175 case GL_HALF_FLOAT_ARB
:
3176 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3177 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3178 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3179 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3181 case GL_UNSIGNED_BYTE_3_3_2
:
3183 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3185 for (i
= 0; i
< n
; i
++) {
3186 GLubyte p
= ubsrc
[i
];
3187 rgba
[i
][rDst
] = ((p
>> 5) );
3188 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3189 rgba
[i
][bDst
] = ((p
) & 0x3);
3194 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3196 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3198 for (i
= 0; i
< n
; i
++) {
3199 GLubyte p
= ubsrc
[i
];
3200 rgba
[i
][rDst
] = ((p
) & 0x7);
3201 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3202 rgba
[i
][bDst
] = ((p
>> 6) );
3207 case GL_UNSIGNED_SHORT_5_6_5
:
3209 const GLushort
*ussrc
= (const GLushort
*) src
;
3211 for (i
= 0; i
< n
; i
++) {
3212 GLushort p
= ussrc
[i
];
3214 rgba
[i
][rDst
] = ((p
>> 11) );
3215 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3216 rgba
[i
][bDst
] = ((p
) & 0x1f);
3221 const GLushort
*ussrc
= (const GLushort
*) src
;
3223 for (i
= 0; i
< n
; i
++) {
3224 GLushort p
= ussrc
[i
];
3225 rgba
[i
][rDst
] = ((p
>> 11) );
3226 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3227 rgba
[i
][bDst
] = ((p
) & 0x1f);
3232 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3234 const GLushort
*ussrc
= (const GLushort
*) src
;
3236 for (i
= 0; i
< n
; i
++) {
3237 GLushort p
= ussrc
[i
];
3239 rgba
[i
][rDst
] = ((p
) & 0x1f);
3240 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3241 rgba
[i
][bDst
] = ((p
>> 11) );
3246 const GLushort
*ussrc
= (const GLushort
*) src
;
3248 for (i
= 0; i
< n
; i
++) {
3249 GLushort p
= ussrc
[i
];
3250 rgba
[i
][rDst
] = ((p
) & 0x1f);
3251 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3252 rgba
[i
][bDst
] = ((p
>> 11) );
3257 case GL_UNSIGNED_SHORT_4_4_4_4
:
3259 const GLushort
*ussrc
= (const GLushort
*) src
;
3261 for (i
= 0; i
< n
; i
++) {
3262 GLushort p
= ussrc
[i
];
3264 rgba
[i
][rDst
] = ((p
>> 12) );
3265 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3266 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3267 rgba
[i
][aDst
] = ((p
) & 0xf);
3271 const GLushort
*ussrc
= (const GLushort
*) src
;
3273 for (i
= 0; i
< n
; i
++) {
3274 GLushort p
= ussrc
[i
];
3275 rgba
[i
][rDst
] = ((p
>> 12) );
3276 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3277 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3278 rgba
[i
][aDst
] = ((p
) & 0xf);
3282 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3284 const GLushort
*ussrc
= (const GLushort
*) src
;
3286 for (i
= 0; i
< n
; i
++) {
3287 GLushort p
= ussrc
[i
];
3289 rgba
[i
][rDst
] = ((p
) & 0xf);
3290 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3291 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3292 rgba
[i
][aDst
] = ((p
>> 12) );
3296 const GLushort
*ussrc
= (const GLushort
*) src
;
3298 for (i
= 0; i
< n
; i
++) {
3299 GLushort p
= ussrc
[i
];
3300 rgba
[i
][rDst
] = ((p
) & 0xf);
3301 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3302 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3303 rgba
[i
][aDst
] = ((p
>> 12) );
3307 case GL_UNSIGNED_SHORT_5_5_5_1
:
3309 const GLushort
*ussrc
= (const GLushort
*) src
;
3311 for (i
= 0; i
< n
; i
++) {
3312 GLushort p
= ussrc
[i
];
3314 rgba
[i
][rDst
] = ((p
>> 11) );
3315 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3316 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3317 rgba
[i
][aDst
] = ((p
) & 0x1 );
3321 const GLushort
*ussrc
= (const GLushort
*) src
;
3323 for (i
= 0; i
< n
; i
++) {
3324 GLushort p
= ussrc
[i
];
3325 rgba
[i
][rDst
] = ((p
>> 11) );
3326 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3327 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3328 rgba
[i
][aDst
] = ((p
) & 0x1 );
3332 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3334 const GLushort
*ussrc
= (const GLushort
*) src
;
3336 for (i
= 0; i
< n
; i
++) {
3337 GLushort p
= ussrc
[i
];
3339 rgba
[i
][rDst
] = ((p
) & 0x1f);
3340 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3341 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3342 rgba
[i
][aDst
] = ((p
>> 15) );
3346 const GLushort
*ussrc
= (const GLushort
*) src
;
3348 for (i
= 0; i
< n
; i
++) {
3349 GLushort p
= ussrc
[i
];
3350 rgba
[i
][rDst
] = ((p
) & 0x1f);
3351 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3352 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3353 rgba
[i
][aDst
] = ((p
>> 15) );
3357 case GL_UNSIGNED_INT_8_8_8_8
:
3359 const GLuint
*uisrc
= (const GLuint
*) src
;
3361 for (i
= 0; i
< n
; i
++) {
3362 GLuint p
= uisrc
[i
];
3363 rgba
[i
][rDst
] = ((p
) & 0xff);
3364 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3365 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3366 rgba
[i
][aDst
] = ((p
>> 24) );
3370 const GLuint
*uisrc
= (const GLuint
*) src
;
3372 for (i
= 0; i
< n
; i
++) {
3373 GLuint p
= uisrc
[i
];
3374 rgba
[i
][rDst
] = ((p
>> 24) );
3375 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3376 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3377 rgba
[i
][aDst
] = ((p
) & 0xff);
3381 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3383 const GLuint
*uisrc
= (const GLuint
*) src
;
3385 for (i
= 0; i
< n
; i
++) {
3386 GLuint p
= uisrc
[i
];
3387 rgba
[i
][rDst
] = ((p
>> 24) );
3388 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3389 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3390 rgba
[i
][aDst
] = ((p
) & 0xff);
3394 const GLuint
*uisrc
= (const GLuint
*) src
;
3396 for (i
= 0; i
< n
; i
++) {
3397 GLuint p
= uisrc
[i
];
3398 rgba
[i
][rDst
] = ((p
) & 0xff);
3399 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3400 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3401 rgba
[i
][aDst
] = ((p
>> 24) );
3405 case GL_UNSIGNED_INT_10_10_10_2
:
3407 const GLuint
*uisrc
= (const GLuint
*) src
;
3409 for (i
= 0; i
< n
; i
++) {
3410 GLuint p
= uisrc
[i
];
3412 rgba
[i
][rDst
] = ((p
>> 22) );
3413 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3414 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3415 rgba
[i
][aDst
] = ((p
) & 0x3 );
3419 const GLuint
*uisrc
= (const GLuint
*) src
;
3421 for (i
= 0; i
< n
; i
++) {
3422 GLuint p
= uisrc
[i
];
3423 rgba
[i
][rDst
] = ((p
>> 22) );
3424 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3425 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3426 rgba
[i
][aDst
] = ((p
) & 0x3 );
3430 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3432 const GLuint
*uisrc
= (const GLuint
*) src
;
3434 for (i
= 0; i
< n
; i
++) {
3435 GLuint p
= uisrc
[i
];
3437 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3438 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3439 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3440 rgba
[i
][aDst
] = ((p
>> 30) );
3444 const GLuint
*uisrc
= (const GLuint
*) src
;
3446 for (i
= 0; i
< n
; i
++) {
3447 GLuint p
= uisrc
[i
];
3448 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3449 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3450 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3451 rgba
[i
][aDst
] = ((p
>> 30) );
3455 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3457 const GLuint
*uisrc
= (const GLuint
*) src
;
3460 for (i
= 0; i
< n
; i
++) {
3461 GLuint p
= uisrc
[i
];
3463 rgb9e5_to_float3(p
, f
);
3464 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3465 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3466 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3471 const GLuint
*uisrc
= (const GLuint
*) src
;
3474 for (i
= 0; i
< n
; i
++) {
3475 GLuint p
= uisrc
[i
];
3476 rgb9e5_to_float3(p
, f
);
3477 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3478 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3479 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3484 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3486 const GLuint
*uisrc
= (const GLuint
*) src
;
3489 for (i
= 0; i
< n
; i
++) {
3490 GLuint p
= uisrc
[i
];
3492 r11g11b10f_to_float3(p
, f
);
3493 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3494 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3495 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3500 const GLuint
*uisrc
= (const GLuint
*) src
;
3503 for (i
= 0; i
< n
; i
++) {
3504 GLuint p
= uisrc
[i
];
3505 r11g11b10f_to_float3(p
, f
);
3506 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3507 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3508 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3514 _mesa_problem(NULL
, "bad srcType in extract uint data");
3523 * Unpack a row of color image data from a client buffer according to
3524 * the pixel unpacking parameters.
3525 * Return GLubyte values in the specified dest image format.
3526 * This is used by glDrawPixels and glTexImage?D().
3527 * \param ctx - the context
3528 * n - number of pixels in the span
3529 * dstFormat - format of destination color array
3530 * dest - the destination color array
3531 * srcFormat - source image format
3532 * srcType - source image data type
3533 * source - source image pointer
3534 * srcPacking - pixel unpacking parameters
3535 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3537 * XXX perhaps expand this to process whole images someday.
3540 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3541 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3542 GLenum srcFormat
, GLenum srcType
,
3543 const GLvoid
*source
,
3544 const struct gl_pixelstore_attrib
*srcPacking
,
3545 GLbitfield transferOps
)
3547 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3548 ASSERT(dstFormat
== GL_ALPHA
||
3549 dstFormat
== GL_LUMINANCE
||
3550 dstFormat
== GL_LUMINANCE_ALPHA
||
3551 dstFormat
== GL_INTENSITY
||
3552 dstFormat
== GL_RED
||
3553 dstFormat
== GL_RG
||
3554 dstFormat
== GL_RGB
||
3555 dstFormat
== GL_RGBA
);
3557 ASSERT(srcFormat
== GL_RED
||
3558 srcFormat
== GL_GREEN
||
3559 srcFormat
== GL_BLUE
||
3560 srcFormat
== GL_ALPHA
||
3561 srcFormat
== GL_LUMINANCE
||
3562 srcFormat
== GL_LUMINANCE_ALPHA
||
3563 srcFormat
== GL_INTENSITY
||
3564 srcFormat
== GL_RG
||
3565 srcFormat
== GL_RGB
||
3566 srcFormat
== GL_BGR
||
3567 srcFormat
== GL_RGBA
||
3568 srcFormat
== GL_BGRA
||
3569 srcFormat
== GL_ABGR_EXT
||
3570 srcFormat
== GL_COLOR_INDEX
);
3572 ASSERT(srcType
== GL_BITMAP
||
3573 srcType
== GL_UNSIGNED_BYTE
||
3574 srcType
== GL_BYTE
||
3575 srcType
== GL_UNSIGNED_SHORT
||
3576 srcType
== GL_SHORT
||
3577 srcType
== GL_UNSIGNED_INT
||
3578 srcType
== GL_INT
||
3579 srcType
== GL_HALF_FLOAT_ARB
||
3580 srcType
== GL_FLOAT
||
3581 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3582 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3583 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3584 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3585 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3586 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3587 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3588 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3589 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3590 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3591 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3592 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3593 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3594 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3596 /* EXT_texture_integer specifies no transfer ops on integer
3597 * types in the resolved issues section. Just set them to 0
3598 * for integer surfaces.
3603 /* Try simple cases first */
3604 if (transferOps
== 0) {
3605 if (srcType
== GL_UNSIGNED_BYTE
) {
3606 if (dstFormat
== GL_RGBA
) {
3607 if (srcFormat
== GL_RGBA
) {
3608 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3611 else if (srcFormat
== GL_RGB
) {
3613 const GLubyte
*src
= (const GLubyte
*) source
;
3614 GLubyte
*dst
= dest
;
3615 for (i
= 0; i
< n
; i
++) {
3626 else if (dstFormat
== GL_RGB
) {
3627 if (srcFormat
== GL_RGB
) {
3628 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3631 else if (srcFormat
== GL_RGBA
) {
3633 const GLubyte
*src
= (const GLubyte
*) source
;
3634 GLubyte
*dst
= dest
;
3635 for (i
= 0; i
< n
; i
++) {
3645 else if (dstFormat
== srcFormat
) {
3646 GLint comps
= _mesa_components_in_format(srcFormat
);
3648 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3655 /* general solution begins here */
3657 GLint dstComponents
;
3658 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3659 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3662 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3666 dstComponents
= _mesa_components_in_format( dstFormat
);
3667 /* source & dest image formats should have been error checked by now */
3668 assert(dstComponents
> 0);
3671 * Extract image data and convert to RGBA floats
3673 if (srcFormat
== GL_COLOR_INDEX
) {
3674 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3677 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3682 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3685 /* Convert indexes to RGBA */
3686 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3687 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3689 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3691 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3692 * with color indexes.
3694 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3699 /* non-color index data */
3700 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3701 srcPacking
->SwapBytes
);
3704 /* Need to clamp if returning GLubytes */
3705 transferOps
|= IMAGE_CLAMP_BIT
;
3708 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3711 get_component_indexes(dstFormat
,
3712 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3714 /* Now return the GLubyte data in the requested dstFormat */
3716 GLubyte
*dst
= dest
;
3718 for (i
= 0; i
< n
; i
++) {
3719 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3720 dst
+= dstComponents
;
3725 GLubyte
*dst
= dest
;
3727 for (i
= 0; i
< n
; i
++) {
3728 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3729 dst
+= dstComponents
;
3734 GLubyte
*dst
= dest
;
3736 for (i
= 0; i
< n
; i
++) {
3737 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3738 dst
+= dstComponents
;
3743 GLubyte
*dst
= dest
;
3745 for (i
= 0; i
< n
; i
++) {
3746 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3747 dst
+= dstComponents
;
3752 GLubyte
*dst
= dest
;
3755 assert(dstComponents
== 1);
3756 for (i
= 0; i
< n
; i
++) {
3757 /* Intensity comes from red channel */
3758 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3763 GLubyte
*dst
= dest
;
3766 for (i
= 0; i
< n
; i
++) {
3767 /* Luminance comes from red channel */
3768 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3769 dst
+= dstComponents
;
3779 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3780 * instead of GLubyte.
3783 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3784 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3785 GLenum srcFormat
, GLenum srcType
,
3786 const GLvoid
*source
,
3787 const struct gl_pixelstore_attrib
*srcPacking
,
3788 GLbitfield transferOps
)
3790 ASSERT(dstFormat
== GL_ALPHA
||
3791 dstFormat
== GL_LUMINANCE
||
3792 dstFormat
== GL_LUMINANCE_ALPHA
||
3793 dstFormat
== GL_INTENSITY
||
3794 dstFormat
== GL_RED
||
3795 dstFormat
== GL_RG
||
3796 dstFormat
== GL_RGB
||
3797 dstFormat
== GL_RGBA
);
3799 ASSERT(srcFormat
== GL_RED
||
3800 srcFormat
== GL_GREEN
||
3801 srcFormat
== GL_BLUE
||
3802 srcFormat
== GL_ALPHA
||
3803 srcFormat
== GL_LUMINANCE
||
3804 srcFormat
== GL_LUMINANCE_ALPHA
||
3805 srcFormat
== GL_INTENSITY
||
3806 srcFormat
== GL_RG
||
3807 srcFormat
== GL_RGB
||
3808 srcFormat
== GL_BGR
||
3809 srcFormat
== GL_RGBA
||
3810 srcFormat
== GL_BGRA
||
3811 srcFormat
== GL_ABGR_EXT
||
3812 srcFormat
== GL_RED_INTEGER_EXT
||
3813 srcFormat
== GL_GREEN_INTEGER_EXT
||
3814 srcFormat
== GL_BLUE_INTEGER_EXT
||
3815 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3816 srcFormat
== GL_RG_INTEGER
||
3817 srcFormat
== GL_RGB_INTEGER_EXT
||
3818 srcFormat
== GL_RGBA_INTEGER_EXT
||
3819 srcFormat
== GL_BGR_INTEGER_EXT
||
3820 srcFormat
== GL_BGRA_INTEGER_EXT
||
3821 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3822 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3823 srcFormat
== GL_COLOR_INDEX
);
3825 ASSERT(srcType
== GL_BITMAP
||
3826 srcType
== GL_UNSIGNED_BYTE
||
3827 srcType
== GL_BYTE
||
3828 srcType
== GL_UNSIGNED_SHORT
||
3829 srcType
== GL_SHORT
||
3830 srcType
== GL_UNSIGNED_INT
||
3831 srcType
== GL_INT
||
3832 srcType
== GL_HALF_FLOAT_ARB
||
3833 srcType
== GL_FLOAT
||
3834 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3835 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3836 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3837 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3838 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3839 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3840 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3841 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3842 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3843 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3844 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3845 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3846 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3847 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3849 /* general solution, no special cases, yet */
3851 GLint dstComponents
;
3852 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3853 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3854 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3857 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3861 dstComponents
= _mesa_components_in_format( dstFormat
);
3862 /* source & dest image formats should have been error checked by now */
3863 assert(dstComponents
> 0);
3865 /* EXT_texture_integer specifies no transfer ops on integer
3866 * types in the resolved issues section. Just set them to 0
3867 * for integer surfaces.
3873 * Extract image data and convert to RGBA floats
3875 if (srcFormat
== GL_COLOR_INDEX
) {
3876 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3879 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3884 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3887 /* Convert indexes to RGBA */
3888 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3889 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3891 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3893 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3894 * with color indexes.
3896 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3901 /* non-color index data */
3902 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3903 srcPacking
->SwapBytes
);
3907 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3910 get_component_indexes(dstFormat
,
3911 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3913 /* Now pack results in the requested dstFormat */
3915 GLfloat
*dst
= dest
;
3917 for (i
= 0; i
< n
; i
++) {
3918 dst
[rDst
] = rgba
[i
][RCOMP
];
3919 dst
+= dstComponents
;
3924 GLfloat
*dst
= dest
;
3926 for (i
= 0; i
< n
; i
++) {
3927 dst
[gDst
] = rgba
[i
][GCOMP
];
3928 dst
+= dstComponents
;
3933 GLfloat
*dst
= dest
;
3935 for (i
= 0; i
< n
; i
++) {
3936 dst
[bDst
] = rgba
[i
][BCOMP
];
3937 dst
+= dstComponents
;
3942 GLfloat
*dst
= dest
;
3944 for (i
= 0; i
< n
; i
++) {
3945 dst
[aDst
] = rgba
[i
][ACOMP
];
3946 dst
+= dstComponents
;
3951 GLfloat
*dst
= dest
;
3954 assert(dstComponents
== 1);
3955 for (i
= 0; i
< n
; i
++) {
3956 /* Intensity comes from red channel */
3957 dst
[i
] = rgba
[i
][RCOMP
];
3962 GLfloat
*dst
= dest
;
3965 for (i
= 0; i
< n
; i
++) {
3966 /* Luminance comes from red channel */
3967 dst
[0] = rgba
[i
][RCOMP
];
3968 dst
+= dstComponents
;
3978 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3979 * instead of GLubyte.
3980 * No pixel transfer ops are applied.
3983 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3984 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3985 GLenum srcFormat
, GLenum srcType
,
3986 const GLvoid
*source
,
3987 const struct gl_pixelstore_attrib
*srcPacking
)
3989 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3992 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3996 ASSERT(dstFormat
== GL_ALPHA
||
3997 dstFormat
== GL_LUMINANCE
||
3998 dstFormat
== GL_LUMINANCE_ALPHA
||
3999 dstFormat
== GL_INTENSITY
||
4000 dstFormat
== GL_RED
||
4001 dstFormat
== GL_RG
||
4002 dstFormat
== GL_RGB
||
4003 dstFormat
== GL_RGBA
);
4005 ASSERT(srcFormat
== GL_RED
||
4006 srcFormat
== GL_GREEN
||
4007 srcFormat
== GL_BLUE
||
4008 srcFormat
== GL_ALPHA
||
4009 srcFormat
== GL_LUMINANCE
||
4010 srcFormat
== GL_LUMINANCE_ALPHA
||
4011 srcFormat
== GL_INTENSITY
||
4012 srcFormat
== GL_RG
||
4013 srcFormat
== GL_RGB
||
4014 srcFormat
== GL_BGR
||
4015 srcFormat
== GL_RGBA
||
4016 srcFormat
== GL_BGRA
||
4017 srcFormat
== GL_ABGR_EXT
||
4018 srcFormat
== GL_RED_INTEGER_EXT
||
4019 srcFormat
== GL_GREEN_INTEGER_EXT
||
4020 srcFormat
== GL_BLUE_INTEGER_EXT
||
4021 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4022 srcFormat
== GL_RG_INTEGER
||
4023 srcFormat
== GL_RGB_INTEGER_EXT
||
4024 srcFormat
== GL_RGBA_INTEGER_EXT
||
4025 srcFormat
== GL_BGR_INTEGER_EXT
||
4026 srcFormat
== GL_BGRA_INTEGER_EXT
||
4027 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4028 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4030 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4031 srcType
== GL_BYTE
||
4032 srcType
== GL_UNSIGNED_SHORT
||
4033 srcType
== GL_SHORT
||
4034 srcType
== GL_UNSIGNED_INT
||
4035 srcType
== GL_INT
||
4036 srcType
== GL_HALF_FLOAT_ARB
||
4037 srcType
== GL_FLOAT
||
4038 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4039 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4040 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4041 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4042 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4043 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4044 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4045 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4046 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4047 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4048 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4049 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4050 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4051 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4054 /* Extract image data as uint[4] pixels */
4055 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4056 srcPacking
->SwapBytes
);
4058 if (dstFormat
== GL_RGBA
) {
4060 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4064 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4065 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4067 assert(dstComponents
> 0);
4069 get_component_indexes(dstFormat
,
4070 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4072 /* Now pack values in the requested dest format */
4076 for (i
= 0; i
< n
; i
++) {
4077 dst
[rDst
] = rgba
[i
][RCOMP
];
4078 dst
+= dstComponents
;
4085 for (i
= 0; i
< n
; i
++) {
4086 dst
[gDst
] = rgba
[i
][GCOMP
];
4087 dst
+= dstComponents
;
4094 for (i
= 0; i
< n
; i
++) {
4095 dst
[bDst
] = rgba
[i
][BCOMP
];
4096 dst
+= dstComponents
;
4103 for (i
= 0; i
< n
; i
++) {
4104 dst
[aDst
] = rgba
[i
][ACOMP
];
4105 dst
+= dstComponents
;
4113 assert(dstComponents
== 1);
4114 for (i
= 0; i
< n
; i
++) {
4115 /* Intensity comes from red channel */
4116 dst
[i
] = rgba
[i
][RCOMP
];
4124 for (i
= 0; i
< n
; i
++) {
4125 /* Luminance comes from red channel */
4126 dst
[0] = rgba
[i
][RCOMP
];
4127 dst
+= dstComponents
;
4138 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4139 * directly return GLbyte data, no transfer ops apply.
4142 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4143 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4144 GLenum srcFormat
, GLenum srcType
,
4145 const GLvoid
*source
,
4146 const struct gl_pixelstore_attrib
*srcPacking
,
4147 GLbitfield transferOps
)
4149 ASSERT(dstFormat
== GL_DUDV_ATI
);
4150 ASSERT(srcFormat
== GL_DUDV_ATI
||
4151 srcFormat
== GL_DU8DV8_ATI
);
4153 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4154 srcType
== GL_BYTE
||
4155 srcType
== GL_UNSIGNED_SHORT
||
4156 srcType
== GL_SHORT
||
4157 srcType
== GL_UNSIGNED_INT
||
4158 srcType
== GL_INT
||
4159 srcType
== GL_HALF_FLOAT_ARB
||
4160 srcType
== GL_FLOAT
);
4162 /* general solution */
4164 GLint dstComponents
;
4167 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4170 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4174 dstComponents
= _mesa_components_in_format( dstFormat
);
4175 /* source & dest image formats should have been error checked by now */
4176 assert(dstComponents
> 0);
4179 * Extract image data and convert to RGBA floats
4181 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4182 srcPacking
->SwapBytes
);
4185 /* Now determine which color channels we need to produce.
4186 * And determine the dest index (offset) within each color tuple.
4189 /* Now pack results in the requested dstFormat */
4190 for (i
= 0; i
< n
; i
++) {
4191 /* not sure - need clamp[-1,1] here? */
4192 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4193 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4194 dst
+= dstComponents
;
4202 * Unpack a row of color index data from a client buffer according to
4203 * the pixel unpacking parameters.
4204 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4206 * Args: ctx - the context
4207 * n - number of pixels
4208 * dstType - destination data type
4209 * dest - destination array
4210 * srcType - source pixel type
4211 * source - source data pointer
4212 * srcPacking - pixel unpacking parameters
4213 * transferOps - the pixel transfer operations to apply
4216 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4217 GLenum dstType
, GLvoid
*dest
,
4218 GLenum srcType
, const GLvoid
*source
,
4219 const struct gl_pixelstore_attrib
*srcPacking
,
4220 GLbitfield transferOps
)
4222 ASSERT(srcType
== GL_BITMAP
||
4223 srcType
== GL_UNSIGNED_BYTE
||
4224 srcType
== GL_BYTE
||
4225 srcType
== GL_UNSIGNED_SHORT
||
4226 srcType
== GL_SHORT
||
4227 srcType
== GL_UNSIGNED_INT
||
4228 srcType
== GL_INT
||
4229 srcType
== GL_HALF_FLOAT_ARB
||
4230 srcType
== GL_FLOAT
);
4232 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4233 dstType
== GL_UNSIGNED_SHORT
||
4234 dstType
== GL_UNSIGNED_INT
);
4237 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4240 * Try simple cases first
4242 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4243 && dstType
== GL_UNSIGNED_BYTE
) {
4244 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4246 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4247 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4248 memcpy(dest
, source
, n
* sizeof(GLuint
));
4254 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4257 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4261 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4265 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4267 /* convert to dest type */
4269 case GL_UNSIGNED_BYTE
:
4271 GLubyte
*dst
= (GLubyte
*) dest
;
4273 for (i
= 0; i
< n
; i
++) {
4274 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4278 case GL_UNSIGNED_SHORT
:
4280 GLuint
*dst
= (GLuint
*) dest
;
4282 for (i
= 0; i
< n
; i
++) {
4283 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4287 case GL_UNSIGNED_INT
:
4288 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4291 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4300 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4301 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4302 const struct gl_pixelstore_attrib
*dstPacking
,
4303 GLbitfield transferOps
)
4305 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4308 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4312 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4314 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4315 /* make a copy of input */
4316 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4317 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4322 case GL_UNSIGNED_BYTE
:
4324 GLubyte
*dst
= (GLubyte
*) dest
;
4326 for (i
= 0; i
< n
; i
++) {
4327 *dst
++ = (GLubyte
) source
[i
];
4333 GLbyte
*dst
= (GLbyte
*) dest
;
4335 for (i
= 0; i
< n
; i
++) {
4336 dst
[i
] = (GLbyte
) source
[i
];
4340 case GL_UNSIGNED_SHORT
:
4342 GLushort
*dst
= (GLushort
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLushort
) source
[i
];
4347 if (dstPacking
->SwapBytes
) {
4348 _mesa_swap2( (GLushort
*) dst
, n
);
4354 GLshort
*dst
= (GLshort
*) dest
;
4356 for (i
= 0; i
< n
; i
++) {
4357 dst
[i
] = (GLshort
) source
[i
];
4359 if (dstPacking
->SwapBytes
) {
4360 _mesa_swap2( (GLushort
*) dst
, n
);
4364 case GL_UNSIGNED_INT
:
4366 GLuint
*dst
= (GLuint
*) dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 dst
[i
] = (GLuint
) source
[i
];
4371 if (dstPacking
->SwapBytes
) {
4372 _mesa_swap4( (GLuint
*) dst
, n
);
4378 GLint
*dst
= (GLint
*) dest
;
4380 for (i
= 0; i
< n
; i
++) {
4381 dst
[i
] = (GLint
) source
[i
];
4383 if (dstPacking
->SwapBytes
) {
4384 _mesa_swap4( (GLuint
*) dst
, n
);
4390 GLfloat
*dst
= (GLfloat
*) dest
;
4392 for (i
= 0; i
< n
; i
++) {
4393 dst
[i
] = (GLfloat
) source
[i
];
4395 if (dstPacking
->SwapBytes
) {
4396 _mesa_swap4( (GLuint
*) dst
, n
);
4400 case GL_HALF_FLOAT_ARB
:
4402 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4404 for (i
= 0; i
< n
; i
++) {
4405 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4407 if (dstPacking
->SwapBytes
) {
4408 _mesa_swap2( (GLushort
*) dst
, n
);
4413 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4421 * Unpack a row of stencil data from a client buffer according to
4422 * the pixel unpacking parameters.
4423 * This is (or will be) used by glDrawPixels
4425 * Args: ctx - the context
4426 * n - number of pixels
4427 * dstType - destination data type
4428 * dest - destination array
4429 * srcType - source pixel type
4430 * source - source data pointer
4431 * srcPacking - pixel unpacking parameters
4432 * transferOps - apply offset/bias/lookup ops?
4435 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4436 GLenum dstType
, GLvoid
*dest
,
4437 GLenum srcType
, const GLvoid
*source
,
4438 const struct gl_pixelstore_attrib
*srcPacking
,
4439 GLbitfield transferOps
)
4441 ASSERT(srcType
== GL_BITMAP
||
4442 srcType
== GL_UNSIGNED_BYTE
||
4443 srcType
== GL_BYTE
||
4444 srcType
== GL_UNSIGNED_SHORT
||
4445 srcType
== GL_SHORT
||
4446 srcType
== GL_UNSIGNED_INT
||
4447 srcType
== GL_INT
||
4448 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4449 srcType
== GL_HALF_FLOAT_ARB
||
4450 srcType
== GL_FLOAT
||
4451 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4453 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4454 dstType
== GL_UNSIGNED_SHORT
||
4455 dstType
== GL_UNSIGNED_INT
||
4456 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4458 /* only shift and offset apply to stencil */
4459 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4462 * Try simple cases first
4464 if (transferOps
== 0 &&
4465 !ctx
->Pixel
.MapStencilFlag
&&
4466 srcType
== GL_UNSIGNED_BYTE
&&
4467 dstType
== GL_UNSIGNED_BYTE
) {
4468 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4470 else if (transferOps
== 0 &&
4471 !ctx
->Pixel
.MapStencilFlag
&&
4472 srcType
== GL_UNSIGNED_INT
&&
4473 dstType
== GL_UNSIGNED_INT
&&
4474 !srcPacking
->SwapBytes
) {
4475 memcpy(dest
, source
, n
* sizeof(GLuint
));
4481 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4484 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4488 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4491 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4492 /* shift and offset indexes */
4493 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4496 if (ctx
->Pixel
.MapStencilFlag
) {
4497 /* Apply stencil lookup table */
4498 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4500 for (i
= 0; i
< n
; i
++) {
4501 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4505 /* convert to dest type */
4507 case GL_UNSIGNED_BYTE
:
4509 GLubyte
*dst
= (GLubyte
*) dest
;
4511 for (i
= 0; i
< n
; i
++) {
4512 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4516 case GL_UNSIGNED_SHORT
:
4518 GLuint
*dst
= (GLuint
*) dest
;
4520 for (i
= 0; i
< n
; i
++) {
4521 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4525 case GL_UNSIGNED_INT
:
4526 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4528 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4530 GLuint
*dst
= (GLuint
*) dest
;
4532 for (i
= 0; i
< n
; i
++) {
4533 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4538 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4547 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4548 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4549 const struct gl_pixelstore_attrib
*dstPacking
)
4551 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4554 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4558 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4559 ctx
->Pixel
.MapStencilFlag
) {
4560 /* make a copy of input */
4561 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4562 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4567 case GL_UNSIGNED_BYTE
:
4568 memcpy(dest
, source
, n
);
4572 GLbyte
*dst
= (GLbyte
*) dest
;
4575 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4579 case GL_UNSIGNED_SHORT
:
4581 GLushort
*dst
= (GLushort
*) dest
;
4584 dst
[i
] = (GLushort
) source
[i
];
4586 if (dstPacking
->SwapBytes
) {
4587 _mesa_swap2( (GLushort
*) dst
, n
);
4593 GLshort
*dst
= (GLshort
*) dest
;
4596 dst
[i
] = (GLshort
) source
[i
];
4598 if (dstPacking
->SwapBytes
) {
4599 _mesa_swap2( (GLushort
*) dst
, n
);
4603 case GL_UNSIGNED_INT
:
4605 GLuint
*dst
= (GLuint
*) dest
;
4608 dst
[i
] = (GLuint
) source
[i
];
4610 if (dstPacking
->SwapBytes
) {
4611 _mesa_swap4( (GLuint
*) dst
, n
);
4617 GLint
*dst
= (GLint
*) dest
;
4620 dst
[i
] = (GLint
) source
[i
];
4622 if (dstPacking
->SwapBytes
) {
4623 _mesa_swap4( (GLuint
*) dst
, n
);
4629 GLfloat
*dst
= (GLfloat
*) dest
;
4632 dst
[i
] = (GLfloat
) source
[i
];
4634 if (dstPacking
->SwapBytes
) {
4635 _mesa_swap4( (GLuint
*) dst
, n
);
4639 case GL_HALF_FLOAT_ARB
:
4641 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4644 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4646 if (dstPacking
->SwapBytes
) {
4647 _mesa_swap2( (GLushort
*) dst
, n
);
4652 if (dstPacking
->LsbFirst
) {
4653 GLubyte
*dst
= (GLubyte
*) dest
;
4656 for (i
= 0; i
< n
; i
++) {
4659 *dst
|= ((source
[i
] != 0) << shift
);
4668 GLubyte
*dst
= (GLubyte
*) dest
;
4671 for (i
= 0; i
< n
; i
++) {
4674 *dst
|= ((source
[i
] != 0) << shift
);
4684 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4690 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4693 const GLTYPE *src = (const GLTYPE *)source; \
4694 for (i = 0; i < n; i++) { \
4695 GLTYPE value = src[i]; \
4696 if (srcPacking->SwapBytes) { \
4697 if (sizeof(GLTYPE) == 2) { \
4699 } else if (sizeof(GLTYPE) == 4) { \
4703 depthValues[i] = GLTYPE2FLOAT(value); \
4709 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4710 * or GLfloat values.
4711 * The glPixelTransfer (scale/bias) params will be applied.
4713 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4714 * \param depthMax max value for returned GLushort or GLuint values
4715 * (ignored for GLfloat).
4718 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4719 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4720 GLenum srcType
, const GLvoid
*source
,
4721 const struct gl_pixelstore_attrib
*srcPacking
)
4723 GLfloat
*depthTemp
= NULL
, *depthValues
;
4724 GLboolean needClamp
= GL_FALSE
;
4726 /* Look for special cases first.
4727 * Not only are these faster, they're less prone to numeric conversion
4728 * problems. Otherwise, converting from an int type to a float then
4729 * back to an int type can introduce errors that will show up as
4730 * artifacts in things like depth peeling which uses glCopyTexImage.
4732 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4733 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4734 const GLuint
*src
= (const GLuint
*) source
;
4735 GLushort
*dst
= (GLushort
*) dest
;
4737 for (i
= 0; i
< n
; i
++) {
4738 dst
[i
] = src
[i
] >> 16;
4742 if (srcType
== GL_UNSIGNED_SHORT
4743 && dstType
== GL_UNSIGNED_INT
4744 && depthMax
== 0xffffffff) {
4745 const GLushort
*src
= (const GLushort
*) source
;
4746 GLuint
*dst
= (GLuint
*) dest
;
4748 for (i
= 0; i
< n
; i
++) {
4749 dst
[i
] = src
[i
] | (src
[i
] << 16);
4753 if (srcType
== GL_UNSIGNED_INT_24_8
4754 && dstType
== GL_UNSIGNED_INT
4755 && depthMax
== 0xffffff) {
4756 const GLuint
*src
= (const GLuint
*) source
;
4757 GLuint
*dst
= (GLuint
*) dest
;
4759 for (i
= 0; i
< n
; i
++) {
4760 dst
[i
] = src
[i
] >> 8;
4764 /* XXX may want to add additional cases here someday */
4767 /* general case path follows */
4769 if (dstType
== GL_FLOAT
) {
4770 depthValues
= (GLfloat
*) dest
;
4773 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4775 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4779 depthValues
= depthTemp
;
4782 /* Convert incoming values to GLfloat. Some conversions will require
4787 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4788 needClamp
= GL_TRUE
;
4790 case GL_UNSIGNED_BYTE
:
4791 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4794 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4795 needClamp
= GL_TRUE
;
4797 case GL_UNSIGNED_SHORT
:
4798 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4801 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4802 needClamp
= GL_TRUE
;
4804 case GL_UNSIGNED_INT
:
4805 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4807 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4808 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4809 depthMax
== 0xffffff &&
4810 ctx
->Pixel
.DepthScale
== 1.0 &&
4811 ctx
->Pixel
.DepthBias
== 0.0) {
4812 const GLuint
*src
= (const GLuint
*) source
;
4813 GLuint
*zValues
= (GLuint
*) dest
;
4815 for (i
= 0; i
< n
; i
++) {
4816 GLuint value
= src
[i
];
4817 if (srcPacking
->SwapBytes
) {
4820 zValues
[i
] = value
& 0xffffff00;
4826 const GLuint
*src
= (const GLuint
*) source
;
4827 const GLfloat scale
= 1.0f
/ 0xffffff;
4829 for (i
= 0; i
< n
; i
++) {
4830 GLuint value
= src
[i
];
4831 if (srcPacking
->SwapBytes
) {
4834 depthValues
[i
] = (value
>> 8) * scale
;
4838 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4841 const GLfloat
*src
= (const GLfloat
*)source
;
4842 for (i
= 0; i
< n
; i
++) {
4843 GLfloat value
= src
[i
* 2];
4844 if (srcPacking
->SwapBytes
) {
4847 depthValues
[i
] = value
;
4849 needClamp
= GL_TRUE
;
4853 DEPTH_VALUES(GLfloat
, 1*);
4854 needClamp
= GL_TRUE
;
4856 case GL_HALF_FLOAT_ARB
:
4859 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4860 for (i
= 0; i
< n
; i
++) {
4861 GLhalfARB value
= src
[i
];
4862 if (srcPacking
->SwapBytes
) {
4865 depthValues
[i
] = _mesa_half_to_float(value
);
4867 needClamp
= GL_TRUE
;
4871 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4876 /* apply depth scale and bias */
4878 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4879 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4880 if (scale
!= 1.0 || bias
!= 0.0) {
4882 for (i
= 0; i
< n
; i
++) {
4883 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4885 needClamp
= GL_TRUE
;
4889 /* clamp to [0, 1] */
4892 for (i
= 0; i
< n
; i
++) {
4893 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4898 * Convert values to dstType
4900 if (dstType
== GL_UNSIGNED_INT
) {
4901 GLuint
*zValues
= (GLuint
*) dest
;
4903 if (depthMax
<= 0xffffff) {
4904 /* no overflow worries */
4905 for (i
= 0; i
< n
; i
++) {
4906 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4910 /* need to use double precision to prevent overflow problems */
4911 for (i
= 0; i
< n
; i
++) {
4912 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4913 if (z
>= (GLdouble
) 0xffffffff)
4914 zValues
[i
] = 0xffffffff;
4916 zValues
[i
] = (GLuint
) z
;
4920 else if (dstType
== GL_UNSIGNED_SHORT
) {
4921 GLushort
*zValues
= (GLushort
*) dest
;
4923 ASSERT(depthMax
<= 0xffff);
4924 for (i
= 0; i
< n
; i
++) {
4925 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4928 else if (dstType
== GL_FLOAT
) {
4929 /* Nothing to do. depthValues is pointing to dest. */
4931 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4932 GLfloat
*zValues
= (GLfloat
*) dest
;
4934 for (i
= 0; i
< n
; i
++) {
4935 zValues
[i
*2] = depthValues
[i
];
4947 * Pack an array of depth values. The values are floats in [0,1].
4950 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4951 GLenum dstType
, const GLfloat
*depthSpan
,
4952 const struct gl_pixelstore_attrib
*dstPacking
)
4954 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4956 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4960 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4961 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4962 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4963 depthSpan
= depthCopy
;
4967 case GL_UNSIGNED_BYTE
:
4969 GLubyte
*dst
= (GLubyte
*) dest
;
4971 for (i
= 0; i
< n
; i
++) {
4972 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4978 GLbyte
*dst
= (GLbyte
*) dest
;
4980 for (i
= 0; i
< n
; i
++) {
4981 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4985 case GL_UNSIGNED_SHORT
:
4987 GLushort
*dst
= (GLushort
*) dest
;
4989 for (i
= 0; i
< n
; i
++) {
4990 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4992 if (dstPacking
->SwapBytes
) {
4993 _mesa_swap2( (GLushort
*) dst
, n
);
4999 GLshort
*dst
= (GLshort
*) dest
;
5001 for (i
= 0; i
< n
; i
++) {
5002 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5004 if (dstPacking
->SwapBytes
) {
5005 _mesa_swap2( (GLushort
*) dst
, n
);
5009 case GL_UNSIGNED_INT
:
5011 GLuint
*dst
= (GLuint
*) dest
;
5013 for (i
= 0; i
< n
; i
++) {
5014 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5016 if (dstPacking
->SwapBytes
) {
5017 _mesa_swap4( (GLuint
*) dst
, n
);
5023 GLint
*dst
= (GLint
*) dest
;
5025 for (i
= 0; i
< n
; i
++) {
5026 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5028 if (dstPacking
->SwapBytes
) {
5029 _mesa_swap4( (GLuint
*) dst
, n
);
5035 GLfloat
*dst
= (GLfloat
*) dest
;
5037 for (i
= 0; i
< n
; i
++) {
5038 dst
[i
] = depthSpan
[i
];
5040 if (dstPacking
->SwapBytes
) {
5041 _mesa_swap4( (GLuint
*) dst
, n
);
5045 case GL_HALF_FLOAT_ARB
:
5047 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5049 for (i
= 0; i
< n
; i
++) {
5050 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5052 if (dstPacking
->SwapBytes
) {
5053 _mesa_swap2( (GLushort
*) dst
, n
);
5058 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5067 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5070 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5071 GLenum dstType
, GLuint
*dest
,
5072 const GLfloat
*depthVals
,
5073 const GLubyte
*stencilVals
,
5074 const struct gl_pixelstore_attrib
*dstPacking
)
5076 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5077 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5080 if (!depthCopy
|| !stencilCopy
) {
5081 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5087 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5088 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5089 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5090 depthVals
= depthCopy
;
5093 if (ctx
->Pixel
.IndexShift
||
5094 ctx
->Pixel
.IndexOffset
||
5095 ctx
->Pixel
.MapStencilFlag
) {
5096 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5097 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5098 stencilVals
= stencilCopy
;
5102 case GL_UNSIGNED_INT_24_8
:
5103 for (i
= 0; i
< n
; i
++) {
5104 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5105 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5108 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5109 for (i
= 0; i
< n
; i
++) {
5110 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5111 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5116 if (dstPacking
->SwapBytes
) {
5117 _mesa_swap4(dest
, n
);
5128 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5129 * Return all image data in a contiguous block. This is used when we
5130 * compile glDrawPixels, glTexImage, etc into a display list. We
5131 * need a copy of the data in a standard format.
5134 _mesa_unpack_image( GLuint dimensions
,
5135 GLsizei width
, GLsizei height
, GLsizei depth
,
5136 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5137 const struct gl_pixelstore_attrib
*unpack
)
5139 GLint bytesPerRow
, compsPerRow
;
5140 GLboolean flipBytes
, swap2
, swap4
;
5143 return NULL
; /* not necessarily an error */
5145 if (width
<= 0 || height
<= 0 || depth
<= 0)
5146 return NULL
; /* generate error later */
5148 if (type
== GL_BITMAP
) {
5149 bytesPerRow
= (width
+ 7) >> 3;
5150 flipBytes
= unpack
->LsbFirst
;
5151 swap2
= swap4
= GL_FALSE
;
5155 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5156 GLint components
= _mesa_components_in_format(format
);
5159 if (_mesa_type_is_packed(type
))
5162 if (bytesPerPixel
<= 0 || components
<= 0)
5163 return NULL
; /* bad format or type. generate error later */
5164 bytesPerRow
= bytesPerPixel
* width
;
5165 bytesPerComp
= bytesPerPixel
/ components
;
5166 flipBytes
= GL_FALSE
;
5167 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5168 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5169 compsPerRow
= components
* width
;
5170 assert(compsPerRow
>= width
);
5175 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5179 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5182 for (img
= 0; img
< depth
; img
++) {
5183 for (row
= 0; row
< height
; row
++) {
5184 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5185 width
, height
, format
, type
, img
, row
, 0);
5187 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5189 flipBytes
= GL_FALSE
;
5190 if (unpack
->LsbFirst
) {
5191 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5192 GLubyte dstMask
= 128;
5193 const GLubyte
*s
= src
;
5196 for (i
= 0; i
< width
; i
++) {
5200 if (srcMask
== 128) {
5205 srcMask
= srcMask
<< 1;
5213 dstMask
= dstMask
>> 1;
5218 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5219 GLubyte dstMask
= 128;
5220 const GLubyte
*s
= src
;
5223 for (i
= 0; i
< width
; i
++) {
5232 srcMask
= srcMask
>> 1;
5240 dstMask
= dstMask
>> 1;
5246 memcpy(dst
, src
, bytesPerRow
);
5249 /* byte flipping/swapping */
5251 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5254 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5257 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5269 * If we unpack colors from a luminance surface, we'll get pixel colors
5270 * such as (l, l, l, a).
5271 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5272 * function will compute L=R+G+B before packing. The net effect is we'll
5273 * accidentally store luminance values = 3*l.
5274 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5276 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5279 * Finally, we also need to do this when the actual surface format does
5280 * not match the logical surface format. For example, suppose the user
5281 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5282 * Again, we'll get pixel values like (l,l,l,a).
5285 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5289 switch (baseFormat
) {
5291 for (i
= 0; i
< n
; i
++) {
5292 rgba
[i
][RCOMP
] = 0.0F
;
5293 rgba
[i
][GCOMP
] = 0.0F
;
5294 rgba
[i
][BCOMP
] = 0.0F
;
5300 for (i
= 0; i
< n
; i
++) {
5301 rgba
[i
][GCOMP
] = 0.0F
;
5302 rgba
[i
][BCOMP
] = 0.0F
;
5303 rgba
[i
][ACOMP
] = 1.0F
;
5306 case GL_LUMINANCE_ALPHA
:
5307 for (i
= 0; i
< n
; i
++) {
5308 rgba
[i
][GCOMP
] = 0.0F
;
5309 rgba
[i
][BCOMP
] = 0.0F
;
5320 * As above, but GLuint components.
5323 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5327 switch (baseFormat
) {
5329 for (i
= 0; i
< n
; i
++) {
5338 for (i
= 0; i
< n
; i
++) {
5344 case GL_LUMINANCE_ALPHA
:
5345 for (i
= 0; i
< n
; i
++) {