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 "glformats.h"
56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
61 * Flip the 8 bits in each byte of the given array.
64 * \param n number of bytes.
66 * \todo try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
74 flip_bytes( GLubyte
*p
, GLuint n
)
77 for (i
= 0; i
< n
; i
++) {
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
94 * Unpack a 32x32 pixel polygon stipple from user memory using the
95 * current pixel unpack settings.
98 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
99 const struct gl_pixelstore_attrib
*unpacking
)
101 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
103 /* Convert pattern from GLubytes to GLuints and handle big/little
108 for (i
= 0; i
< 32; i
++) {
109 dest
[i
] = (p
[0] << 24)
121 * Pack polygon stipple into user memory given current pixel packing
125 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
126 const struct gl_pixelstore_attrib
*packing
)
128 /* Convert pattern from GLuints to GLubytes to handle big/little
129 * endian differences.
133 for (i
= 0; i
< 32; i
++) {
134 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
135 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
136 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
137 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
140 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
146 * order with row alignment = 1 byte.
149 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
150 const struct gl_pixelstore_attrib
*packing
)
152 GLint bytes
, row
, width_in_bytes
;
153 GLubyte
*buffer
, *dst
;
158 /* Alloc dest storage */
159 bytes
= ((width
+ 7) / 8 * height
);
160 buffer
= (GLubyte
*) malloc( bytes
);
164 width_in_bytes
= CEILING( width
, 8 );
166 for (row
= 0; row
< height
; row
++) {
167 const GLubyte
*src
= (const GLubyte
*)
168 _mesa_image_address2d(packing
, pixels
, width
, height
,
169 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
175 if ((packing
->SkipPixels
& 7) == 0) {
176 memcpy( dst
, src
, width_in_bytes
);
177 if (packing
->LsbFirst
) {
178 flip_bytes( dst
, width_in_bytes
);
182 /* handling SkipPixels is a bit tricky (no pun intended!) */
184 if (packing
->LsbFirst
) {
185 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
186 GLubyte dstMask
= 128;
187 const GLubyte
*s
= src
;
190 for (i
= 0; i
< width
; i
++) {
194 if (srcMask
== 128) {
199 srcMask
= srcMask
<< 1;
207 dstMask
= dstMask
>> 1;
212 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
213 GLubyte dstMask
= 128;
214 const GLubyte
*s
= src
;
217 for (i
= 0; i
< width
; i
++) {
226 srcMask
= srcMask
>> 1;
234 dstMask
= dstMask
>> 1;
239 dst
+= width_in_bytes
;
250 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
251 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
253 GLint row
, width_in_bytes
;
259 width_in_bytes
= CEILING( width
, 8 );
261 for (row
= 0; row
< height
; row
++) {
262 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
263 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
267 if ((packing
->SkipPixels
& 7) == 0) {
268 memcpy( dst
, src
, width_in_bytes
);
269 if (packing
->LsbFirst
) {
270 flip_bytes( dst
, width_in_bytes
);
274 /* handling SkipPixels is a bit tricky (no pun intended!) */
276 if (packing
->LsbFirst
) {
277 GLubyte srcMask
= 128;
278 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
279 const GLubyte
*s
= src
;
282 for (i
= 0; i
< width
; i
++) {
291 srcMask
= srcMask
>> 1;
293 if (dstMask
== 128) {
299 dstMask
= dstMask
<< 1;
304 GLubyte srcMask
= 128;
305 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
306 const GLubyte
*s
= src
;
309 for (i
= 0; i
< width
; i
++) {
318 srcMask
= srcMask
>> 1;
326 dstMask
= dstMask
>> 1;
331 src
+= width_in_bytes
;
337 * Get indexes of color components for a basic color format, such as
338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
342 get_component_indexes(GLenum format
,
347 GLint
*luminanceIndex
,
348 GLint
*intensityIndex
)
354 *luminanceIndex
= -1;
355 *intensityIndex
= -1;
359 case GL_LUMINANCE_INTEGER_EXT
:
362 case GL_LUMINANCE_ALPHA
:
363 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
371 case GL_RED_INTEGER_EXT
:
375 case GL_GREEN_INTEGER_EXT
:
379 case GL_BLUE_INTEGER_EXT
:
383 case GL_ALPHA_INTEGER_EXT
:
392 case GL_RGB_INTEGER_EXT
:
398 case GL_BGR_INTEGER_EXT
:
404 case GL_RGBA_INTEGER_EXT
:
411 case GL_BGRA_INTEGER
:
429 assert(0 && "bad format in get_component_indexes()");
436 * For small integer types, return the min and max possible values.
437 * Used for clamping floats to unscaled integer types.
438 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
441 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
448 case GL_UNSIGNED_BYTE
:
456 case GL_UNSIGNED_SHORT
:
465 /* Customization of integer packing. We always treat src as uint, and can pack dst
466 * as any integer type/format combo.
468 #define SRC_TYPE GLuint
470 #define DST_TYPE GLuint
471 #define SRC_CONVERT(x) (x)
472 #define FN_NAME pack_uint_from_uint_rgba
473 #include "pack_tmp.h"
478 #define DST_TYPE GLushort
479 #define SRC_CONVERT(x) MIN2(x, 0xffff)
480 #define FN_NAME pack_ushort_from_uint_rgba
481 #include "pack_tmp.h"
486 #define DST_TYPE GLshort
487 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
488 #define FN_NAME pack_short_from_uint_rgba
489 #include "pack_tmp.h"
494 #define DST_TYPE GLubyte
495 #define SRC_CONVERT(x) MIN2(x, 0xff)
496 #define FN_NAME pack_ubyte_from_uint_rgba
497 #include "pack_tmp.h"
502 #define DST_TYPE GLbyte
503 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
504 #define FN_NAME pack_byte_from_uint_rgba
505 #include "pack_tmp.h"
511 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
512 GLenum dstFormat
, GLenum dstType
,
516 case GL_UNSIGNED_INT
:
517 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
520 /* No conversion necessary. */
521 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
523 case GL_UNSIGNED_SHORT
:
524 pack_ushort_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
527 pack_short_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
529 case GL_UNSIGNED_BYTE
:
530 pack_ubyte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
533 pack_byte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
537 "Unsupported type (%s) for format (%s)",
538 _mesa_lookup_enum_by_nr(dstType
),
539 _mesa_lookup_enum_by_nr(dstFormat
));
546 * Used to pack an array [][4] of RGBA float colors as specified
547 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
548 * Historically, the RGBA values were in [0,1] and rescaled to fit
549 * into GLubytes, etc. But with new integer formats, the RGBA values
550 * may have any value and we don't always rescale when converting to
553 * Note: the rgba values will be modified by this function when any pixel
554 * transfer ops are enabled.
557 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
558 GLenum dstFormat
, GLenum dstType
,
560 const struct gl_pixelstore_attrib
*dstPacking
,
561 GLbitfield transferOps
)
564 const GLint comps
= _mesa_components_in_format(dstFormat
);
565 const GLboolean intDstFormat
= _mesa_is_enum_format_integer(dstFormat
);
568 if (dstFormat
== GL_LUMINANCE
||
569 dstFormat
== GL_LUMINANCE_ALPHA
||
570 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
571 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
572 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
574 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
582 /* EXT_texture_integer specifies no transfer ops on integer
583 * types in the resolved issues section. Just set them to 0
584 * for integer surfaces.
590 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
594 * Component clamping (besides clamping to [0,1] in
595 * _mesa_apply_rgba_transfer_ops()).
598 /* clamping to dest type's min/max values */
600 if (get_type_min_max(dstType
, &min
, &max
)) {
601 for (i
= 0; i
< n
; i
++) {
602 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
603 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
604 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
605 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
609 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
610 /* compute luminance values */
611 if (transferOps
& IMAGE_CLAMP_BIT
) {
612 for (i
= 0; i
< n
; i
++) {
613 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
614 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
618 for (i
= 0; i
< n
; i
++) {
619 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
625 * Pack/store the pixels. Ugh! Lots of cases!!!
628 case GL_UNSIGNED_BYTE
:
630 GLubyte
*dst
= (GLubyte
*) dstAddr
;
634 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
638 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
642 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
646 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
650 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
652 case GL_LUMINANCE_ALPHA
:
654 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
655 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
660 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
661 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
666 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
667 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
668 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
673 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
674 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
675 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
676 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
681 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
682 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
683 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
688 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
689 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
690 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
691 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
696 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
697 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
698 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
699 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
702 case GL_RED_INTEGER_EXT
:
704 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
707 case GL_GREEN_INTEGER_EXT
:
709 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
712 case GL_BLUE_INTEGER_EXT
:
714 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
717 case GL_ALPHA_INTEGER_EXT
:
719 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
724 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
725 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
728 case GL_RGB_INTEGER_EXT
:
730 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
731 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
732 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
735 case GL_RGBA_INTEGER_EXT
:
737 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
738 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
739 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
740 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
743 case GL_BGR_INTEGER_EXT
:
745 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
746 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
747 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
750 case GL_BGRA_INTEGER_EXT
:
752 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
753 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
754 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
755 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
758 case GL_LUMINANCE_INTEGER_EXT
:
760 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
763 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
766 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
768 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
776 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
777 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
781 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
787 GLbyte
*dst
= (GLbyte
*) dstAddr
;
791 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
795 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
799 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
803 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
807 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
809 case GL_LUMINANCE_ALPHA
:
811 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
812 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
817 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
818 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
823 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
824 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
825 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
830 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
831 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
832 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
833 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
838 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
839 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
840 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
845 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
846 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
847 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
848 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
853 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
854 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
855 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
856 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
859 case GL_RED_INTEGER_EXT
:
861 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
864 case GL_GREEN_INTEGER_EXT
:
866 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
869 case GL_BLUE_INTEGER_EXT
:
871 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
874 case GL_ALPHA_INTEGER_EXT
:
876 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
881 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
882 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
885 case GL_RGB_INTEGER_EXT
:
887 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
888 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
889 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
892 case GL_RGBA_INTEGER_EXT
:
894 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
895 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
896 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
897 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
900 case GL_BGR_INTEGER_EXT
:
902 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
903 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
904 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
907 case GL_BGRA_INTEGER_EXT
:
909 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
910 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
911 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
912 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
915 case GL_LUMINANCE_INTEGER_EXT
:
917 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
920 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
923 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
925 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
933 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
934 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
938 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
942 case GL_UNSIGNED_SHORT
:
944 GLushort
*dst
= (GLushort
*) dstAddr
;
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
952 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
956 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
960 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
964 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
966 case GL_LUMINANCE_ALPHA
:
968 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
969 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
974 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
975 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
980 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
981 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
982 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
987 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
988 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
989 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
990 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
995 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
996 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
997 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
1002 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1003 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1004 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1005 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1010 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1011 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1012 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1013 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1016 case GL_RED_INTEGER_EXT
:
1018 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1021 case GL_GREEN_INTEGER_EXT
:
1023 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1026 case GL_BLUE_INTEGER_EXT
:
1028 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1031 case GL_ALPHA_INTEGER_EXT
:
1033 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1038 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1039 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1042 case GL_RGB_INTEGER_EXT
:
1044 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1045 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1046 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1049 case GL_RGBA_INTEGER_EXT
:
1051 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1052 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1053 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1054 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1057 case GL_BGR_INTEGER_EXT
:
1059 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1060 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1061 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1064 case GL_BGRA_INTEGER_EXT
:
1066 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1067 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1068 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1069 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1072 case GL_LUMINANCE_INTEGER_EXT
:
1074 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1077 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1080 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1082 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1090 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1091 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1095 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1101 GLshort
*dst
= (GLshort
*) dstAddr
;
1102 switch (dstFormat
) {
1105 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1109 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1113 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1117 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1121 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1123 case GL_LUMINANCE_ALPHA
:
1125 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1126 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1131 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1132 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1137 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1138 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1139 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1144 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1145 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1146 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1147 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1152 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1153 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1154 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1159 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1160 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1161 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1162 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1167 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1168 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1169 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1170 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1173 case GL_RED_INTEGER_EXT
:
1175 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1178 case GL_GREEN_INTEGER_EXT
:
1180 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1183 case GL_BLUE_INTEGER_EXT
:
1185 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1188 case GL_ALPHA_INTEGER_EXT
:
1190 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1195 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1196 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1199 case GL_RGB_INTEGER_EXT
:
1201 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1202 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1203 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1206 case GL_RGBA_INTEGER_EXT
:
1208 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1209 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1210 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1211 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1214 case GL_BGR_INTEGER_EXT
:
1216 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1217 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1218 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1221 case GL_BGRA_INTEGER_EXT
:
1223 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1224 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1225 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1226 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1229 case GL_LUMINANCE_INTEGER_EXT
:
1231 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1234 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1237 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1239 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1247 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1248 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1252 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1256 case GL_UNSIGNED_INT
:
1258 GLuint
*dst
= (GLuint
*) dstAddr
;
1259 switch (dstFormat
) {
1262 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1266 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1270 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1274 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1278 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1280 case GL_LUMINANCE_ALPHA
:
1282 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1283 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1288 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1289 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1294 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1295 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1296 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1301 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1302 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1303 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1304 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1309 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1310 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1311 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1316 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1317 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1318 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1319 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1324 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1325 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1326 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1327 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1330 case GL_RED_INTEGER_EXT
:
1332 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1335 case GL_GREEN_INTEGER_EXT
:
1337 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1340 case GL_BLUE_INTEGER_EXT
:
1342 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1345 case GL_ALPHA_INTEGER_EXT
:
1347 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1352 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1353 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1356 case GL_RGB_INTEGER_EXT
:
1358 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1359 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1360 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1363 case GL_RGBA_INTEGER_EXT
:
1365 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1366 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1367 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1368 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1371 case GL_BGR_INTEGER_EXT
:
1373 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1374 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1375 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1378 case GL_BGRA_INTEGER_EXT
:
1380 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1381 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1382 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1383 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1386 case GL_LUMINANCE_INTEGER_EXT
:
1388 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1391 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1394 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1396 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1404 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1405 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1409 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1415 GLint
*dst
= (GLint
*) dstAddr
;
1416 switch (dstFormat
) {
1419 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1423 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1427 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1431 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1435 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1437 case GL_LUMINANCE_ALPHA
:
1439 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1440 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1445 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1446 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1451 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1452 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1453 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1458 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1459 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1460 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1461 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1466 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1467 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1468 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1473 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1474 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1475 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1476 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1481 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1482 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1483 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1484 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1490 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1491 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1494 case GL_RED_INTEGER_EXT
:
1496 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1499 case GL_GREEN_INTEGER_EXT
:
1501 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1504 case GL_BLUE_INTEGER_EXT
:
1506 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1509 case GL_ALPHA_INTEGER_EXT
:
1511 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1516 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1517 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1520 case GL_RGB_INTEGER_EXT
:
1522 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1523 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1524 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1527 case GL_RGBA_INTEGER_EXT
:
1529 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1530 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1531 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1532 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1535 case GL_BGR_INTEGER_EXT
:
1537 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1538 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1539 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1542 case GL_BGRA_INTEGER_EXT
:
1544 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1545 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1546 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1547 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1550 case GL_LUMINANCE_INTEGER_EXT
:
1552 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1555 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1558 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1560 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1566 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1572 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1573 switch (dstFormat
) {
1576 dst
[i
] = rgba
[i
][RCOMP
];
1580 dst
[i
] = rgba
[i
][GCOMP
];
1584 dst
[i
] = rgba
[i
][BCOMP
];
1588 dst
[i
] = rgba
[i
][ACOMP
];
1592 dst
[i
] = luminance
[i
];
1594 case GL_LUMINANCE_ALPHA
:
1596 dst
[i
*2+0] = luminance
[i
];
1597 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1602 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1603 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1608 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1609 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1610 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1615 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1616 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1617 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1618 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1623 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1624 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1625 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1630 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1631 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1632 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1633 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1638 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1639 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1640 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1641 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1647 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1648 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1652 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1656 case GL_HALF_FLOAT_ARB
:
1658 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1659 switch (dstFormat
) {
1662 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1666 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1670 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1674 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1678 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1680 case GL_LUMINANCE_ALPHA
:
1682 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1683 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1688 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1689 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1694 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1695 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1696 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1701 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1702 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1703 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1704 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1709 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1710 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1711 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1716 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1717 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1718 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1719 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1724 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1725 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1726 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1727 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1733 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1734 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1738 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1742 case GL_UNSIGNED_BYTE_3_3_2
:
1743 if (dstFormat
== GL_RGB
) {
1744 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1746 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1747 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1748 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
1752 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1753 if (dstFormat
== GL_RGB
) {
1754 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1756 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
1757 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1758 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1762 case GL_UNSIGNED_SHORT_5_6_5
:
1763 if (dstFormat
== GL_RGB
) {
1764 GLushort
*dst
= (GLushort
*) dstAddr
;
1766 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1767 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1768 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
1772 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1773 if (dstFormat
== GL_RGB
) {
1774 GLushort
*dst
= (GLushort
*) dstAddr
;
1776 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1777 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1778 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1782 case GL_UNSIGNED_SHORT_4_4_4_4
:
1783 if (dstFormat
== GL_RGBA
) {
1784 GLushort
*dst
= (GLushort
*) dstAddr
;
1786 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1787 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1788 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1789 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1792 else if (dstFormat
== GL_BGRA
) {
1793 GLushort
*dst
= (GLushort
*) dstAddr
;
1795 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1796 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1797 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1798 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1801 else if (dstFormat
== GL_ABGR_EXT
) {
1802 GLushort
*dst
= (GLushort
*) dstAddr
;
1804 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1805 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1806 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1807 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
1811 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1812 if (dstFormat
== GL_RGBA
) {
1813 GLushort
*dst
= (GLushort
*) dstAddr
;
1815 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
1816 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1817 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1818 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1821 else if (dstFormat
== GL_BGRA
) {
1822 GLushort
*dst
= (GLushort
*) dstAddr
;
1824 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
1825 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1826 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1827 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1830 else if (dstFormat
== GL_ABGR_EXT
) {
1831 GLushort
*dst
= (GLushort
*) dstAddr
;
1833 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
1834 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1835 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1836 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1840 case GL_UNSIGNED_SHORT_5_5_5_1
:
1841 if (dstFormat
== GL_RGBA
) {
1842 GLushort
*dst
= (GLushort
*) dstAddr
;
1844 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1845 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1846 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1847 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1850 else if (dstFormat
== GL_BGRA
) {
1851 GLushort
*dst
= (GLushort
*) dstAddr
;
1853 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1854 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1855 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1856 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1859 else if (dstFormat
== GL_ABGR_EXT
) {
1860 GLushort
*dst
= (GLushort
*) dstAddr
;
1862 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1863 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1864 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1865 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
1869 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1870 if (dstFormat
== GL_RGBA
) {
1871 GLushort
*dst
= (GLushort
*) dstAddr
;
1873 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1874 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1875 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1876 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1879 else if (dstFormat
== GL_BGRA
) {
1880 GLushort
*dst
= (GLushort
*) dstAddr
;
1882 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
1883 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1884 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1885 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1888 else if (dstFormat
== GL_ABGR_EXT
) {
1889 GLushort
*dst
= (GLushort
*) dstAddr
;
1891 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
1892 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1893 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1894 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1898 case GL_UNSIGNED_INT_8_8_8_8
:
1899 if (dstFormat
== GL_RGBA
) {
1900 GLuint
*dst
= (GLuint
*) dstAddr
;
1902 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
1903 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1904 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
1905 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1908 else if (dstFormat
== GL_BGRA
) {
1909 GLuint
*dst
= (GLuint
*) dstAddr
;
1911 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
1912 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1913 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
1914 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1917 else if (dstFormat
== GL_ABGR_EXT
) {
1918 GLuint
*dst
= (GLuint
*) dstAddr
;
1920 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
1921 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
1922 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
1923 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
1927 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1928 if (dstFormat
== GL_RGBA
) {
1929 GLuint
*dst
= (GLuint
*) dstAddr
;
1931 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
1932 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1933 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1934 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1937 else if (dstFormat
== GL_BGRA
) {
1938 GLuint
*dst
= (GLuint
*) dstAddr
;
1940 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
1941 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1942 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1943 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1946 else if (dstFormat
== GL_ABGR_EXT
) {
1947 GLuint
*dst
= (GLuint
*) dstAddr
;
1949 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
1950 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1951 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1952 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1956 case GL_UNSIGNED_INT_10_10_10_2
:
1957 if (dstFormat
== GL_RGBA
) {
1958 GLuint
*dst
= (GLuint
*) dstAddr
;
1960 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1961 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1962 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1963 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1966 else if (dstFormat
== GL_BGRA
) {
1967 GLuint
*dst
= (GLuint
*) dstAddr
;
1969 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1970 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1971 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1972 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1975 else if (dstFormat
== GL_ABGR_EXT
) {
1976 GLuint
*dst
= (GLuint
*) dstAddr
;
1978 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1979 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1980 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1981 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
1985 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1986 if (dstFormat
== GL_RGBA
) {
1987 GLuint
*dst
= (GLuint
*) dstAddr
;
1989 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
1990 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1991 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1992 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1995 else if (dstFormat
== GL_BGRA
) {
1996 GLuint
*dst
= (GLuint
*) dstAddr
;
1998 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
1999 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2000 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2001 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2004 else if (dstFormat
== GL_ABGR_EXT
) {
2005 GLuint
*dst
= (GLuint
*) dstAddr
;
2007 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2008 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2009 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2010 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2014 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2016 GLuint
*dst
= (GLuint
*) dstAddr
;
2017 for (i
= 0; i
< n
; i
++) {
2018 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2022 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2024 GLuint
*dst
= (GLuint
*) dstAddr
;
2025 for (i
= 0; i
< n
; i
++) {
2026 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2031 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2036 if (dstPacking
->SwapBytes
) {
2037 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2038 if (swapSize
== 2) {
2039 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2041 else if (swapSize
== 4) {
2042 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2051 #define SWAP2BYTE(VALUE) \
2053 GLubyte *bytes = (GLubyte *) &(VALUE); \
2054 GLubyte tmp = bytes[0]; \
2055 bytes[0] = bytes[1]; \
2059 #define SWAP4BYTE(VALUE) \
2061 GLubyte *bytes = (GLubyte *) &(VALUE); \
2062 GLubyte tmp = bytes[0]; \
2063 bytes[0] = bytes[3]; \
2066 bytes[1] = bytes[2]; \
2072 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2073 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2074 const struct gl_pixelstore_attrib
*unpack
)
2076 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2078 ASSERT(srcType
== GL_BITMAP
||
2079 srcType
== GL_UNSIGNED_BYTE
||
2080 srcType
== GL_BYTE
||
2081 srcType
== GL_UNSIGNED_SHORT
||
2082 srcType
== GL_SHORT
||
2083 srcType
== GL_UNSIGNED_INT
||
2084 srcType
== GL_INT
||
2085 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2086 srcType
== GL_HALF_FLOAT_ARB
||
2087 srcType
== GL_FLOAT
||
2088 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2093 GLubyte
*ubsrc
= (GLubyte
*) src
;
2094 if (unpack
->LsbFirst
) {
2095 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2097 for (i
= 0; i
< n
; i
++) {
2098 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2109 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2111 for (i
= 0; i
< n
; i
++) {
2112 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2124 case GL_UNSIGNED_BYTE
:
2127 const GLubyte
*s
= (const GLubyte
*) src
;
2128 for (i
= 0; i
< n
; i
++)
2135 const GLbyte
*s
= (const GLbyte
*) src
;
2136 for (i
= 0; i
< n
; i
++)
2140 case GL_UNSIGNED_SHORT
:
2143 const GLushort
*s
= (const GLushort
*) src
;
2144 if (unpack
->SwapBytes
) {
2145 for (i
= 0; i
< n
; i
++) {
2146 GLushort value
= s
[i
];
2152 for (i
= 0; i
< n
; i
++)
2160 const GLshort
*s
= (const GLshort
*) src
;
2161 if (unpack
->SwapBytes
) {
2162 for (i
= 0; i
< n
; i
++) {
2163 GLshort value
= s
[i
];
2169 for (i
= 0; i
< n
; i
++)
2174 case GL_UNSIGNED_INT
:
2177 const GLuint
*s
= (const GLuint
*) src
;
2178 if (unpack
->SwapBytes
) {
2179 for (i
= 0; i
< n
; i
++) {
2180 GLuint value
= s
[i
];
2186 for (i
= 0; i
< n
; i
++)
2194 const GLint
*s
= (const GLint
*) src
;
2195 if (unpack
->SwapBytes
) {
2196 for (i
= 0; i
< n
; i
++) {
2203 for (i
= 0; i
< n
; i
++)
2211 const GLfloat
*s
= (const GLfloat
*) src
;
2212 if (unpack
->SwapBytes
) {
2213 for (i
= 0; i
< n
; i
++) {
2214 GLfloat value
= s
[i
];
2216 indexes
[i
] = (GLuint
) value
;
2220 for (i
= 0; i
< n
; i
++)
2221 indexes
[i
] = (GLuint
) s
[i
];
2225 case GL_HALF_FLOAT_ARB
:
2228 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2229 if (unpack
->SwapBytes
) {
2230 for (i
= 0; i
< n
; i
++) {
2231 GLhalfARB value
= s
[i
];
2233 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2237 for (i
= 0; i
< n
; i
++)
2238 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2242 case GL_UNSIGNED_INT_24_8_EXT
:
2245 const GLuint
*s
= (const GLuint
*) src
;
2246 if (unpack
->SwapBytes
) {
2247 for (i
= 0; i
< n
; i
++) {
2248 GLuint value
= s
[i
];
2250 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2254 for (i
= 0; i
< n
; i
++)
2255 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2259 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2262 const GLuint
*s
= (const GLuint
*) src
;
2263 if (unpack
->SwapBytes
) {
2264 for (i
= 0; i
< n
; i
++) {
2265 GLuint value
= s
[i
*2+1];
2267 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2271 for (i
= 0; i
< n
; i
++)
2272 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2278 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2285 * Return source/dest RGBA indexes for unpacking pixels.
2288 get_component_mapping(GLenum format
,
2300 case GL_RED_INTEGER_EXT
:
2302 *gSrc
= *bSrc
= *aSrc
= -1;
2305 case GL_GREEN_INTEGER_EXT
:
2307 *rSrc
= *bSrc
= *aSrc
= -1;
2310 case GL_BLUE_INTEGER_EXT
:
2312 *rSrc
= *gSrc
= *aSrc
= -1;
2315 case GL_ALPHA_INTEGER_EXT
:
2316 *rSrc
= *gSrc
= *bSrc
= -1;
2320 case GL_LUMINANCE_INTEGER_EXT
:
2321 *rSrc
= *gSrc
= *bSrc
= 0;
2324 case GL_LUMINANCE_ALPHA
:
2325 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2326 *rSrc
= *gSrc
= *bSrc
= 0;
2330 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2344 case GL_RGB_INTEGER
:
2355 case GL_BGR_INTEGER
:
2366 case GL_RGBA_INTEGER
:
2377 case GL_BGRA_INTEGER
:
2405 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2406 _mesa_lookup_enum_by_nr(format
));
2414 * This function extracts floating point RGBA values from arbitrary
2415 * image data. srcFormat and srcType are the format and type parameters
2416 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2418 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2419 * implements the "Conversion to floating point", "Conversion to RGB",
2420 * and "Final Expansion to RGBA" operations.
2422 * Args: n - number of pixels
2423 * rgba - output colors
2424 * srcFormat - format of incoming data
2425 * srcType - data type of incoming data
2426 * src - source data pointer
2427 * swapBytes - perform byteswapping of incoming data?
2430 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2431 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2432 GLboolean swapBytes
)
2434 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2436 GLint rDst
, bDst
, gDst
, aDst
;
2437 GLboolean intFormat
;
2438 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2440 ASSERT(srcFormat
== GL_RED
||
2441 srcFormat
== GL_GREEN
||
2442 srcFormat
== GL_BLUE
||
2443 srcFormat
== GL_ALPHA
||
2444 srcFormat
== GL_LUMINANCE
||
2445 srcFormat
== GL_LUMINANCE_ALPHA
||
2446 srcFormat
== GL_INTENSITY
||
2447 srcFormat
== GL_RG
||
2448 srcFormat
== GL_RGB
||
2449 srcFormat
== GL_BGR
||
2450 srcFormat
== GL_RGBA
||
2451 srcFormat
== GL_BGRA
||
2452 srcFormat
== GL_ABGR_EXT
||
2453 srcFormat
== GL_DU8DV8_ATI
||
2454 srcFormat
== GL_DUDV_ATI
||
2455 srcFormat
== GL_RED_INTEGER_EXT
||
2456 srcFormat
== GL_GREEN_INTEGER_EXT
||
2457 srcFormat
== GL_BLUE_INTEGER_EXT
||
2458 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2459 srcFormat
== GL_RG_INTEGER
||
2460 srcFormat
== GL_RGB_INTEGER_EXT
||
2461 srcFormat
== GL_RGBA_INTEGER_EXT
||
2462 srcFormat
== GL_BGR_INTEGER_EXT
||
2463 srcFormat
== GL_BGRA_INTEGER_EXT
||
2464 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2465 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2467 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2468 srcType
== GL_BYTE
||
2469 srcType
== GL_UNSIGNED_SHORT
||
2470 srcType
== GL_SHORT
||
2471 srcType
== GL_UNSIGNED_INT
||
2472 srcType
== GL_INT
||
2473 srcType
== GL_HALF_FLOAT_ARB
||
2474 srcType
== GL_FLOAT
||
2475 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2476 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2477 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2478 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2479 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2480 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2481 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2482 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2483 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2484 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2485 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2486 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2487 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2488 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2490 get_component_mapping(srcFormat
,
2491 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2492 &rDst
, &gDst
, &bDst
, &aDst
);
2494 stride
= _mesa_components_in_format(srcFormat
);
2496 intFormat
= _mesa_is_enum_format_integer(srcFormat
);
2498 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2499 if ((SRC_INDEX) < 0) { \
2502 for (i = 0; i < n; i++) { \
2503 rgba[i][DST_INDEX] = DEFAULT_INT; \
2507 for (i = 0; i < n; i++) { \
2508 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2512 else if (swapBytes) { \
2513 const TYPE *s = (const TYPE *) src; \
2515 for (i = 0; i < n; i++) { \
2516 TYPE value = s[SRC_INDEX]; \
2517 if (sizeof(TYPE) == 2) { \
2520 else if (sizeof(TYPE) == 4) { \
2524 rgba[i][DST_INDEX] = (GLfloat) value; \
2526 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2531 const TYPE *s = (const TYPE *) src; \
2534 for (i = 0; i < n; i++) { \
2535 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2540 for (i = 0; i < n; i++) { \
2541 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2548 case GL_UNSIGNED_BYTE
:
2549 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2550 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2551 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2552 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2555 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2556 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2557 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2558 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2560 case GL_UNSIGNED_SHORT
:
2561 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2562 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2563 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2564 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2567 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2568 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2569 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2570 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2572 case GL_UNSIGNED_INT
:
2573 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2574 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2575 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2576 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2579 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2580 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2581 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2582 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2585 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2586 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2587 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2588 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2590 case GL_HALF_FLOAT_ARB
:
2591 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2592 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2593 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2594 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2596 case GL_UNSIGNED_BYTE_3_3_2
:
2598 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2605 for (i
= 0; i
< n
; i
++) {
2606 GLubyte p
= ubsrc
[i
];
2607 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2608 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2609 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2610 rgba
[i
][aDst
] = 1.0F
;
2614 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2616 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLubyte p
= ubsrc
[i
];
2625 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2626 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2627 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2628 rgba
[i
][aDst
] = 1.0F
;
2632 case GL_UNSIGNED_SHORT_5_6_5
:
2639 const GLushort
*ussrc
= (const GLushort
*) src
;
2641 for (i
= 0; i
< n
; i
++) {
2642 GLushort p
= ussrc
[i
];
2644 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2645 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2646 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2647 rgba
[i
][aDst
] = 1.0F
;
2651 const GLushort
*ussrc
= (const GLushort
*) src
;
2653 for (i
= 0; i
< n
; i
++) {
2654 GLushort p
= ussrc
[i
];
2655 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2656 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2657 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2658 rgba
[i
][aDst
] = 1.0F
;
2662 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2669 const GLushort
*ussrc
= (const GLushort
*) src
;
2671 for (i
= 0; i
< n
; i
++) {
2672 GLushort p
= ussrc
[i
];
2674 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2675 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2676 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2677 rgba
[i
][aDst
] = 1.0F
;
2681 const GLushort
*ussrc
= (const GLushort
*) src
;
2683 for (i
= 0; i
< n
; i
++) {
2684 GLushort p
= ussrc
[i
];
2685 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2686 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2687 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2688 rgba
[i
][aDst
] = 1.0F
;
2692 case GL_UNSIGNED_SHORT_4_4_4_4
:
2694 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2697 const GLushort
*ussrc
= (const GLushort
*) src
;
2699 for (i
= 0; i
< n
; i
++) {
2700 GLushort p
= ussrc
[i
];
2702 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2703 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2704 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2705 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2709 const GLushort
*ussrc
= (const GLushort
*) src
;
2711 for (i
= 0; i
< n
; i
++) {
2712 GLushort p
= ussrc
[i
];
2713 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2714 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2715 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2716 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2720 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2722 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2725 const GLushort
*ussrc
= (const GLushort
*) src
;
2727 for (i
= 0; i
< n
; i
++) {
2728 GLushort p
= ussrc
[i
];
2730 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2731 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2732 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2733 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2737 const GLushort
*ussrc
= (const GLushort
*) src
;
2739 for (i
= 0; i
< n
; i
++) {
2740 GLushort p
= ussrc
[i
];
2741 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2742 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2743 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2744 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2748 case GL_UNSIGNED_SHORT_5_5_5_1
:
2750 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2753 const GLushort
*ussrc
= (const GLushort
*) src
;
2755 for (i
= 0; i
< n
; i
++) {
2756 GLushort p
= ussrc
[i
];
2758 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2759 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2760 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2761 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2765 const GLushort
*ussrc
= (const GLushort
*) src
;
2767 for (i
= 0; i
< n
; i
++) {
2768 GLushort p
= ussrc
[i
];
2769 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2770 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2771 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2772 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2776 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2778 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2781 const GLushort
*ussrc
= (const GLushort
*) src
;
2783 for (i
= 0; i
< n
; i
++) {
2784 GLushort p
= ussrc
[i
];
2786 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2787 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2788 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2789 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2793 const GLushort
*ussrc
= (const GLushort
*) src
;
2795 for (i
= 0; i
< n
; i
++) {
2796 GLushort p
= ussrc
[i
];
2797 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2798 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2799 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2800 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2804 case GL_UNSIGNED_INT_8_8_8_8
:
2806 const GLuint
*uisrc
= (const GLuint
*) src
;
2809 for (i
= 0; i
< n
; i
++) {
2810 GLuint p
= uisrc
[i
];
2811 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2812 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2813 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2814 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2818 for (i
= 0; i
< n
; i
++) {
2819 GLuint p
= uisrc
[i
];
2820 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2821 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2822 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2823 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2828 const GLuint
*uisrc
= (const GLuint
*) src
;
2831 for (i
= 0; i
< n
; i
++) {
2832 GLuint p
= uisrc
[i
];
2833 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2834 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2835 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2836 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2840 for (i
= 0; i
< n
; i
++) {
2841 GLuint p
= uisrc
[i
];
2842 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2843 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2844 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2845 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2850 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2852 const GLuint
*uisrc
= (const GLuint
*) src
;
2855 for (i
= 0; i
< n
; i
++) {
2856 GLuint p
= uisrc
[i
];
2857 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2858 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2859 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2860 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2864 for (i
= 0; i
< n
; i
++) {
2865 GLuint p
= uisrc
[i
];
2866 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2867 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2868 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2869 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2874 const GLuint
*uisrc
= (const GLuint
*) src
;
2877 for (i
= 0; i
< n
; i
++) {
2878 GLuint p
= uisrc
[i
];
2879 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2880 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2881 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2882 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2886 for (i
= 0; i
< n
; i
++) {
2887 GLuint p
= uisrc
[i
];
2888 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2889 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2890 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2891 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2896 case GL_UNSIGNED_INT_10_10_10_2
:
2898 rs
= 1.0F
/ 1023.0F
;
2899 gs
= 1.0F
/ 1023.0F
;
2900 bs
= 1.0F
/ 1023.0F
;
2904 const GLuint
*uisrc
= (const GLuint
*) src
;
2906 for (i
= 0; i
< n
; i
++) {
2907 GLuint p
= uisrc
[i
];
2909 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2910 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2911 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2912 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2916 const GLuint
*uisrc
= (const GLuint
*) src
;
2918 for (i
= 0; i
< n
; i
++) {
2919 GLuint p
= uisrc
[i
];
2920 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2921 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2922 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2923 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2927 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2929 rs
= 1.0F
/ 1023.0F
;
2930 gs
= 1.0F
/ 1023.0F
;
2931 bs
= 1.0F
/ 1023.0F
;
2935 const GLuint
*uisrc
= (const GLuint
*) src
;
2937 for (i
= 0; i
< n
; i
++) {
2938 GLuint p
= uisrc
[i
];
2940 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2941 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2942 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2943 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2947 const GLuint
*uisrc
= (const GLuint
*) src
;
2949 for (i
= 0; i
< n
; i
++) {
2950 GLuint p
= uisrc
[i
];
2951 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2952 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2953 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2954 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2958 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2960 const GLuint
*uisrc
= (const GLuint
*) src
;
2963 for (i
= 0; i
< n
; i
++) {
2964 GLuint p
= uisrc
[i
];
2966 rgb9e5_to_float3(p
, f
);
2967 rgba
[i
][rDst
] = f
[0];
2968 rgba
[i
][gDst
] = f
[1];
2969 rgba
[i
][bDst
] = f
[2];
2970 rgba
[i
][aDst
] = 1.0F
;
2974 const GLuint
*uisrc
= (const GLuint
*) src
;
2977 for (i
= 0; i
< n
; i
++) {
2978 rgb9e5_to_float3(uisrc
[i
], f
);
2979 rgba
[i
][rDst
] = f
[0];
2980 rgba
[i
][gDst
] = f
[1];
2981 rgba
[i
][bDst
] = f
[2];
2982 rgba
[i
][aDst
] = 1.0F
;
2986 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2988 const GLuint
*uisrc
= (const GLuint
*) src
;
2991 for (i
= 0; i
< n
; i
++) {
2992 GLuint p
= uisrc
[i
];
2994 r11g11b10f_to_float3(p
, f
);
2995 rgba
[i
][rDst
] = f
[0];
2996 rgba
[i
][gDst
] = f
[1];
2997 rgba
[i
][bDst
] = f
[2];
2998 rgba
[i
][aDst
] = 1.0F
;
3002 const GLuint
*uisrc
= (const GLuint
*) src
;
3005 for (i
= 0; i
< n
; i
++) {
3006 r11g11b10f_to_float3(uisrc
[i
], f
);
3007 rgba
[i
][rDst
] = f
[0];
3008 rgba
[i
][gDst
] = f
[1];
3009 rgba
[i
][bDst
] = f
[2];
3010 rgba
[i
][aDst
] = 1.0F
;
3015 _mesa_problem(NULL
, "bad srcType in extract float data");
3022 static inline GLuint
3023 clamp_float_to_uint(GLfloat f
)
3025 return f
< 0.0F
? 0 : F_TO_I(f
);
3029 static inline GLuint
3030 clamp_half_to_uint(GLhalfARB h
)
3032 GLfloat f
= _mesa_half_to_float(h
);
3033 return f
< 0.0F
? 0 : F_TO_I(f
);
3038 * \sa extract_float_rgba()
3041 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3042 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3043 GLboolean swapBytes
)
3045 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3047 GLint rDst
, bDst
, gDst
, aDst
;
3049 ASSERT(srcFormat
== GL_RED
||
3050 srcFormat
== GL_GREEN
||
3051 srcFormat
== GL_BLUE
||
3052 srcFormat
== GL_ALPHA
||
3053 srcFormat
== GL_LUMINANCE
||
3054 srcFormat
== GL_LUMINANCE_ALPHA
||
3055 srcFormat
== GL_INTENSITY
||
3056 srcFormat
== GL_RG
||
3057 srcFormat
== GL_RGB
||
3058 srcFormat
== GL_BGR
||
3059 srcFormat
== GL_RGBA
||
3060 srcFormat
== GL_BGRA
||
3061 srcFormat
== GL_ABGR_EXT
||
3062 srcFormat
== GL_DU8DV8_ATI
||
3063 srcFormat
== GL_DUDV_ATI
||
3064 srcFormat
== GL_RED_INTEGER_EXT
||
3065 srcFormat
== GL_RG_INTEGER
||
3066 srcFormat
== GL_GREEN_INTEGER_EXT
||
3067 srcFormat
== GL_BLUE_INTEGER_EXT
||
3068 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3069 srcFormat
== GL_RGB_INTEGER_EXT
||
3070 srcFormat
== GL_RGBA_INTEGER_EXT
||
3071 srcFormat
== GL_BGR_INTEGER_EXT
||
3072 srcFormat
== GL_BGRA_INTEGER_EXT
||
3073 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3074 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3076 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3077 srcType
== GL_BYTE
||
3078 srcType
== GL_UNSIGNED_SHORT
||
3079 srcType
== GL_SHORT
||
3080 srcType
== GL_UNSIGNED_INT
||
3081 srcType
== GL_INT
||
3082 srcType
== GL_HALF_FLOAT_ARB
||
3083 srcType
== GL_FLOAT
||
3084 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3085 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3086 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3087 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3088 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3089 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3090 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3091 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3092 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3093 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3094 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3095 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3096 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3097 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3099 get_component_mapping(srcFormat
,
3100 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3101 &rDst
, &gDst
, &bDst
, &aDst
);
3103 stride
= _mesa_components_in_format(srcFormat
);
3105 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3106 if ((SRC_INDEX) < 0) { \
3108 for (i = 0; i < n; i++) { \
3109 rgba[i][DST_INDEX] = DEFAULT; \
3112 else if (swapBytes) { \
3113 const TYPE *s = (const TYPE *) src; \
3115 for (i = 0; i < n; i++) { \
3116 TYPE value = s[SRC_INDEX]; \
3117 if (sizeof(TYPE) == 2) { \
3120 else if (sizeof(TYPE) == 4) { \
3123 rgba[i][DST_INDEX] = CONVERSION(value); \
3128 const TYPE *s = (const TYPE *) src; \
3130 for (i = 0; i < n; i++) { \
3131 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3137 case GL_UNSIGNED_BYTE
:
3138 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3139 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3140 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3141 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3144 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3145 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3146 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3147 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3149 case GL_UNSIGNED_SHORT
:
3150 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3151 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3152 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3153 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3156 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3157 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3158 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3159 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3161 case GL_UNSIGNED_INT
:
3162 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3163 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3164 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3165 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3168 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3169 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3170 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3171 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3174 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3175 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3176 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3177 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3179 case GL_HALF_FLOAT_ARB
:
3180 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3181 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3182 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3183 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3185 case GL_UNSIGNED_BYTE_3_3_2
:
3187 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3189 for (i
= 0; i
< n
; i
++) {
3190 GLubyte p
= ubsrc
[i
];
3191 rgba
[i
][rDst
] = ((p
>> 5) );
3192 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3193 rgba
[i
][bDst
] = ((p
) & 0x3);
3198 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3200 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3202 for (i
= 0; i
< n
; i
++) {
3203 GLubyte p
= ubsrc
[i
];
3204 rgba
[i
][rDst
] = ((p
) & 0x7);
3205 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3206 rgba
[i
][bDst
] = ((p
>> 6) );
3211 case GL_UNSIGNED_SHORT_5_6_5
:
3213 const GLushort
*ussrc
= (const GLushort
*) src
;
3215 for (i
= 0; i
< n
; i
++) {
3216 GLushort p
= ussrc
[i
];
3218 rgba
[i
][rDst
] = ((p
>> 11) );
3219 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3220 rgba
[i
][bDst
] = ((p
) & 0x1f);
3225 const GLushort
*ussrc
= (const GLushort
*) src
;
3227 for (i
= 0; i
< n
; i
++) {
3228 GLushort p
= ussrc
[i
];
3229 rgba
[i
][rDst
] = ((p
>> 11) );
3230 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3231 rgba
[i
][bDst
] = ((p
) & 0x1f);
3236 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3238 const GLushort
*ussrc
= (const GLushort
*) src
;
3240 for (i
= 0; i
< n
; i
++) {
3241 GLushort p
= ussrc
[i
];
3243 rgba
[i
][rDst
] = ((p
) & 0x1f);
3244 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3245 rgba
[i
][bDst
] = ((p
>> 11) );
3250 const GLushort
*ussrc
= (const GLushort
*) src
;
3252 for (i
= 0; i
< n
; i
++) {
3253 GLushort p
= ussrc
[i
];
3254 rgba
[i
][rDst
] = ((p
) & 0x1f);
3255 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3256 rgba
[i
][bDst
] = ((p
>> 11) );
3261 case GL_UNSIGNED_SHORT_4_4_4_4
:
3263 const GLushort
*ussrc
= (const GLushort
*) src
;
3265 for (i
= 0; i
< n
; i
++) {
3266 GLushort p
= ussrc
[i
];
3268 rgba
[i
][rDst
] = ((p
>> 12) );
3269 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3270 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3271 rgba
[i
][aDst
] = ((p
) & 0xf);
3275 const GLushort
*ussrc
= (const GLushort
*) src
;
3277 for (i
= 0; i
< n
; i
++) {
3278 GLushort p
= ussrc
[i
];
3279 rgba
[i
][rDst
] = ((p
>> 12) );
3280 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3281 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3282 rgba
[i
][aDst
] = ((p
) & 0xf);
3286 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3288 const GLushort
*ussrc
= (const GLushort
*) src
;
3290 for (i
= 0; i
< n
; i
++) {
3291 GLushort p
= ussrc
[i
];
3293 rgba
[i
][rDst
] = ((p
) & 0xf);
3294 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3295 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3296 rgba
[i
][aDst
] = ((p
>> 12) );
3300 const GLushort
*ussrc
= (const GLushort
*) src
;
3302 for (i
= 0; i
< n
; i
++) {
3303 GLushort p
= ussrc
[i
];
3304 rgba
[i
][rDst
] = ((p
) & 0xf);
3305 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3306 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3307 rgba
[i
][aDst
] = ((p
>> 12) );
3311 case GL_UNSIGNED_SHORT_5_5_5_1
:
3313 const GLushort
*ussrc
= (const GLushort
*) src
;
3315 for (i
= 0; i
< n
; i
++) {
3316 GLushort p
= ussrc
[i
];
3318 rgba
[i
][rDst
] = ((p
>> 11) );
3319 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3320 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3321 rgba
[i
][aDst
] = ((p
) & 0x1 );
3325 const GLushort
*ussrc
= (const GLushort
*) src
;
3327 for (i
= 0; i
< n
; i
++) {
3328 GLushort p
= ussrc
[i
];
3329 rgba
[i
][rDst
] = ((p
>> 11) );
3330 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3331 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3332 rgba
[i
][aDst
] = ((p
) & 0x1 );
3336 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3338 const GLushort
*ussrc
= (const GLushort
*) src
;
3340 for (i
= 0; i
< n
; i
++) {
3341 GLushort p
= ussrc
[i
];
3343 rgba
[i
][rDst
] = ((p
) & 0x1f);
3344 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3345 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3346 rgba
[i
][aDst
] = ((p
>> 15) );
3350 const GLushort
*ussrc
= (const GLushort
*) src
;
3352 for (i
= 0; i
< n
; i
++) {
3353 GLushort p
= ussrc
[i
];
3354 rgba
[i
][rDst
] = ((p
) & 0x1f);
3355 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3356 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3357 rgba
[i
][aDst
] = ((p
>> 15) );
3361 case GL_UNSIGNED_INT_8_8_8_8
:
3363 const GLuint
*uisrc
= (const GLuint
*) src
;
3365 for (i
= 0; i
< n
; i
++) {
3366 GLuint p
= uisrc
[i
];
3367 rgba
[i
][rDst
] = ((p
) & 0xff);
3368 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3369 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3370 rgba
[i
][aDst
] = ((p
>> 24) );
3374 const GLuint
*uisrc
= (const GLuint
*) src
;
3376 for (i
= 0; i
< n
; i
++) {
3377 GLuint p
= uisrc
[i
];
3378 rgba
[i
][rDst
] = ((p
>> 24) );
3379 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3380 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3381 rgba
[i
][aDst
] = ((p
) & 0xff);
3385 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3387 const GLuint
*uisrc
= (const GLuint
*) src
;
3389 for (i
= 0; i
< n
; i
++) {
3390 GLuint p
= uisrc
[i
];
3391 rgba
[i
][rDst
] = ((p
>> 24) );
3392 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3393 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3394 rgba
[i
][aDst
] = ((p
) & 0xff);
3398 const GLuint
*uisrc
= (const GLuint
*) src
;
3400 for (i
= 0; i
< n
; i
++) {
3401 GLuint p
= uisrc
[i
];
3402 rgba
[i
][rDst
] = ((p
) & 0xff);
3403 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3404 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3405 rgba
[i
][aDst
] = ((p
>> 24) );
3409 case GL_UNSIGNED_INT_10_10_10_2
:
3411 const GLuint
*uisrc
= (const GLuint
*) src
;
3413 for (i
= 0; i
< n
; i
++) {
3414 GLuint p
= uisrc
[i
];
3416 rgba
[i
][rDst
] = ((p
>> 22) );
3417 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3418 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3419 rgba
[i
][aDst
] = ((p
) & 0x3 );
3423 const GLuint
*uisrc
= (const GLuint
*) src
;
3425 for (i
= 0; i
< n
; i
++) {
3426 GLuint p
= uisrc
[i
];
3427 rgba
[i
][rDst
] = ((p
>> 22) );
3428 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3429 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3430 rgba
[i
][aDst
] = ((p
) & 0x3 );
3434 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3436 const GLuint
*uisrc
= (const GLuint
*) src
;
3438 for (i
= 0; i
< n
; i
++) {
3439 GLuint p
= uisrc
[i
];
3441 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3442 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3443 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3444 rgba
[i
][aDst
] = ((p
>> 30) );
3448 const GLuint
*uisrc
= (const GLuint
*) src
;
3450 for (i
= 0; i
< n
; i
++) {
3451 GLuint p
= uisrc
[i
];
3452 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3453 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3454 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3455 rgba
[i
][aDst
] = ((p
>> 30) );
3459 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3461 const GLuint
*uisrc
= (const GLuint
*) src
;
3464 for (i
= 0; i
< n
; i
++) {
3465 GLuint p
= uisrc
[i
];
3467 rgb9e5_to_float3(p
, f
);
3468 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3469 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3470 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3475 const GLuint
*uisrc
= (const GLuint
*) src
;
3478 for (i
= 0; i
< n
; i
++) {
3479 GLuint p
= uisrc
[i
];
3480 rgb9e5_to_float3(p
, f
);
3481 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3482 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3483 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3488 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3490 const GLuint
*uisrc
= (const GLuint
*) src
;
3493 for (i
= 0; i
< n
; i
++) {
3494 GLuint p
= uisrc
[i
];
3496 r11g11b10f_to_float3(p
, f
);
3497 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3498 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3499 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3504 const GLuint
*uisrc
= (const GLuint
*) src
;
3507 for (i
= 0; i
< n
; i
++) {
3508 GLuint p
= uisrc
[i
];
3509 r11g11b10f_to_float3(p
, f
);
3510 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3511 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3512 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3518 _mesa_problem(NULL
, "bad srcType in extract uint data");
3527 * Unpack a row of color image data from a client buffer according to
3528 * the pixel unpacking parameters.
3529 * Return GLubyte values in the specified dest image format.
3530 * This is used by glDrawPixels and glTexImage?D().
3531 * \param ctx - the context
3532 * n - number of pixels in the span
3533 * dstFormat - format of destination color array
3534 * dest - the destination color array
3535 * srcFormat - source image format
3536 * srcType - source image data type
3537 * source - source image pointer
3538 * srcPacking - pixel unpacking parameters
3539 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3541 * XXX perhaps expand this to process whole images someday.
3544 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3545 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3546 GLenum srcFormat
, GLenum srcType
,
3547 const GLvoid
*source
,
3548 const struct gl_pixelstore_attrib
*srcPacking
,
3549 GLbitfield transferOps
)
3551 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3552 ASSERT(dstFormat
== GL_ALPHA
||
3553 dstFormat
== GL_LUMINANCE
||
3554 dstFormat
== GL_LUMINANCE_ALPHA
||
3555 dstFormat
== GL_INTENSITY
||
3556 dstFormat
== GL_RED
||
3557 dstFormat
== GL_RG
||
3558 dstFormat
== GL_RGB
||
3559 dstFormat
== GL_RGBA
);
3561 ASSERT(srcFormat
== GL_RED
||
3562 srcFormat
== GL_GREEN
||
3563 srcFormat
== GL_BLUE
||
3564 srcFormat
== GL_ALPHA
||
3565 srcFormat
== GL_LUMINANCE
||
3566 srcFormat
== GL_LUMINANCE_ALPHA
||
3567 srcFormat
== GL_INTENSITY
||
3568 srcFormat
== GL_RG
||
3569 srcFormat
== GL_RGB
||
3570 srcFormat
== GL_BGR
||
3571 srcFormat
== GL_RGBA
||
3572 srcFormat
== GL_BGRA
||
3573 srcFormat
== GL_ABGR_EXT
||
3574 srcFormat
== GL_COLOR_INDEX
);
3576 ASSERT(srcType
== GL_BITMAP
||
3577 srcType
== GL_UNSIGNED_BYTE
||
3578 srcType
== GL_BYTE
||
3579 srcType
== GL_UNSIGNED_SHORT
||
3580 srcType
== GL_SHORT
||
3581 srcType
== GL_UNSIGNED_INT
||
3582 srcType
== GL_INT
||
3583 srcType
== GL_HALF_FLOAT_ARB
||
3584 srcType
== GL_FLOAT
||
3585 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3586 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3587 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3588 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3589 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3590 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3591 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3592 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3593 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3594 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3595 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3596 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3597 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3598 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3600 /* EXT_texture_integer specifies no transfer ops on integer
3601 * types in the resolved issues section. Just set them to 0
3602 * for integer surfaces.
3607 /* Try simple cases first */
3608 if (transferOps
== 0) {
3609 if (srcType
== GL_UNSIGNED_BYTE
) {
3610 if (dstFormat
== GL_RGBA
) {
3611 if (srcFormat
== GL_RGBA
) {
3612 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3615 else if (srcFormat
== GL_RGB
) {
3617 const GLubyte
*src
= (const GLubyte
*) source
;
3618 GLubyte
*dst
= dest
;
3619 for (i
= 0; i
< n
; i
++) {
3630 else if (dstFormat
== GL_RGB
) {
3631 if (srcFormat
== GL_RGB
) {
3632 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3635 else if (srcFormat
== GL_RGBA
) {
3637 const GLubyte
*src
= (const GLubyte
*) source
;
3638 GLubyte
*dst
= dest
;
3639 for (i
= 0; i
< n
; i
++) {
3649 else if (dstFormat
== srcFormat
) {
3650 GLint comps
= _mesa_components_in_format(srcFormat
);
3652 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3659 /* general solution begins here */
3661 GLint dstComponents
;
3662 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3663 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3666 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3670 dstComponents
= _mesa_components_in_format( dstFormat
);
3671 /* source & dest image formats should have been error checked by now */
3672 assert(dstComponents
> 0);
3675 * Extract image data and convert to RGBA floats
3677 if (srcFormat
== GL_COLOR_INDEX
) {
3678 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3681 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3686 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3689 /* Convert indexes to RGBA */
3690 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3691 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3693 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3695 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3696 * with color indexes.
3698 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3703 /* non-color index data */
3704 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3705 srcPacking
->SwapBytes
);
3708 /* Need to clamp if returning GLubytes */
3709 transferOps
|= IMAGE_CLAMP_BIT
;
3712 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3715 get_component_indexes(dstFormat
,
3716 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3718 /* Now return the GLubyte data in the requested dstFormat */
3720 GLubyte
*dst
= dest
;
3722 for (i
= 0; i
< n
; i
++) {
3723 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3724 dst
+= dstComponents
;
3729 GLubyte
*dst
= dest
;
3731 for (i
= 0; i
< n
; i
++) {
3732 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3733 dst
+= dstComponents
;
3738 GLubyte
*dst
= dest
;
3740 for (i
= 0; i
< n
; i
++) {
3741 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3742 dst
+= dstComponents
;
3747 GLubyte
*dst
= dest
;
3749 for (i
= 0; i
< n
; i
++) {
3750 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3751 dst
+= dstComponents
;
3756 GLubyte
*dst
= dest
;
3759 assert(dstComponents
== 1);
3760 for (i
= 0; i
< n
; i
++) {
3761 /* Intensity comes from red channel */
3762 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3767 GLubyte
*dst
= dest
;
3770 for (i
= 0; i
< n
; i
++) {
3771 /* Luminance comes from red channel */
3772 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3773 dst
+= dstComponents
;
3783 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3784 * instead of GLubyte.
3787 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3788 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3789 GLenum srcFormat
, GLenum srcType
,
3790 const GLvoid
*source
,
3791 const struct gl_pixelstore_attrib
*srcPacking
,
3792 GLbitfield transferOps
)
3794 ASSERT(dstFormat
== GL_ALPHA
||
3795 dstFormat
== GL_LUMINANCE
||
3796 dstFormat
== GL_LUMINANCE_ALPHA
||
3797 dstFormat
== GL_INTENSITY
||
3798 dstFormat
== GL_RED
||
3799 dstFormat
== GL_RG
||
3800 dstFormat
== GL_RGB
||
3801 dstFormat
== GL_RGBA
);
3803 ASSERT(srcFormat
== GL_RED
||
3804 srcFormat
== GL_GREEN
||
3805 srcFormat
== GL_BLUE
||
3806 srcFormat
== GL_ALPHA
||
3807 srcFormat
== GL_LUMINANCE
||
3808 srcFormat
== GL_LUMINANCE_ALPHA
||
3809 srcFormat
== GL_INTENSITY
||
3810 srcFormat
== GL_RG
||
3811 srcFormat
== GL_RGB
||
3812 srcFormat
== GL_BGR
||
3813 srcFormat
== GL_RGBA
||
3814 srcFormat
== GL_BGRA
||
3815 srcFormat
== GL_ABGR_EXT
||
3816 srcFormat
== GL_RED_INTEGER_EXT
||
3817 srcFormat
== GL_GREEN_INTEGER_EXT
||
3818 srcFormat
== GL_BLUE_INTEGER_EXT
||
3819 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3820 srcFormat
== GL_RG_INTEGER
||
3821 srcFormat
== GL_RGB_INTEGER_EXT
||
3822 srcFormat
== GL_RGBA_INTEGER_EXT
||
3823 srcFormat
== GL_BGR_INTEGER_EXT
||
3824 srcFormat
== GL_BGRA_INTEGER_EXT
||
3825 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3826 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3827 srcFormat
== GL_COLOR_INDEX
);
3829 ASSERT(srcType
== GL_BITMAP
||
3830 srcType
== GL_UNSIGNED_BYTE
||
3831 srcType
== GL_BYTE
||
3832 srcType
== GL_UNSIGNED_SHORT
||
3833 srcType
== GL_SHORT
||
3834 srcType
== GL_UNSIGNED_INT
||
3835 srcType
== GL_INT
||
3836 srcType
== GL_HALF_FLOAT_ARB
||
3837 srcType
== GL_FLOAT
||
3838 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3839 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3840 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3841 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3842 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3843 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3844 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3845 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3846 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3847 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3848 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3849 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3850 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3851 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3853 /* general solution, no special cases, yet */
3855 GLint dstComponents
;
3856 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3857 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3858 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3861 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3865 dstComponents
= _mesa_components_in_format( dstFormat
);
3866 /* source & dest image formats should have been error checked by now */
3867 assert(dstComponents
> 0);
3869 /* EXT_texture_integer specifies no transfer ops on integer
3870 * types in the resolved issues section. Just set them to 0
3871 * for integer surfaces.
3877 * Extract image data and convert to RGBA floats
3879 if (srcFormat
== GL_COLOR_INDEX
) {
3880 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3883 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3888 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3891 /* Convert indexes to RGBA */
3892 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3893 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3895 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3897 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3898 * with color indexes.
3900 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3905 /* non-color index data */
3906 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3907 srcPacking
->SwapBytes
);
3911 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3914 get_component_indexes(dstFormat
,
3915 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3917 /* Now pack results in the requested dstFormat */
3919 GLfloat
*dst
= dest
;
3921 for (i
= 0; i
< n
; i
++) {
3922 dst
[rDst
] = rgba
[i
][RCOMP
];
3923 dst
+= dstComponents
;
3928 GLfloat
*dst
= dest
;
3930 for (i
= 0; i
< n
; i
++) {
3931 dst
[gDst
] = rgba
[i
][GCOMP
];
3932 dst
+= dstComponents
;
3937 GLfloat
*dst
= dest
;
3939 for (i
= 0; i
< n
; i
++) {
3940 dst
[bDst
] = rgba
[i
][BCOMP
];
3941 dst
+= dstComponents
;
3946 GLfloat
*dst
= dest
;
3948 for (i
= 0; i
< n
; i
++) {
3949 dst
[aDst
] = rgba
[i
][ACOMP
];
3950 dst
+= dstComponents
;
3955 GLfloat
*dst
= dest
;
3958 assert(dstComponents
== 1);
3959 for (i
= 0; i
< n
; i
++) {
3960 /* Intensity comes from red channel */
3961 dst
[i
] = rgba
[i
][RCOMP
];
3966 GLfloat
*dst
= dest
;
3969 for (i
= 0; i
< n
; i
++) {
3970 /* Luminance comes from red channel */
3971 dst
[0] = rgba
[i
][RCOMP
];
3972 dst
+= dstComponents
;
3982 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3983 * instead of GLubyte.
3984 * No pixel transfer ops are applied.
3987 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3988 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3989 GLenum srcFormat
, GLenum srcType
,
3990 const GLvoid
*source
,
3991 const struct gl_pixelstore_attrib
*srcPacking
)
3993 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3996 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4000 ASSERT(dstFormat
== GL_ALPHA
||
4001 dstFormat
== GL_LUMINANCE
||
4002 dstFormat
== GL_LUMINANCE_ALPHA
||
4003 dstFormat
== GL_INTENSITY
||
4004 dstFormat
== GL_RED
||
4005 dstFormat
== GL_RG
||
4006 dstFormat
== GL_RGB
||
4007 dstFormat
== GL_RGBA
);
4009 ASSERT(srcFormat
== GL_RED
||
4010 srcFormat
== GL_GREEN
||
4011 srcFormat
== GL_BLUE
||
4012 srcFormat
== GL_ALPHA
||
4013 srcFormat
== GL_LUMINANCE
||
4014 srcFormat
== GL_LUMINANCE_ALPHA
||
4015 srcFormat
== GL_INTENSITY
||
4016 srcFormat
== GL_RG
||
4017 srcFormat
== GL_RGB
||
4018 srcFormat
== GL_BGR
||
4019 srcFormat
== GL_RGBA
||
4020 srcFormat
== GL_BGRA
||
4021 srcFormat
== GL_ABGR_EXT
||
4022 srcFormat
== GL_RED_INTEGER_EXT
||
4023 srcFormat
== GL_GREEN_INTEGER_EXT
||
4024 srcFormat
== GL_BLUE_INTEGER_EXT
||
4025 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4026 srcFormat
== GL_RG_INTEGER
||
4027 srcFormat
== GL_RGB_INTEGER_EXT
||
4028 srcFormat
== GL_RGBA_INTEGER_EXT
||
4029 srcFormat
== GL_BGR_INTEGER_EXT
||
4030 srcFormat
== GL_BGRA_INTEGER_EXT
||
4031 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4032 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4034 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4035 srcType
== GL_BYTE
||
4036 srcType
== GL_UNSIGNED_SHORT
||
4037 srcType
== GL_SHORT
||
4038 srcType
== GL_UNSIGNED_INT
||
4039 srcType
== GL_INT
||
4040 srcType
== GL_HALF_FLOAT_ARB
||
4041 srcType
== GL_FLOAT
||
4042 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4043 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4044 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4045 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4046 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4047 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4048 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4049 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4050 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4051 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4052 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4053 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4054 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4055 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4058 /* Extract image data as uint[4] pixels */
4059 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4060 srcPacking
->SwapBytes
);
4062 if (dstFormat
== GL_RGBA
) {
4064 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4068 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4069 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4071 assert(dstComponents
> 0);
4073 get_component_indexes(dstFormat
,
4074 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4076 /* Now pack values in the requested dest format */
4080 for (i
= 0; i
< n
; i
++) {
4081 dst
[rDst
] = rgba
[i
][RCOMP
];
4082 dst
+= dstComponents
;
4089 for (i
= 0; i
< n
; i
++) {
4090 dst
[gDst
] = rgba
[i
][GCOMP
];
4091 dst
+= dstComponents
;
4098 for (i
= 0; i
< n
; i
++) {
4099 dst
[bDst
] = rgba
[i
][BCOMP
];
4100 dst
+= dstComponents
;
4107 for (i
= 0; i
< n
; i
++) {
4108 dst
[aDst
] = rgba
[i
][ACOMP
];
4109 dst
+= dstComponents
;
4117 assert(dstComponents
== 1);
4118 for (i
= 0; i
< n
; i
++) {
4119 /* Intensity comes from red channel */
4120 dst
[i
] = rgba
[i
][RCOMP
];
4128 for (i
= 0; i
< n
; i
++) {
4129 /* Luminance comes from red channel */
4130 dst
[0] = rgba
[i
][RCOMP
];
4131 dst
+= dstComponents
;
4142 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4143 * directly return GLbyte data, no transfer ops apply.
4146 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4147 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4148 GLenum srcFormat
, GLenum srcType
,
4149 const GLvoid
*source
,
4150 const struct gl_pixelstore_attrib
*srcPacking
,
4151 GLbitfield transferOps
)
4153 ASSERT(dstFormat
== GL_DUDV_ATI
);
4154 ASSERT(srcFormat
== GL_DUDV_ATI
||
4155 srcFormat
== GL_DU8DV8_ATI
);
4157 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4158 srcType
== GL_BYTE
||
4159 srcType
== GL_UNSIGNED_SHORT
||
4160 srcType
== GL_SHORT
||
4161 srcType
== GL_UNSIGNED_INT
||
4162 srcType
== GL_INT
||
4163 srcType
== GL_HALF_FLOAT_ARB
||
4164 srcType
== GL_FLOAT
);
4166 /* general solution */
4168 GLint dstComponents
;
4171 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4174 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4178 dstComponents
= _mesa_components_in_format( dstFormat
);
4179 /* source & dest image formats should have been error checked by now */
4180 assert(dstComponents
> 0);
4183 * Extract image data and convert to RGBA floats
4185 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4186 srcPacking
->SwapBytes
);
4189 /* Now determine which color channels we need to produce.
4190 * And determine the dest index (offset) within each color tuple.
4193 /* Now pack results in the requested dstFormat */
4194 for (i
= 0; i
< n
; i
++) {
4195 /* not sure - need clamp[-1,1] here? */
4196 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4197 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4198 dst
+= dstComponents
;
4206 * Unpack a row of color index data from a client buffer according to
4207 * the pixel unpacking parameters.
4208 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4210 * Args: ctx - the context
4211 * n - number of pixels
4212 * dstType - destination data type
4213 * dest - destination array
4214 * srcType - source pixel type
4215 * source - source data pointer
4216 * srcPacking - pixel unpacking parameters
4217 * transferOps - the pixel transfer operations to apply
4220 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4221 GLenum dstType
, GLvoid
*dest
,
4222 GLenum srcType
, const GLvoid
*source
,
4223 const struct gl_pixelstore_attrib
*srcPacking
,
4224 GLbitfield transferOps
)
4226 ASSERT(srcType
== GL_BITMAP
||
4227 srcType
== GL_UNSIGNED_BYTE
||
4228 srcType
== GL_BYTE
||
4229 srcType
== GL_UNSIGNED_SHORT
||
4230 srcType
== GL_SHORT
||
4231 srcType
== GL_UNSIGNED_INT
||
4232 srcType
== GL_INT
||
4233 srcType
== GL_HALF_FLOAT_ARB
||
4234 srcType
== GL_FLOAT
);
4236 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4237 dstType
== GL_UNSIGNED_SHORT
||
4238 dstType
== GL_UNSIGNED_INT
);
4241 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4244 * Try simple cases first
4246 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4247 && dstType
== GL_UNSIGNED_BYTE
) {
4248 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4250 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4251 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4252 memcpy(dest
, source
, n
* sizeof(GLuint
));
4258 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4261 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4265 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4269 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4271 /* convert to dest type */
4273 case GL_UNSIGNED_BYTE
:
4275 GLubyte
*dst
= (GLubyte
*) dest
;
4277 for (i
= 0; i
< n
; i
++) {
4278 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4282 case GL_UNSIGNED_SHORT
:
4284 GLuint
*dst
= (GLuint
*) dest
;
4286 for (i
= 0; i
< n
; i
++) {
4287 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4291 case GL_UNSIGNED_INT
:
4292 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4295 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4304 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4305 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4306 const struct gl_pixelstore_attrib
*dstPacking
,
4307 GLbitfield transferOps
)
4309 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4312 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4316 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4318 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4319 /* make a copy of input */
4320 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4321 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4326 case GL_UNSIGNED_BYTE
:
4328 GLubyte
*dst
= (GLubyte
*) dest
;
4330 for (i
= 0; i
< n
; i
++) {
4331 *dst
++ = (GLubyte
) source
[i
];
4337 GLbyte
*dst
= (GLbyte
*) dest
;
4339 for (i
= 0; i
< n
; i
++) {
4340 dst
[i
] = (GLbyte
) source
[i
];
4344 case GL_UNSIGNED_SHORT
:
4346 GLushort
*dst
= (GLushort
*) dest
;
4348 for (i
= 0; i
< n
; i
++) {
4349 dst
[i
] = (GLushort
) source
[i
];
4351 if (dstPacking
->SwapBytes
) {
4352 _mesa_swap2( (GLushort
*) dst
, n
);
4358 GLshort
*dst
= (GLshort
*) dest
;
4360 for (i
= 0; i
< n
; i
++) {
4361 dst
[i
] = (GLshort
) source
[i
];
4363 if (dstPacking
->SwapBytes
) {
4364 _mesa_swap2( (GLushort
*) dst
, n
);
4368 case GL_UNSIGNED_INT
:
4370 GLuint
*dst
= (GLuint
*) dest
;
4372 for (i
= 0; i
< n
; i
++) {
4373 dst
[i
] = (GLuint
) source
[i
];
4375 if (dstPacking
->SwapBytes
) {
4376 _mesa_swap4( (GLuint
*) dst
, n
);
4382 GLint
*dst
= (GLint
*) dest
;
4384 for (i
= 0; i
< n
; i
++) {
4385 dst
[i
] = (GLint
) source
[i
];
4387 if (dstPacking
->SwapBytes
) {
4388 _mesa_swap4( (GLuint
*) dst
, n
);
4394 GLfloat
*dst
= (GLfloat
*) dest
;
4396 for (i
= 0; i
< n
; i
++) {
4397 dst
[i
] = (GLfloat
) source
[i
];
4399 if (dstPacking
->SwapBytes
) {
4400 _mesa_swap4( (GLuint
*) dst
, n
);
4404 case GL_HALF_FLOAT_ARB
:
4406 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4408 for (i
= 0; i
< n
; i
++) {
4409 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4411 if (dstPacking
->SwapBytes
) {
4412 _mesa_swap2( (GLushort
*) dst
, n
);
4417 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4425 * Unpack a row of stencil data from a client buffer according to
4426 * the pixel unpacking parameters.
4427 * This is (or will be) used by glDrawPixels
4429 * Args: ctx - the context
4430 * n - number of pixels
4431 * dstType - destination data type
4432 * dest - destination array
4433 * srcType - source pixel type
4434 * source - source data pointer
4435 * srcPacking - pixel unpacking parameters
4436 * transferOps - apply offset/bias/lookup ops?
4439 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4440 GLenum dstType
, GLvoid
*dest
,
4441 GLenum srcType
, const GLvoid
*source
,
4442 const struct gl_pixelstore_attrib
*srcPacking
,
4443 GLbitfield transferOps
)
4445 ASSERT(srcType
== GL_BITMAP
||
4446 srcType
== GL_UNSIGNED_BYTE
||
4447 srcType
== GL_BYTE
||
4448 srcType
== GL_UNSIGNED_SHORT
||
4449 srcType
== GL_SHORT
||
4450 srcType
== GL_UNSIGNED_INT
||
4451 srcType
== GL_INT
||
4452 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4453 srcType
== GL_HALF_FLOAT_ARB
||
4454 srcType
== GL_FLOAT
||
4455 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4457 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4458 dstType
== GL_UNSIGNED_SHORT
||
4459 dstType
== GL_UNSIGNED_INT
||
4460 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4462 /* only shift and offset apply to stencil */
4463 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4466 * Try simple cases first
4468 if (transferOps
== 0 &&
4469 !ctx
->Pixel
.MapStencilFlag
&&
4470 srcType
== GL_UNSIGNED_BYTE
&&
4471 dstType
== GL_UNSIGNED_BYTE
) {
4472 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4474 else if (transferOps
== 0 &&
4475 !ctx
->Pixel
.MapStencilFlag
&&
4476 srcType
== GL_UNSIGNED_INT
&&
4477 dstType
== GL_UNSIGNED_INT
&&
4478 !srcPacking
->SwapBytes
) {
4479 memcpy(dest
, source
, n
* sizeof(GLuint
));
4485 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4488 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4492 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4495 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4496 /* shift and offset indexes */
4497 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4500 if (ctx
->Pixel
.MapStencilFlag
) {
4501 /* Apply stencil lookup table */
4502 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4504 for (i
= 0; i
< n
; i
++) {
4505 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4509 /* convert to dest type */
4511 case GL_UNSIGNED_BYTE
:
4513 GLubyte
*dst
= (GLubyte
*) dest
;
4515 for (i
= 0; i
< n
; i
++) {
4516 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4520 case GL_UNSIGNED_SHORT
:
4522 GLuint
*dst
= (GLuint
*) dest
;
4524 for (i
= 0; i
< n
; i
++) {
4525 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4529 case GL_UNSIGNED_INT
:
4530 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4532 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4534 GLuint
*dst
= (GLuint
*) dest
;
4536 for (i
= 0; i
< n
; i
++) {
4537 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4542 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4551 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4552 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4553 const struct gl_pixelstore_attrib
*dstPacking
)
4555 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4558 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4562 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4563 ctx
->Pixel
.MapStencilFlag
) {
4564 /* make a copy of input */
4565 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4566 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4571 case GL_UNSIGNED_BYTE
:
4572 memcpy(dest
, source
, n
);
4576 GLbyte
*dst
= (GLbyte
*) dest
;
4579 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4583 case GL_UNSIGNED_SHORT
:
4585 GLushort
*dst
= (GLushort
*) dest
;
4588 dst
[i
] = (GLushort
) source
[i
];
4590 if (dstPacking
->SwapBytes
) {
4591 _mesa_swap2( (GLushort
*) dst
, n
);
4597 GLshort
*dst
= (GLshort
*) dest
;
4600 dst
[i
] = (GLshort
) source
[i
];
4602 if (dstPacking
->SwapBytes
) {
4603 _mesa_swap2( (GLushort
*) dst
, n
);
4607 case GL_UNSIGNED_INT
:
4609 GLuint
*dst
= (GLuint
*) dest
;
4612 dst
[i
] = (GLuint
) source
[i
];
4614 if (dstPacking
->SwapBytes
) {
4615 _mesa_swap4( (GLuint
*) dst
, n
);
4621 GLint
*dst
= (GLint
*) dest
;
4624 dst
[i
] = (GLint
) source
[i
];
4626 if (dstPacking
->SwapBytes
) {
4627 _mesa_swap4( (GLuint
*) dst
, n
);
4633 GLfloat
*dst
= (GLfloat
*) dest
;
4636 dst
[i
] = (GLfloat
) source
[i
];
4638 if (dstPacking
->SwapBytes
) {
4639 _mesa_swap4( (GLuint
*) dst
, n
);
4643 case GL_HALF_FLOAT_ARB
:
4645 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4648 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4650 if (dstPacking
->SwapBytes
) {
4651 _mesa_swap2( (GLushort
*) dst
, n
);
4656 if (dstPacking
->LsbFirst
) {
4657 GLubyte
*dst
= (GLubyte
*) dest
;
4660 for (i
= 0; i
< n
; i
++) {
4663 *dst
|= ((source
[i
] != 0) << shift
);
4672 GLubyte
*dst
= (GLubyte
*) dest
;
4675 for (i
= 0; i
< n
; i
++) {
4678 *dst
|= ((source
[i
] != 0) << shift
);
4688 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4694 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4697 const GLTYPE *src = (const GLTYPE *)source; \
4698 for (i = 0; i < n; i++) { \
4699 GLTYPE value = src[i]; \
4700 if (srcPacking->SwapBytes) { \
4701 if (sizeof(GLTYPE) == 2) { \
4703 } else if (sizeof(GLTYPE) == 4) { \
4707 depthValues[i] = GLTYPE2FLOAT(value); \
4713 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4714 * or GLfloat values.
4715 * The glPixelTransfer (scale/bias) params will be applied.
4717 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4718 * \param depthMax max value for returned GLushort or GLuint values
4719 * (ignored for GLfloat).
4722 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4723 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4724 GLenum srcType
, const GLvoid
*source
,
4725 const struct gl_pixelstore_attrib
*srcPacking
)
4727 GLfloat
*depthTemp
= NULL
, *depthValues
;
4728 GLboolean needClamp
= GL_FALSE
;
4730 /* Look for special cases first.
4731 * Not only are these faster, they're less prone to numeric conversion
4732 * problems. Otherwise, converting from an int type to a float then
4733 * back to an int type can introduce errors that will show up as
4734 * artifacts in things like depth peeling which uses glCopyTexImage.
4736 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4737 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4738 const GLuint
*src
= (const GLuint
*) source
;
4739 GLushort
*dst
= (GLushort
*) dest
;
4741 for (i
= 0; i
< n
; i
++) {
4742 dst
[i
] = src
[i
] >> 16;
4746 if (srcType
== GL_UNSIGNED_SHORT
4747 && dstType
== GL_UNSIGNED_INT
4748 && depthMax
== 0xffffffff) {
4749 const GLushort
*src
= (const GLushort
*) source
;
4750 GLuint
*dst
= (GLuint
*) dest
;
4752 for (i
= 0; i
< n
; i
++) {
4753 dst
[i
] = src
[i
] | (src
[i
] << 16);
4757 if (srcType
== GL_UNSIGNED_INT_24_8
4758 && dstType
== GL_UNSIGNED_INT
4759 && depthMax
== 0xffffff) {
4760 const GLuint
*src
= (const GLuint
*) source
;
4761 GLuint
*dst
= (GLuint
*) dest
;
4763 for (i
= 0; i
< n
; i
++) {
4764 dst
[i
] = src
[i
] >> 8;
4768 /* XXX may want to add additional cases here someday */
4771 /* general case path follows */
4773 if (dstType
== GL_FLOAT
) {
4774 depthValues
= (GLfloat
*) dest
;
4777 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4779 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4783 depthValues
= depthTemp
;
4786 /* Convert incoming values to GLfloat. Some conversions will require
4791 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4792 needClamp
= GL_TRUE
;
4794 case GL_UNSIGNED_BYTE
:
4795 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4798 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4799 needClamp
= GL_TRUE
;
4801 case GL_UNSIGNED_SHORT
:
4802 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4805 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4806 needClamp
= GL_TRUE
;
4808 case GL_UNSIGNED_INT
:
4809 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4811 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4812 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4813 depthMax
== 0xffffff &&
4814 ctx
->Pixel
.DepthScale
== 1.0 &&
4815 ctx
->Pixel
.DepthBias
== 0.0) {
4816 const GLuint
*src
= (const GLuint
*) source
;
4817 GLuint
*zValues
= (GLuint
*) dest
;
4819 for (i
= 0; i
< n
; i
++) {
4820 GLuint value
= src
[i
];
4821 if (srcPacking
->SwapBytes
) {
4824 zValues
[i
] = value
& 0xffffff00;
4830 const GLuint
*src
= (const GLuint
*) source
;
4831 const GLfloat scale
= 1.0f
/ 0xffffff;
4833 for (i
= 0; i
< n
; i
++) {
4834 GLuint value
= src
[i
];
4835 if (srcPacking
->SwapBytes
) {
4838 depthValues
[i
] = (value
>> 8) * scale
;
4842 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4845 const GLfloat
*src
= (const GLfloat
*)source
;
4846 for (i
= 0; i
< n
; i
++) {
4847 GLfloat value
= src
[i
* 2];
4848 if (srcPacking
->SwapBytes
) {
4851 depthValues
[i
] = value
;
4853 needClamp
= GL_TRUE
;
4857 DEPTH_VALUES(GLfloat
, 1*);
4858 needClamp
= GL_TRUE
;
4860 case GL_HALF_FLOAT_ARB
:
4863 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4864 for (i
= 0; i
< n
; i
++) {
4865 GLhalfARB value
= src
[i
];
4866 if (srcPacking
->SwapBytes
) {
4869 depthValues
[i
] = _mesa_half_to_float(value
);
4871 needClamp
= GL_TRUE
;
4875 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4880 /* apply depth scale and bias */
4882 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4883 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4884 if (scale
!= 1.0 || bias
!= 0.0) {
4886 for (i
= 0; i
< n
; i
++) {
4887 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4889 needClamp
= GL_TRUE
;
4893 /* clamp to [0, 1] */
4896 for (i
= 0; i
< n
; i
++) {
4897 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4902 * Convert values to dstType
4904 if (dstType
== GL_UNSIGNED_INT
) {
4905 GLuint
*zValues
= (GLuint
*) dest
;
4907 if (depthMax
<= 0xffffff) {
4908 /* no overflow worries */
4909 for (i
= 0; i
< n
; i
++) {
4910 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4914 /* need to use double precision to prevent overflow problems */
4915 for (i
= 0; i
< n
; i
++) {
4916 GLdouble z
= depthValues
[i
] * (GLdouble
) depthMax
;
4917 if (z
>= (GLdouble
) 0xffffffff)
4918 zValues
[i
] = 0xffffffff;
4920 zValues
[i
] = (GLuint
) z
;
4924 else if (dstType
== GL_UNSIGNED_SHORT
) {
4925 GLushort
*zValues
= (GLushort
*) dest
;
4927 ASSERT(depthMax
<= 0xffff);
4928 for (i
= 0; i
< n
; i
++) {
4929 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4932 else if (dstType
== GL_FLOAT
) {
4933 /* Nothing to do. depthValues is pointing to dest. */
4935 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4936 GLfloat
*zValues
= (GLfloat
*) dest
;
4938 for (i
= 0; i
< n
; i
++) {
4939 zValues
[i
*2] = depthValues
[i
];
4951 * Pack an array of depth values. The values are floats in [0,1].
4954 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4955 GLenum dstType
, const GLfloat
*depthSpan
,
4956 const struct gl_pixelstore_attrib
*dstPacking
)
4958 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4960 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4964 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4965 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4966 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4967 depthSpan
= depthCopy
;
4971 case GL_UNSIGNED_BYTE
:
4973 GLubyte
*dst
= (GLubyte
*) dest
;
4975 for (i
= 0; i
< n
; i
++) {
4976 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4982 GLbyte
*dst
= (GLbyte
*) dest
;
4984 for (i
= 0; i
< n
; i
++) {
4985 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4989 case GL_UNSIGNED_SHORT
:
4991 GLushort
*dst
= (GLushort
*) dest
;
4993 for (i
= 0; i
< n
; i
++) {
4994 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4996 if (dstPacking
->SwapBytes
) {
4997 _mesa_swap2( (GLushort
*) dst
, n
);
5003 GLshort
*dst
= (GLshort
*) dest
;
5005 for (i
= 0; i
< n
; i
++) {
5006 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5008 if (dstPacking
->SwapBytes
) {
5009 _mesa_swap2( (GLushort
*) dst
, n
);
5013 case GL_UNSIGNED_INT
:
5015 GLuint
*dst
= (GLuint
*) dest
;
5017 for (i
= 0; i
< n
; i
++) {
5018 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5020 if (dstPacking
->SwapBytes
) {
5021 _mesa_swap4( (GLuint
*) dst
, n
);
5027 GLint
*dst
= (GLint
*) dest
;
5029 for (i
= 0; i
< n
; i
++) {
5030 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5032 if (dstPacking
->SwapBytes
) {
5033 _mesa_swap4( (GLuint
*) dst
, n
);
5039 GLfloat
*dst
= (GLfloat
*) dest
;
5041 for (i
= 0; i
< n
; i
++) {
5042 dst
[i
] = depthSpan
[i
];
5044 if (dstPacking
->SwapBytes
) {
5045 _mesa_swap4( (GLuint
*) dst
, n
);
5049 case GL_HALF_FLOAT_ARB
:
5051 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5053 for (i
= 0; i
< n
; i
++) {
5054 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5056 if (dstPacking
->SwapBytes
) {
5057 _mesa_swap2( (GLushort
*) dst
, n
);
5062 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5071 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5074 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5075 GLenum dstType
, GLuint
*dest
,
5076 const GLfloat
*depthVals
,
5077 const GLubyte
*stencilVals
,
5078 const struct gl_pixelstore_attrib
*dstPacking
)
5080 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5081 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5084 if (!depthCopy
|| !stencilCopy
) {
5085 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5091 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5092 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5093 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5094 depthVals
= depthCopy
;
5097 if (ctx
->Pixel
.IndexShift
||
5098 ctx
->Pixel
.IndexOffset
||
5099 ctx
->Pixel
.MapStencilFlag
) {
5100 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5101 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5102 stencilVals
= stencilCopy
;
5106 case GL_UNSIGNED_INT_24_8
:
5107 for (i
= 0; i
< n
; i
++) {
5108 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5109 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5112 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5113 for (i
= 0; i
< n
; i
++) {
5114 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5115 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5120 if (dstPacking
->SwapBytes
) {
5121 _mesa_swap4(dest
, n
);
5132 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5133 * Return all image data in a contiguous block. This is used when we
5134 * compile glDrawPixels, glTexImage, etc into a display list. We
5135 * need a copy of the data in a standard format.
5138 _mesa_unpack_image( GLuint dimensions
,
5139 GLsizei width
, GLsizei height
, GLsizei depth
,
5140 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5141 const struct gl_pixelstore_attrib
*unpack
)
5143 GLint bytesPerRow
, compsPerRow
;
5144 GLboolean flipBytes
, swap2
, swap4
;
5147 return NULL
; /* not necessarily an error */
5149 if (width
<= 0 || height
<= 0 || depth
<= 0)
5150 return NULL
; /* generate error later */
5152 if (type
== GL_BITMAP
) {
5153 bytesPerRow
= (width
+ 7) >> 3;
5154 flipBytes
= unpack
->LsbFirst
;
5155 swap2
= swap4
= GL_FALSE
;
5159 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5160 GLint components
= _mesa_components_in_format(format
);
5163 if (_mesa_type_is_packed(type
))
5166 if (bytesPerPixel
<= 0 || components
<= 0)
5167 return NULL
; /* bad format or type. generate error later */
5168 bytesPerRow
= bytesPerPixel
* width
;
5169 bytesPerComp
= bytesPerPixel
/ components
;
5170 flipBytes
= GL_FALSE
;
5171 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5172 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5173 compsPerRow
= components
* width
;
5174 assert(compsPerRow
>= width
);
5179 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5183 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5186 for (img
= 0; img
< depth
; img
++) {
5187 for (row
= 0; row
< height
; row
++) {
5188 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5189 width
, height
, format
, type
, img
, row
, 0);
5191 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5193 flipBytes
= GL_FALSE
;
5194 if (unpack
->LsbFirst
) {
5195 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5196 GLubyte dstMask
= 128;
5197 const GLubyte
*s
= src
;
5200 for (i
= 0; i
< width
; i
++) {
5204 if (srcMask
== 128) {
5209 srcMask
= srcMask
<< 1;
5217 dstMask
= dstMask
>> 1;
5222 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5223 GLubyte dstMask
= 128;
5224 const GLubyte
*s
= src
;
5227 for (i
= 0; i
< width
; i
++) {
5236 srcMask
= srcMask
>> 1;
5244 dstMask
= dstMask
>> 1;
5250 memcpy(dst
, src
, bytesPerRow
);
5253 /* byte flipping/swapping */
5255 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5258 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5261 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5273 * If we unpack colors from a luminance surface, we'll get pixel colors
5274 * such as (l, l, l, a).
5275 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5276 * function will compute L=R+G+B before packing. The net effect is we'll
5277 * accidentally store luminance values = 3*l.
5278 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5280 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5283 * Finally, we also need to do this when the actual surface format does
5284 * not match the logical surface format. For example, suppose the user
5285 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5286 * Again, we'll get pixel values like (l,l,l,a).
5289 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5293 switch (baseFormat
) {
5295 for (i
= 0; i
< n
; i
++) {
5296 rgba
[i
][RCOMP
] = 0.0F
;
5297 rgba
[i
][GCOMP
] = 0.0F
;
5298 rgba
[i
][BCOMP
] = 0.0F
;
5304 for (i
= 0; i
< n
; i
++) {
5305 rgba
[i
][GCOMP
] = 0.0F
;
5306 rgba
[i
][BCOMP
] = 0.0F
;
5307 rgba
[i
][ACOMP
] = 1.0F
;
5310 case GL_LUMINANCE_ALPHA
:
5311 for (i
= 0; i
< n
; i
++) {
5312 rgba
[i
][GCOMP
] = 0.0F
;
5313 rgba
[i
][BCOMP
] = 0.0F
;
5324 * As above, but GLuint components.
5327 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5331 switch (baseFormat
) {
5333 for (i
= 0; i
< n
; i
++) {
5342 for (i
= 0; i
< n
; i
++) {
5348 case GL_LUMINANCE_ALPHA
:
5349 for (i
= 0; i
< n
; i
++) {