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
= 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 unsigned integer packing.
467 #define SRC_TYPE GLuint
469 #define DST_TYPE GLuint
470 #define SRC_CONVERT(x) (x)
471 #define FN_NAME pack_uint_from_uint_rgba
472 #include "pack_tmp.h"
477 #define DST_TYPE GLint
478 #define SRC_CONVERT(x) MIN2(x, 0x7fffffff)
479 #define FN_NAME pack_int_from_uint_rgba
480 #include "pack_tmp.h"
485 #define DST_TYPE GLushort
486 #define SRC_CONVERT(x) MIN2(x, 0xffff)
487 #define FN_NAME pack_ushort_from_uint_rgba
488 #include "pack_tmp.h"
493 #define DST_TYPE GLshort
494 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
495 #define FN_NAME pack_short_from_uint_rgba
496 #include "pack_tmp.h"
501 #define DST_TYPE GLubyte
502 #define SRC_CONVERT(x) MIN2(x, 0xff)
503 #define FN_NAME pack_ubyte_from_uint_rgba
504 #include "pack_tmp.h"
509 #define DST_TYPE GLbyte
510 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
511 #define FN_NAME pack_byte_from_uint_rgba
512 #include "pack_tmp.h"
520 _pack_rgba_span_from_uints_problem(struct gl_context
*ctx
,
521 GLenum dstFormat
, GLenum dstType
)
524 "Unsupported type (%s) / format (%s) "
525 "in _mesa_pack_rgba_span_from_uints",
526 _mesa_lookup_enum_by_nr(dstType
),
527 _mesa_lookup_enum_by_nr(dstFormat
));
531 _mesa_pack_rgba_span_from_uints(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
532 GLenum dstFormat
, GLenum dstType
,
538 case GL_UNSIGNED_INT
:
539 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
542 pack_int_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
544 case GL_UNSIGNED_SHORT
:
545 pack_ushort_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
548 pack_short_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
550 case GL_UNSIGNED_BYTE
:
551 pack_ubyte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
554 pack_byte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
556 case GL_UNSIGNED_BYTE_3_3_2
:
557 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
558 GLubyte
*dst
= (GLubyte
*) dstAddr
;
560 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 7) << 5)
561 | (MIN2(rgba
[i
][GCOMP
], 7) << 2)
562 | (MIN2(rgba
[i
][BCOMP
], 3) );
565 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
568 case GL_UNSIGNED_BYTE_2_3_3_REV
:
569 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
570 GLubyte
*dst
= (GLubyte
*) dstAddr
;
572 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 7) )
573 | (MIN2(rgba
[i
][GCOMP
], 7) << 3)
574 | (MIN2(rgba
[i
][BCOMP
], 3) << 6);
577 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
580 case GL_UNSIGNED_SHORT_5_6_5
:
581 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
582 GLushort
*dst
= (GLushort
*) dstAddr
;
584 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) << 11)
585 | (MIN2(rgba
[i
][GCOMP
], 63) << 5)
586 | (MIN2(rgba
[i
][BCOMP
], 31) );
589 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
592 case GL_UNSIGNED_SHORT_5_6_5_REV
:
593 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
594 GLushort
*dst
= (GLushort
*) dstAddr
;
596 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) )
597 | (MIN2(rgba
[i
][GCOMP
], 63) << 5)
598 | (MIN2(rgba
[i
][BCOMP
], 31) << 11);
601 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
604 case GL_UNSIGNED_SHORT_4_4_4_4
:
605 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
606 GLushort
*dst
= (GLushort
*) dstAddr
;
608 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 15) << 12)
609 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
610 | (MIN2(rgba
[i
][BCOMP
], 15) << 4)
611 | (MIN2(rgba
[i
][ACOMP
], 15) );
614 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
615 GLushort
*dst
= (GLushort
*) dstAddr
;
617 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 15) << 12)
618 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
619 | (MIN2(rgba
[i
][RCOMP
], 15) << 4)
620 | (MIN2(rgba
[i
][ACOMP
], 15) );
623 else if (dstFormat
== GL_ABGR_EXT
) {
624 GLushort
*dst
= (GLushort
*) dstAddr
;
626 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 15) << 12)
627 | (MIN2(rgba
[i
][BCOMP
], 15) << 8)
628 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
629 | (MIN2(rgba
[i
][RCOMP
], 15) );
632 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
635 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
636 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
637 GLushort
*dst
= (GLushort
*) dstAddr
;
639 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 15) )
640 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
641 | (MIN2(rgba
[i
][BCOMP
], 15) << 8)
642 | (MIN2(rgba
[i
][ACOMP
], 15) << 12);
645 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
646 GLushort
*dst
= (GLushort
*) dstAddr
;
648 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 15) )
649 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
650 | (MIN2(rgba
[i
][RCOMP
], 15) << 8)
651 | (MIN2(rgba
[i
][ACOMP
], 15) << 12);
654 else if (dstFormat
== GL_ABGR_EXT
) {
655 GLushort
*dst
= (GLushort
*) dstAddr
;
657 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 15) )
658 | (MIN2(rgba
[i
][BCOMP
], 15) << 4)
659 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
660 | (MIN2(rgba
[i
][RCOMP
], 15) << 12);
663 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
666 case GL_UNSIGNED_SHORT_5_5_5_1
:
667 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
668 GLushort
*dst
= (GLushort
*) dstAddr
;
670 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) << 11)
671 | (MIN2(rgba
[i
][GCOMP
], 31) << 6)
672 | (MIN2(rgba
[i
][BCOMP
], 31) << 1)
673 | (MIN2(rgba
[i
][ACOMP
], 1) );
676 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
677 GLushort
*dst
= (GLushort
*) dstAddr
;
679 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 31) << 11)
680 | (MIN2(rgba
[i
][GCOMP
], 31) << 6)
681 | (MIN2(rgba
[i
][RCOMP
], 31) << 1)
682 | (MIN2(rgba
[i
][ACOMP
], 1) );
685 else if (dstFormat
== GL_ABGR_EXT
) {
686 GLushort
*dst
= (GLushort
*) dstAddr
;
688 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 31) << 11)
689 | (MIN2(rgba
[i
][BCOMP
], 31) << 6)
690 | (MIN2(rgba
[i
][GCOMP
], 31) << 1)
691 | (MIN2(rgba
[i
][RCOMP
], 1) );
694 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
697 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
698 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
699 GLushort
*dst
= (GLushort
*) dstAddr
;
701 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) )
702 | (MIN2(rgba
[i
][GCOMP
], 31) << 5)
703 | (MIN2(rgba
[i
][BCOMP
], 31) << 10)
704 | (MIN2(rgba
[i
][ACOMP
], 1) << 15);
707 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
708 GLushort
*dst
= (GLushort
*) dstAddr
;
710 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 31) )
711 | (MIN2(rgba
[i
][GCOMP
], 31) << 5)
712 | (MIN2(rgba
[i
][RCOMP
], 31) << 10)
713 | (MIN2(rgba
[i
][ACOMP
], 1) << 15);
716 else if (dstFormat
== GL_ABGR_EXT
) {
717 GLushort
*dst
= (GLushort
*) dstAddr
;
719 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 31) )
720 | (MIN2(rgba
[i
][BCOMP
], 31) << 5)
721 | (MIN2(rgba
[i
][GCOMP
], 31) << 10)
722 | (MIN2(rgba
[i
][RCOMP
], 1) << 15);
725 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
728 case GL_UNSIGNED_INT_8_8_8_8
:
729 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
730 GLuint
*dst
= (GLuint
*) dstAddr
;
732 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 255) << 24)
733 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
734 | (MIN2(rgba
[i
][BCOMP
], 255) << 8)
735 | (MIN2(rgba
[i
][ACOMP
], 255) );
738 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
739 GLuint
*dst
= (GLuint
*) dstAddr
;
741 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 255) << 24)
742 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
743 | (MIN2(rgba
[i
][RCOMP
], 255) << 8)
744 | (MIN2(rgba
[i
][ACOMP
], 255) );
747 else if (dstFormat
== GL_ABGR_EXT
) {
748 GLuint
*dst
= (GLuint
*) dstAddr
;
750 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 255) << 24)
751 | (MIN2(rgba
[i
][BCOMP
], 255) << 16)
752 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
753 | (MIN2(rgba
[i
][RCOMP
], 255) );
756 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
759 case GL_UNSIGNED_INT_8_8_8_8_REV
:
760 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
761 GLuint
*dst
= (GLuint
*) dstAddr
;
763 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 255) )
764 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
765 | (MIN2(rgba
[i
][BCOMP
], 255) << 16)
766 | (MIN2(rgba
[i
][ACOMP
], 255) << 24);
769 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
770 GLuint
*dst
= (GLuint
*) dstAddr
;
772 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 255) )
773 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
774 | (MIN2(rgba
[i
][RCOMP
], 255) << 16)
775 | (MIN2(rgba
[i
][ACOMP
], 255) << 24);
778 else if (dstFormat
== GL_ABGR_EXT
) {
779 GLuint
*dst
= (GLuint
*) dstAddr
;
781 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 255) )
782 | (MIN2(rgba
[i
][BCOMP
], 255) << 8)
783 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
784 | (MIN2(rgba
[i
][RCOMP
], 255) << 24);
787 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
790 case GL_UNSIGNED_INT_10_10_10_2
:
791 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
792 GLuint
*dst
= (GLuint
*) dstAddr
;
794 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 1023) << 22)
795 | (MIN2(rgba
[i
][GCOMP
], 1023) << 12)
796 | (MIN2(rgba
[i
][BCOMP
], 1023) << 2)
797 | (MIN2(rgba
[i
][ACOMP
], 3) );
800 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
801 GLuint
*dst
= (GLuint
*) dstAddr
;
803 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 1023) << 22)
804 | (MIN2(rgba
[i
][GCOMP
], 1023) << 12)
805 | (MIN2(rgba
[i
][RCOMP
], 1023) << 2)
806 | (MIN2(rgba
[i
][ACOMP
], 3) );
809 else if (dstFormat
== GL_ABGR_EXT
) {
810 GLuint
*dst
= (GLuint
*) dstAddr
;
812 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 1023) << 22)
813 | (MIN2(rgba
[i
][BCOMP
], 1023) << 12)
814 | (MIN2(rgba
[i
][GCOMP
], 1023) << 2)
815 | (MIN2(rgba
[i
][RCOMP
], 3) );
818 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
821 case GL_UNSIGNED_INT_2_10_10_10_REV
:
822 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
823 GLuint
*dst
= (GLuint
*) dstAddr
;
825 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 1023) )
826 | (MIN2(rgba
[i
][GCOMP
], 1023) << 10)
827 | (MIN2(rgba
[i
][BCOMP
], 1023) << 20)
828 | (MIN2(rgba
[i
][ACOMP
], 3) << 30);
831 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
832 GLuint
*dst
= (GLuint
*) dstAddr
;
834 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 1023) )
835 | (MIN2(rgba
[i
][GCOMP
], 1023) << 10)
836 | (MIN2(rgba
[i
][RCOMP
], 1023) << 20)
837 | (MIN2(rgba
[i
][ACOMP
], 3) << 30);
840 else if (dstFormat
== GL_ABGR_EXT
) {
841 GLuint
*dst
= (GLuint
*) dstAddr
;
843 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 1023) )
844 | (MIN2(rgba
[i
][BCOMP
], 1023) << 10)
845 | (MIN2(rgba
[i
][GCOMP
], 1023) << 20)
846 | (MIN2(rgba
[i
][RCOMP
], 3) << 30);
849 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
853 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
859 /* Customization of signed integer packing.
861 #define SRC_TYPE GLint
863 #define DST_TYPE GLuint
864 #define SRC_CONVERT(x) MAX2(x, 0)
865 #define FN_NAME pack_uint_from_int_rgba
866 #include "pack_tmp.h"
871 #define DST_TYPE GLushort
872 #define SRC_CONVERT(x) MAX2(x, 0)
873 #define FN_NAME pack_ushort_from_int_rgba
874 #include "pack_tmp.h"
879 #define DST_TYPE GLshort
880 #define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff)
881 #define FN_NAME pack_short_from_int_rgba
882 #include "pack_tmp.h"
887 #define DST_TYPE GLubyte
888 #define SRC_CONVERT(x) MAX2(x, 0)
889 #define FN_NAME pack_ubyte_from_int_rgba
890 #include "pack_tmp.h"
895 #define DST_TYPE GLbyte
896 #define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f)
897 #define FN_NAME pack_byte_from_int_rgba
898 #include "pack_tmp.h"
906 _pack_rgba_span_from_ints_problem(struct gl_context
*ctx
,
907 GLenum dstFormat
, GLenum dstType
)
910 "Unsupported type (%s) / format (%s) "
911 "in _mesa_pack_rgba_span_from_ints",
912 _mesa_lookup_enum_by_nr(dstType
),
913 _mesa_lookup_enum_by_nr(dstFormat
));
917 _mesa_pack_rgba_span_from_ints(struct gl_context
*ctx
, GLuint n
, GLint rgba
[][4],
918 GLenum dstFormat
, GLenum dstType
,
924 case GL_UNSIGNED_INT
:
925 pack_uint_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
928 /* No conversion necessary. */
929 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, (GLuint (*)[4]) rgba
, n
);
931 case GL_UNSIGNED_SHORT
:
932 pack_ushort_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
935 pack_short_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
937 case GL_UNSIGNED_BYTE
:
938 pack_ubyte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
941 pack_byte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
943 case GL_UNSIGNED_BYTE_3_3_2
:
944 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
945 GLubyte
*dst
= (GLubyte
*) dstAddr
;
947 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) << 5)
948 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 2)
949 | (CLAMP(rgba
[i
][BCOMP
], 0, 3) );
952 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
955 case GL_UNSIGNED_BYTE_2_3_3_REV
:
956 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
957 GLubyte
*dst
= (GLubyte
*) dstAddr
;
959 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) )
960 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 3)
961 | (CLAMP(rgba
[i
][BCOMP
], 0, 3) << 6);
964 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
967 case GL_UNSIGNED_SHORT_5_6_5
:
968 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
969 GLushort
*dst
= (GLushort
*) dstAddr
;
971 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
972 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
973 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) );
976 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
979 case GL_UNSIGNED_SHORT_5_6_5_REV
:
980 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
981 GLushort
*dst
= (GLushort
*) dstAddr
;
983 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
984 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
985 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 11);
988 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
991 case GL_UNSIGNED_SHORT_4_4_4_4
:
992 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
993 GLushort
*dst
= (GLushort
*) dstAddr
;
995 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 12)
996 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
997 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
998 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
1001 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1002 GLushort
*dst
= (GLushort
*) dstAddr
;
1004 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 12)
1005 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
1006 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 4)
1007 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
1010 else if (dstFormat
== GL_ABGR_EXT
) {
1011 GLushort
*dst
= (GLushort
*) dstAddr
;
1013 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12)
1014 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
1015 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1016 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) );
1019 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1022 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1023 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1024 GLushort
*dst
= (GLushort
*) dstAddr
;
1026 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) )
1027 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1028 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
1029 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
1032 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1033 GLushort
*dst
= (GLushort
*) dstAddr
;
1035 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) )
1036 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1037 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 8)
1038 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
1041 else if (dstFormat
== GL_ABGR_EXT
) {
1042 GLushort
*dst
= (GLushort
*) dstAddr
;
1044 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) )
1045 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
1046 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
1047 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 12);
1050 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1053 case GL_UNSIGNED_SHORT_5_5_5_1
:
1054 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1055 GLushort
*dst
= (GLushort
*) dstAddr
;
1057 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
1058 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
1059 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 1)
1060 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
1063 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1064 GLushort
*dst
= (GLushort
*) dstAddr
;
1066 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 11)
1067 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
1068 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 1)
1069 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
1072 else if (dstFormat
== GL_ABGR_EXT
) {
1073 GLushort
*dst
= (GLushort
*) dstAddr
;
1075 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) << 11)
1076 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 6)
1077 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 1)
1078 | (CLAMP(rgba
[i
][RCOMP
], 0, 1) );
1081 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1084 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1085 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1086 GLushort
*dst
= (GLushort
*) dstAddr
;
1088 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
1089 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
1090 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 10)
1091 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
1094 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1095 GLushort
*dst
= (GLushort
*) dstAddr
;
1097 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) )
1098 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
1099 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 10)
1100 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
1103 else if (dstFormat
== GL_ABGR_EXT
) {
1104 GLushort
*dst
= (GLushort
*) dstAddr
;
1106 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) )
1107 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 5)
1108 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 10)
1109 | (CLAMP(rgba
[i
][RCOMP
], 0, 1) << 15);
1112 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1115 case GL_UNSIGNED_INT_8_8_8_8
:
1116 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1117 GLuint
*dst
= (GLuint
*) dstAddr
;
1119 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 24)
1120 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1121 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
1122 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
1125 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1126 GLuint
*dst
= (GLuint
*) dstAddr
;
1128 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 24)
1129 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1130 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 8)
1131 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
1134 else if (dstFormat
== GL_ABGR_EXT
) {
1135 GLuint
*dst
= (GLuint
*) dstAddr
;
1137 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24)
1138 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
1139 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1140 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) );
1143 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1146 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1147 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1148 GLuint
*dst
= (GLuint
*) dstAddr
;
1150 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) )
1151 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1152 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
1153 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
1156 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1157 GLuint
*dst
= (GLuint
*) dstAddr
;
1159 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) )
1160 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1161 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 16)
1162 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
1165 else if (dstFormat
== GL_ABGR_EXT
) {
1166 GLuint
*dst
= (GLuint
*) dstAddr
;
1168 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) )
1169 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
1170 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1171 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 24);
1174 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1177 case GL_UNSIGNED_INT_10_10_10_2
:
1178 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1179 GLuint
*dst
= (GLuint
*) dstAddr
;
1181 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 22)
1182 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
1183 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 2)
1184 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
1187 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1188 GLuint
*dst
= (GLuint
*) dstAddr
;
1190 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 22)
1191 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
1192 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 2)
1193 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
1196 else if (dstFormat
== GL_ABGR_EXT
) {
1197 GLuint
*dst
= (GLuint
*) dstAddr
;
1199 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) << 22)
1200 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 12)
1201 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 2)
1202 | (CLAMP(rgba
[i
][RCOMP
], 0, 3) );
1205 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1208 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1209 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1210 GLuint
*dst
= (GLuint
*) dstAddr
;
1212 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) )
1213 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
1214 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 20)
1215 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
1218 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1219 GLuint
*dst
= (GLuint
*) dstAddr
;
1221 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) )
1222 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
1223 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 20)
1224 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
1227 else if (dstFormat
== GL_ABGR_EXT
) {
1228 GLuint
*dst
= (GLuint
*) dstAddr
;
1230 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) )
1231 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 10)
1232 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 20)
1233 | (CLAMP(rgba
[i
][RCOMP
], 0, 3) << 30);
1236 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1240 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1247 * Used to pack an array [][4] of RGBA float colors as specified
1248 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
1249 * Historically, the RGBA values were in [0,1] and rescaled to fit
1250 * into GLubytes, etc. But with new integer formats, the RGBA values
1251 * may have any value and we don't always rescale when converting to
1254 * Note: the rgba values will be modified by this function when any pixel
1255 * transfer ops are enabled.
1258 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
1259 GLenum dstFormat
, GLenum dstType
,
1261 const struct gl_pixelstore_attrib
*dstPacking
,
1262 GLbitfield transferOps
)
1265 const GLint comps
= _mesa_components_in_format(dstFormat
);
1266 const GLboolean intDstFormat
= _mesa_is_enum_format_integer(dstFormat
);
1269 if (dstFormat
== GL_LUMINANCE
||
1270 dstFormat
== GL_LUMINANCE_ALPHA
||
1271 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
1272 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
1273 luminance
= malloc(n
* sizeof(GLfloat
));
1275 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
1283 /* EXT_texture_integer specifies no transfer ops on integer
1284 * types in the resolved issues section. Just set them to 0
1285 * for integer surfaces.
1291 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
1295 * Component clamping (besides clamping to [0,1] in
1296 * _mesa_apply_rgba_transfer_ops()).
1299 /* clamping to dest type's min/max values */
1301 if (get_type_min_max(dstType
, &min
, &max
)) {
1302 for (i
= 0; i
< n
; i
++) {
1303 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
1304 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
1305 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
1306 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
1310 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
1311 /* compute luminance values */
1312 if (transferOps
& IMAGE_CLAMP_BIT
) {
1313 for (i
= 0; i
< n
; i
++) {
1314 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1315 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
1319 for (i
= 0; i
< n
; i
++) {
1320 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1326 * Pack/store the pixels. Ugh! Lots of cases!!!
1329 case GL_UNSIGNED_BYTE
:
1331 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1332 switch (dstFormat
) {
1335 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1339 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1343 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1347 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1351 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
1353 case GL_LUMINANCE_ALPHA
:
1355 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
1356 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1361 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1362 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1367 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1368 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1369 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1374 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1375 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1376 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1377 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1382 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1383 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1384 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1389 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1390 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1391 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1392 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1397 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1398 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1399 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1400 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1403 case GL_RED_INTEGER_EXT
:
1405 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
1408 case GL_GREEN_INTEGER_EXT
:
1410 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
1413 case GL_BLUE_INTEGER_EXT
:
1415 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
1418 case GL_ALPHA_INTEGER_EXT
:
1420 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
1425 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
1426 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
1429 case GL_RGB_INTEGER_EXT
:
1431 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
1432 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
1433 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
1436 case GL_RGBA_INTEGER_EXT
:
1438 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
1439 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
1440 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
1441 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
1444 case GL_BGR_INTEGER_EXT
:
1446 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
1447 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
1448 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
1451 case GL_BGRA_INTEGER_EXT
:
1453 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
1454 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
1455 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
1456 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
1459 case GL_LUMINANCE_INTEGER_EXT
:
1461 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
1464 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
1467 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1469 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
1477 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1478 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1482 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1488 GLbyte
*dst
= (GLbyte
*) dstAddr
;
1489 switch (dstFormat
) {
1492 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1496 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1500 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1504 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1508 dst
[i
] = FLOAT_TO_BYTE_TEX(luminance
[i
]);
1510 case GL_LUMINANCE_ALPHA
:
1512 dst
[i
*2+0] = FLOAT_TO_BYTE_TEX(luminance
[i
]);
1513 dst
[i
*2+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1518 dst
[i
*2+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1519 dst
[i
*2+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1524 dst
[i
*3+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1525 dst
[i
*3+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1526 dst
[i
*3+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1531 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1532 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1533 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1534 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1539 dst
[i
*3+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1540 dst
[i
*3+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1541 dst
[i
*3+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1546 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1547 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1548 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1549 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1554 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1555 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1556 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1557 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1560 case GL_RED_INTEGER_EXT
:
1562 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
1565 case GL_GREEN_INTEGER_EXT
:
1567 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
1570 case GL_BLUE_INTEGER_EXT
:
1572 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
1575 case GL_ALPHA_INTEGER_EXT
:
1577 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
1582 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
1583 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
1586 case GL_RGB_INTEGER_EXT
:
1588 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
1589 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
1590 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
1593 case GL_RGBA_INTEGER_EXT
:
1595 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
1596 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
1597 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
1598 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
1601 case GL_BGR_INTEGER_EXT
:
1603 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
1604 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
1605 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
1608 case GL_BGRA_INTEGER_EXT
:
1610 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
1611 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
1612 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
1613 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
1616 case GL_LUMINANCE_INTEGER_EXT
:
1618 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
1621 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
1624 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1626 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
1634 dst
[i
*2+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1635 dst
[i
*2+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1639 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1643 case GL_UNSIGNED_SHORT
:
1645 GLushort
*dst
= (GLushort
*) dstAddr
;
1646 switch (dstFormat
) {
1649 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
1653 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
1657 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
1661 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
1665 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
1667 case GL_LUMINANCE_ALPHA
:
1669 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
1670 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
1675 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
1676 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
1681 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
1682 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1683 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
1688 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
1689 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1690 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
1691 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1696 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
1697 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1698 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
1703 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1704 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1705 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1706 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1711 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1712 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1713 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1714 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1717 case GL_RED_INTEGER_EXT
:
1719 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1722 case GL_GREEN_INTEGER_EXT
:
1724 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1727 case GL_BLUE_INTEGER_EXT
:
1729 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1732 case GL_ALPHA_INTEGER_EXT
:
1734 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1739 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1740 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1743 case GL_RGB_INTEGER_EXT
:
1745 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1746 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1747 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1750 case GL_RGBA_INTEGER_EXT
:
1752 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1753 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1754 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1755 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1758 case GL_BGR_INTEGER_EXT
:
1760 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1761 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1762 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1765 case GL_BGRA_INTEGER_EXT
:
1767 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1768 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1769 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1770 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1773 case GL_LUMINANCE_INTEGER_EXT
:
1775 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1778 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1781 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1783 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1791 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1792 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1796 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1802 GLshort
*dst
= (GLshort
*) dstAddr
;
1803 switch (dstFormat
) {
1806 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1810 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1814 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1818 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1822 dst
[i
] = FLOAT_TO_SHORT_TEX(luminance
[i
]);
1824 case GL_LUMINANCE_ALPHA
:
1826 dst
[i
*2+0] = FLOAT_TO_SHORT_TEX(luminance
[i
]);
1827 dst
[i
*2+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1832 dst
[i
*2+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1833 dst
[i
*2+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1838 dst
[i
*3+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1839 dst
[i
*3+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1840 dst
[i
*3+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1845 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1846 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1847 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1848 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1853 dst
[i
*3+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1854 dst
[i
*3+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1855 dst
[i
*3+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1860 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1861 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1862 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1863 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1868 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1869 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1870 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1871 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1874 case GL_RED_INTEGER_EXT
:
1876 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1879 case GL_GREEN_INTEGER_EXT
:
1881 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1884 case GL_BLUE_INTEGER_EXT
:
1886 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1889 case GL_ALPHA_INTEGER_EXT
:
1891 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1896 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1897 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1900 case GL_RGB_INTEGER_EXT
:
1902 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1903 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1904 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1907 case GL_RGBA_INTEGER_EXT
:
1909 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1910 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1911 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1912 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1915 case GL_BGR_INTEGER_EXT
:
1917 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1918 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1919 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1922 case GL_BGRA_INTEGER_EXT
:
1924 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1925 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1926 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1927 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1930 case GL_LUMINANCE_INTEGER_EXT
:
1932 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1935 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1938 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1940 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1948 dst
[i
*2+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1949 dst
[i
*2+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1953 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1957 case GL_UNSIGNED_INT
:
1959 GLuint
*dst
= (GLuint
*) dstAddr
;
1960 switch (dstFormat
) {
1963 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1967 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1971 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1975 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1979 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1981 case GL_LUMINANCE_ALPHA
:
1983 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1984 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1989 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1990 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1995 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1996 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1997 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2002 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2003 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2004 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2005 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2010 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2011 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2012 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2017 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2018 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2019 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2020 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2025 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
2026 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
2027 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2028 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2031 case GL_RED_INTEGER_EXT
:
2033 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
2036 case GL_GREEN_INTEGER_EXT
:
2038 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
2041 case GL_BLUE_INTEGER_EXT
:
2043 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
2046 case GL_ALPHA_INTEGER_EXT
:
2048 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
2053 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
2054 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
2057 case GL_RGB_INTEGER_EXT
:
2059 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
2060 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
2061 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
2064 case GL_RGBA_INTEGER_EXT
:
2066 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
2067 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
2068 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
2069 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
2072 case GL_BGR_INTEGER_EXT
:
2074 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
2075 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
2076 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
2079 case GL_BGRA_INTEGER_EXT
:
2081 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
2082 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
2083 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
2084 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
2087 case GL_LUMINANCE_INTEGER_EXT
:
2089 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
2092 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
2095 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2097 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
2105 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
2106 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
2110 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2116 GLint
*dst
= (GLint
*) dstAddr
;
2117 switch (dstFormat
) {
2120 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2124 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2128 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2132 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2136 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2138 case GL_LUMINANCE_ALPHA
:
2140 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2141 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2146 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2147 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2152 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2153 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2154 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2159 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2160 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2161 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2162 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2167 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2168 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2169 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2174 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2175 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2176 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2177 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2182 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2183 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2184 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2185 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2191 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2192 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2195 case GL_RED_INTEGER_EXT
:
2197 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
2200 case GL_GREEN_INTEGER_EXT
:
2202 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
2205 case GL_BLUE_INTEGER_EXT
:
2207 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
2210 case GL_ALPHA_INTEGER_EXT
:
2212 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
2217 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
2218 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
2221 case GL_RGB_INTEGER_EXT
:
2223 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
2224 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
2225 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
2228 case GL_RGBA_INTEGER_EXT
:
2230 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
2231 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
2232 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
2233 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
2236 case GL_BGR_INTEGER_EXT
:
2238 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
2239 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
2240 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
2243 case GL_BGRA_INTEGER_EXT
:
2245 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
2246 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
2247 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
2248 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
2251 case GL_LUMINANCE_INTEGER_EXT
:
2253 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
2256 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
2259 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2261 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
2267 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2273 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2274 switch (dstFormat
) {
2277 dst
[i
] = rgba
[i
][RCOMP
];
2281 dst
[i
] = rgba
[i
][GCOMP
];
2285 dst
[i
] = rgba
[i
][BCOMP
];
2289 dst
[i
] = rgba
[i
][ACOMP
];
2293 dst
[i
] = luminance
[i
];
2295 case GL_LUMINANCE_ALPHA
:
2297 dst
[i
*2+0] = luminance
[i
];
2298 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2303 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2304 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2309 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2310 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2311 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2316 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2317 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2318 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2319 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2324 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2325 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2326 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2331 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2332 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2333 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2334 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2339 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2340 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2341 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2342 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2348 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2349 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2353 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2357 case GL_HALF_FLOAT_ARB
:
2359 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2360 switch (dstFormat
) {
2363 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2367 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2371 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2375 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2379 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2381 case GL_LUMINANCE_ALPHA
:
2383 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2384 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2389 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2390 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2395 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2396 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2397 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2402 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2403 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2404 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2405 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2410 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2411 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2412 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2417 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2418 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2419 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2420 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2425 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2426 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2427 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2428 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2434 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2435 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2439 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2443 case GL_UNSIGNED_BYTE_3_3_2
:
2444 if (dstFormat
== GL_RGB
) {
2445 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2447 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2448 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2449 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
2453 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2454 if (dstFormat
== GL_RGB
) {
2455 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2457 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
2458 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2459 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2463 case GL_UNSIGNED_SHORT_5_6_5
:
2464 if (dstFormat
== GL_RGB
) {
2465 GLushort
*dst
= (GLushort
*) dstAddr
;
2467 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2468 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2469 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
2473 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2474 if (dstFormat
== GL_RGB
) {
2475 GLushort
*dst
= (GLushort
*) dstAddr
;
2477 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
2478 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2479 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2483 case GL_UNSIGNED_SHORT_4_4_4_4
:
2484 if (dstFormat
== GL_RGBA
) {
2485 GLushort
*dst
= (GLushort
*) dstAddr
;
2487 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2488 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2489 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2490 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
2493 else if (dstFormat
== GL_BGRA
) {
2494 GLushort
*dst
= (GLushort
*) dstAddr
;
2496 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2497 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2498 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2499 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
2502 else if (dstFormat
== GL_ABGR_EXT
) {
2503 GLushort
*dst
= (GLushort
*) dstAddr
;
2505 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2506 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2507 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2508 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
2512 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2513 if (dstFormat
== GL_RGBA
) {
2514 GLushort
*dst
= (GLushort
*) dstAddr
;
2516 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
2517 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2518 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2519 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2522 else if (dstFormat
== GL_BGRA
) {
2523 GLushort
*dst
= (GLushort
*) dstAddr
;
2525 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
2526 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2527 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2528 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2531 else if (dstFormat
== GL_ABGR_EXT
) {
2532 GLushort
*dst
= (GLushort
*) dstAddr
;
2534 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
2535 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2536 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2537 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2541 case GL_UNSIGNED_SHORT_5_5_5_1
:
2542 if (dstFormat
== GL_RGBA
) {
2543 GLushort
*dst
= (GLushort
*) dstAddr
;
2545 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2546 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2547 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2548 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
2551 else if (dstFormat
== GL_BGRA
) {
2552 GLushort
*dst
= (GLushort
*) dstAddr
;
2554 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2555 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2556 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2557 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
2560 else if (dstFormat
== GL_ABGR_EXT
) {
2561 GLushort
*dst
= (GLushort
*) dstAddr
;
2563 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2564 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2565 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2566 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
2570 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2571 if (dstFormat
== GL_RGBA
) {
2572 GLushort
*dst
= (GLushort
*) dstAddr
;
2574 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
2575 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2576 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2577 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2580 else if (dstFormat
== GL_BGRA
) {
2581 GLushort
*dst
= (GLushort
*) dstAddr
;
2583 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
2584 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2585 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2586 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2589 else if (dstFormat
== GL_ABGR_EXT
) {
2590 GLushort
*dst
= (GLushort
*) dstAddr
;
2592 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
2593 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2594 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2595 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2599 case GL_UNSIGNED_INT_8_8_8_8
:
2600 if (dstFormat
== GL_RGBA
) {
2601 GLuint
*dst
= (GLuint
*) dstAddr
;
2603 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
2604 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
2605 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
2606 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2609 else if (dstFormat
== GL_BGRA
) {
2610 GLuint
*dst
= (GLuint
*) dstAddr
;
2612 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
2613 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
2614 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
2615 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2618 else if (dstFormat
== GL_ABGR_EXT
) {
2619 GLuint
*dst
= (GLuint
*) dstAddr
;
2621 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
2622 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
2623 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
2624 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
2628 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2629 if (dstFormat
== GL_RGBA
) {
2630 GLuint
*dst
= (GLuint
*) dstAddr
;
2632 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
2633 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2634 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2635 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2638 else if (dstFormat
== GL_BGRA
) {
2639 GLuint
*dst
= (GLuint
*) dstAddr
;
2641 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
2642 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2643 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2644 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2647 else if (dstFormat
== GL_ABGR_EXT
) {
2648 GLuint
*dst
= (GLuint
*) dstAddr
;
2650 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
2651 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2652 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2653 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2657 case GL_UNSIGNED_INT_10_10_10_2
:
2658 if (dstFormat
== GL_RGBA
) {
2659 GLuint
*dst
= (GLuint
*) dstAddr
;
2661 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2662 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2663 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2664 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2667 else if (dstFormat
== GL_BGRA
) {
2668 GLuint
*dst
= (GLuint
*) dstAddr
;
2670 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2671 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2672 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2673 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2676 else if (dstFormat
== GL_ABGR_EXT
) {
2677 GLuint
*dst
= (GLuint
*) dstAddr
;
2679 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
2680 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
2681 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
2682 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
2686 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2687 if (dstFormat
== GL_RGBA
) {
2688 GLuint
*dst
= (GLuint
*) dstAddr
;
2690 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
2691 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2692 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
2693 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2696 else if (dstFormat
== GL_BGRA
) {
2697 GLuint
*dst
= (GLuint
*) dstAddr
;
2699 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
2700 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2701 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2702 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2705 else if (dstFormat
== GL_ABGR_EXT
) {
2706 GLuint
*dst
= (GLuint
*) dstAddr
;
2708 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2709 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2710 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2711 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2715 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2717 GLuint
*dst
= (GLuint
*) dstAddr
;
2718 for (i
= 0; i
< n
; i
++) {
2719 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2723 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2725 GLuint
*dst
= (GLuint
*) dstAddr
;
2726 for (i
= 0; i
< n
; i
++) {
2727 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2732 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2737 if (dstPacking
->SwapBytes
) {
2738 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2739 if (swapSize
== 2) {
2740 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2742 else if (swapSize
== 4) {
2743 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2752 #define SWAP2BYTE(VALUE) \
2754 GLubyte *bytes = (GLubyte *) &(VALUE); \
2755 GLubyte tmp = bytes[0]; \
2756 bytes[0] = bytes[1]; \
2760 #define SWAP4BYTE(VALUE) \
2762 GLubyte *bytes = (GLubyte *) &(VALUE); \
2763 GLubyte tmp = bytes[0]; \
2764 bytes[0] = bytes[3]; \
2767 bytes[1] = bytes[2]; \
2773 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2774 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2775 const struct gl_pixelstore_attrib
*unpack
)
2777 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2779 ASSERT(srcType
== GL_BITMAP
||
2780 srcType
== GL_UNSIGNED_BYTE
||
2781 srcType
== GL_BYTE
||
2782 srcType
== GL_UNSIGNED_SHORT
||
2783 srcType
== GL_SHORT
||
2784 srcType
== GL_UNSIGNED_INT
||
2785 srcType
== GL_INT
||
2786 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2787 srcType
== GL_HALF_FLOAT_ARB
||
2788 srcType
== GL_FLOAT
||
2789 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2794 GLubyte
*ubsrc
= (GLubyte
*) src
;
2795 if (unpack
->LsbFirst
) {
2796 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2798 for (i
= 0; i
< n
; i
++) {
2799 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2810 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2812 for (i
= 0; i
< n
; i
++) {
2813 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2825 case GL_UNSIGNED_BYTE
:
2828 const GLubyte
*s
= (const GLubyte
*) src
;
2829 for (i
= 0; i
< n
; i
++)
2836 const GLbyte
*s
= (const GLbyte
*) src
;
2837 for (i
= 0; i
< n
; i
++)
2841 case GL_UNSIGNED_SHORT
:
2844 const GLushort
*s
= (const GLushort
*) src
;
2845 if (unpack
->SwapBytes
) {
2846 for (i
= 0; i
< n
; i
++) {
2847 GLushort value
= s
[i
];
2853 for (i
= 0; i
< n
; i
++)
2861 const GLshort
*s
= (const GLshort
*) src
;
2862 if (unpack
->SwapBytes
) {
2863 for (i
= 0; i
< n
; i
++) {
2864 GLshort value
= s
[i
];
2870 for (i
= 0; i
< n
; i
++)
2875 case GL_UNSIGNED_INT
:
2878 const GLuint
*s
= (const GLuint
*) src
;
2879 if (unpack
->SwapBytes
) {
2880 for (i
= 0; i
< n
; i
++) {
2881 GLuint value
= s
[i
];
2887 for (i
= 0; i
< n
; i
++)
2895 const GLint
*s
= (const GLint
*) src
;
2896 if (unpack
->SwapBytes
) {
2897 for (i
= 0; i
< n
; i
++) {
2904 for (i
= 0; i
< n
; i
++)
2912 const GLfloat
*s
= (const GLfloat
*) src
;
2913 if (unpack
->SwapBytes
) {
2914 for (i
= 0; i
< n
; i
++) {
2915 GLfloat value
= s
[i
];
2917 indexes
[i
] = (GLuint
) value
;
2921 for (i
= 0; i
< n
; i
++)
2922 indexes
[i
] = (GLuint
) s
[i
];
2926 case GL_HALF_FLOAT_ARB
:
2929 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2930 if (unpack
->SwapBytes
) {
2931 for (i
= 0; i
< n
; i
++) {
2932 GLhalfARB value
= s
[i
];
2934 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2938 for (i
= 0; i
< n
; i
++)
2939 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2943 case GL_UNSIGNED_INT_24_8_EXT
:
2946 const GLuint
*s
= (const GLuint
*) src
;
2947 if (unpack
->SwapBytes
) {
2948 for (i
= 0; i
< n
; i
++) {
2949 GLuint value
= s
[i
];
2951 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2955 for (i
= 0; i
< n
; i
++)
2956 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2960 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2963 const GLuint
*s
= (const GLuint
*) src
;
2964 if (unpack
->SwapBytes
) {
2965 for (i
= 0; i
< n
; i
++) {
2966 GLuint value
= s
[i
*2+1];
2968 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2972 for (i
= 0; i
< n
; i
++)
2973 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2979 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2986 * Return source/dest RGBA indexes for unpacking pixels.
2989 get_component_mapping(GLenum format
,
3001 case GL_RED_INTEGER_EXT
:
3003 *gSrc
= *bSrc
= *aSrc
= -1;
3006 case GL_GREEN_INTEGER_EXT
:
3008 *rSrc
= *bSrc
= *aSrc
= -1;
3011 case GL_BLUE_INTEGER_EXT
:
3013 *rSrc
= *gSrc
= *aSrc
= -1;
3016 case GL_ALPHA_INTEGER_EXT
:
3017 *rSrc
= *gSrc
= *bSrc
= -1;
3021 case GL_LUMINANCE_INTEGER_EXT
:
3022 *rSrc
= *gSrc
= *bSrc
= 0;
3025 case GL_LUMINANCE_ALPHA
:
3026 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
3027 *rSrc
= *gSrc
= *bSrc
= 0;
3031 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
3045 case GL_RGB_INTEGER
:
3056 case GL_BGR_INTEGER
:
3067 case GL_RGBA_INTEGER
:
3078 case GL_BGRA_INTEGER
:
3106 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
3107 _mesa_lookup_enum_by_nr(format
));
3115 * This function extracts floating point RGBA values from arbitrary
3116 * image data. srcFormat and srcType are the format and type parameters
3117 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3119 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3120 * implements the "Conversion to floating point", "Conversion to RGB",
3121 * and "Final Expansion to RGBA" operations.
3123 * Args: n - number of pixels
3124 * rgba - output colors
3125 * srcFormat - format of incoming data
3126 * srcType - data type of incoming data
3127 * src - source data pointer
3128 * swapBytes - perform byteswapping of incoming data?
3131 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3132 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3133 GLboolean swapBytes
)
3135 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3137 GLint rDst
, bDst
, gDst
, aDst
;
3138 GLboolean intFormat
;
3139 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3141 ASSERT(srcFormat
== GL_RED
||
3142 srcFormat
== GL_GREEN
||
3143 srcFormat
== GL_BLUE
||
3144 srcFormat
== GL_ALPHA
||
3145 srcFormat
== GL_LUMINANCE
||
3146 srcFormat
== GL_LUMINANCE_ALPHA
||
3147 srcFormat
== GL_INTENSITY
||
3148 srcFormat
== GL_RG
||
3149 srcFormat
== GL_RGB
||
3150 srcFormat
== GL_BGR
||
3151 srcFormat
== GL_RGBA
||
3152 srcFormat
== GL_BGRA
||
3153 srcFormat
== GL_ABGR_EXT
||
3154 srcFormat
== GL_DU8DV8_ATI
||
3155 srcFormat
== GL_DUDV_ATI
||
3156 srcFormat
== GL_RED_INTEGER_EXT
||
3157 srcFormat
== GL_GREEN_INTEGER_EXT
||
3158 srcFormat
== GL_BLUE_INTEGER_EXT
||
3159 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3160 srcFormat
== GL_RG_INTEGER
||
3161 srcFormat
== GL_RGB_INTEGER_EXT
||
3162 srcFormat
== GL_RGBA_INTEGER_EXT
||
3163 srcFormat
== GL_BGR_INTEGER_EXT
||
3164 srcFormat
== GL_BGRA_INTEGER_EXT
||
3165 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3166 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3168 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3169 srcType
== GL_BYTE
||
3170 srcType
== GL_UNSIGNED_SHORT
||
3171 srcType
== GL_SHORT
||
3172 srcType
== GL_UNSIGNED_INT
||
3173 srcType
== GL_INT
||
3174 srcType
== GL_HALF_FLOAT_ARB
||
3175 srcType
== GL_FLOAT
||
3176 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3177 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3178 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3179 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3180 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3181 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3182 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3183 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3184 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3185 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3186 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3187 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3188 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3189 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3191 get_component_mapping(srcFormat
,
3192 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3193 &rDst
, &gDst
, &bDst
, &aDst
);
3195 stride
= _mesa_components_in_format(srcFormat
);
3197 intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3199 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
3200 if ((SRC_INDEX) < 0) { \
3203 for (i = 0; i < n; i++) { \
3204 rgba[i][DST_INDEX] = DEFAULT_INT; \
3208 for (i = 0; i < n; i++) { \
3209 rgba[i][DST_INDEX] = DEFAULT_FLT; \
3213 else if (swapBytes) { \
3214 const TYPE *s = (const TYPE *) src; \
3216 for (i = 0; i < n; i++) { \
3217 TYPE value = s[SRC_INDEX]; \
3218 if (sizeof(TYPE) == 2) { \
3221 else if (sizeof(TYPE) == 4) { \
3225 rgba[i][DST_INDEX] = (GLfloat) value; \
3227 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
3232 const TYPE *s = (const TYPE *) src; \
3235 for (i = 0; i < n; i++) { \
3236 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
3241 for (i = 0; i < n; i++) { \
3242 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
3249 case GL_UNSIGNED_BYTE
:
3250 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3251 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3252 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3253 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3256 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
3257 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
3258 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
3259 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
3261 case GL_UNSIGNED_SHORT
:
3262 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3263 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3264 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3265 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3268 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
3269 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
3270 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
3271 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
3273 case GL_UNSIGNED_INT
:
3274 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3275 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3276 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3277 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3280 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3281 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3282 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3283 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3286 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3287 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3288 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3289 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3291 case GL_HALF_FLOAT_ARB
:
3292 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3293 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3294 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3295 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3297 case GL_UNSIGNED_BYTE_3_3_2
:
3299 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3306 for (i
= 0; i
< n
; i
++) {
3307 GLubyte p
= ubsrc
[i
];
3308 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
3309 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
3310 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
3311 rgba
[i
][aDst
] = 1.0F
;
3315 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3317 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3324 for (i
= 0; i
< n
; i
++) {
3325 GLubyte p
= ubsrc
[i
];
3326 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
3327 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
3328 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
3329 rgba
[i
][aDst
] = 1.0F
;
3333 case GL_UNSIGNED_SHORT_5_6_5
:
3340 const GLushort
*ussrc
= (const GLushort
*) src
;
3342 for (i
= 0; i
< n
; i
++) {
3343 GLushort p
= ussrc
[i
];
3345 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3346 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3347 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
3348 rgba
[i
][aDst
] = 1.0F
;
3352 const GLushort
*ussrc
= (const GLushort
*) src
;
3354 for (i
= 0; i
< n
; i
++) {
3355 GLushort p
= ussrc
[i
];
3356 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3357 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3358 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
3359 rgba
[i
][aDst
] = 1.0F
;
3363 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3370 const GLushort
*ussrc
= (const GLushort
*) src
;
3372 for (i
= 0; i
< n
; i
++) {
3373 GLushort p
= ussrc
[i
];
3375 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3376 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3377 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
3378 rgba
[i
][aDst
] = 1.0F
;
3382 const GLushort
*ussrc
= (const GLushort
*) src
;
3384 for (i
= 0; i
< n
; i
++) {
3385 GLushort p
= ussrc
[i
];
3386 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3387 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3388 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
3389 rgba
[i
][aDst
] = 1.0F
;
3393 case GL_UNSIGNED_SHORT_4_4_4_4
:
3395 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3398 const GLushort
*ussrc
= (const GLushort
*) src
;
3400 for (i
= 0; i
< n
; i
++) {
3401 GLushort p
= ussrc
[i
];
3403 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
3404 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
3405 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
3406 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
3410 const GLushort
*ussrc
= (const GLushort
*) src
;
3412 for (i
= 0; i
< n
; i
++) {
3413 GLushort p
= ussrc
[i
];
3414 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
3415 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
3416 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
3417 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
3421 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3423 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3426 const GLushort
*ussrc
= (const GLushort
*) src
;
3428 for (i
= 0; i
< n
; i
++) {
3429 GLushort p
= ussrc
[i
];
3431 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
3432 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
3433 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
3434 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
3438 const GLushort
*ussrc
= (const GLushort
*) src
;
3440 for (i
= 0; i
< n
; i
++) {
3441 GLushort p
= ussrc
[i
];
3442 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
3443 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
3444 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
3445 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
3449 case GL_UNSIGNED_SHORT_5_5_5_1
:
3451 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3454 const GLushort
*ussrc
= (const GLushort
*) src
;
3456 for (i
= 0; i
< n
; i
++) {
3457 GLushort p
= ussrc
[i
];
3459 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3460 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
3461 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
3462 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
3466 const GLushort
*ussrc
= (const GLushort
*) src
;
3468 for (i
= 0; i
< n
; i
++) {
3469 GLushort p
= ussrc
[i
];
3470 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3471 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
3472 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
3473 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
3477 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3479 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3482 const GLushort
*ussrc
= (const GLushort
*) src
;
3484 for (i
= 0; i
< n
; i
++) {
3485 GLushort p
= ussrc
[i
];
3487 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3488 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
3489 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
3490 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
3494 const GLushort
*ussrc
= (const GLushort
*) src
;
3496 for (i
= 0; i
< n
; i
++) {
3497 GLushort p
= ussrc
[i
];
3498 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3499 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
3500 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
3501 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
3505 case GL_UNSIGNED_INT_8_8_8_8
:
3507 const GLuint
*uisrc
= (const GLuint
*) src
;
3510 for (i
= 0; i
< n
; i
++) {
3511 GLuint p
= uisrc
[i
];
3512 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
3513 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3514 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3515 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
3519 for (i
= 0; i
< n
; i
++) {
3520 GLuint p
= uisrc
[i
];
3521 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3522 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3523 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3524 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3529 const GLuint
*uisrc
= (const GLuint
*) src
;
3532 for (i
= 0; i
< n
; i
++) {
3533 GLuint p
= uisrc
[i
];
3534 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
3535 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3536 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3537 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
3541 for (i
= 0; i
< n
; i
++) {
3542 GLuint p
= uisrc
[i
];
3543 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3544 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3545 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3546 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3551 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3553 const GLuint
*uisrc
= (const GLuint
*) src
;
3556 for (i
= 0; i
< n
; i
++) {
3557 GLuint p
= uisrc
[i
];
3558 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
3559 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3560 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3561 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
3565 for (i
= 0; i
< n
; i
++) {
3566 GLuint p
= uisrc
[i
];
3567 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3568 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3569 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3570 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3575 const GLuint
*uisrc
= (const GLuint
*) src
;
3578 for (i
= 0; i
< n
; i
++) {
3579 GLuint p
= uisrc
[i
];
3580 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
3581 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3582 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3583 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
3587 for (i
= 0; i
< n
; i
++) {
3588 GLuint p
= uisrc
[i
];
3589 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3590 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3591 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3592 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3597 case GL_UNSIGNED_INT_10_10_10_2
:
3599 rs
= 1.0F
/ 1023.0F
;
3600 gs
= 1.0F
/ 1023.0F
;
3601 bs
= 1.0F
/ 1023.0F
;
3605 const GLuint
*uisrc
= (const GLuint
*) src
;
3607 for (i
= 0; i
< n
; i
++) {
3608 GLuint p
= uisrc
[i
];
3610 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3611 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3612 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3613 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3617 const GLuint
*uisrc
= (const GLuint
*) src
;
3619 for (i
= 0; i
< n
; i
++) {
3620 GLuint p
= uisrc
[i
];
3621 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3622 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3623 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3624 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3628 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3630 rs
= 1.0F
/ 1023.0F
;
3631 gs
= 1.0F
/ 1023.0F
;
3632 bs
= 1.0F
/ 1023.0F
;
3636 const GLuint
*uisrc
= (const GLuint
*) src
;
3638 for (i
= 0; i
< n
; i
++) {
3639 GLuint p
= uisrc
[i
];
3641 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3642 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3643 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3645 rgba
[i
][aDst
] = 1.0F
;
3647 rgba
[i
][aDst
] = (p
>> 30) * as
;
3652 const GLuint
*uisrc
= (const GLuint
*) src
;
3654 for (i
= 0; i
< n
; i
++) {
3655 GLuint p
= uisrc
[i
];
3656 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3657 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3658 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3660 rgba
[i
][aDst
] = 1.0F
;
3662 rgba
[i
][aDst
] = (p
>> 30) * as
;
3667 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3669 const GLuint
*uisrc
= (const GLuint
*) src
;
3672 for (i
= 0; i
< n
; i
++) {
3673 GLuint p
= uisrc
[i
];
3675 rgb9e5_to_float3(p
, f
);
3676 rgba
[i
][rDst
] = f
[0];
3677 rgba
[i
][gDst
] = f
[1];
3678 rgba
[i
][bDst
] = f
[2];
3679 rgba
[i
][aDst
] = 1.0F
;
3683 const GLuint
*uisrc
= (const GLuint
*) src
;
3686 for (i
= 0; i
< n
; i
++) {
3687 rgb9e5_to_float3(uisrc
[i
], f
);
3688 rgba
[i
][rDst
] = f
[0];
3689 rgba
[i
][gDst
] = f
[1];
3690 rgba
[i
][bDst
] = f
[2];
3691 rgba
[i
][aDst
] = 1.0F
;
3695 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3697 const GLuint
*uisrc
= (const GLuint
*) src
;
3700 for (i
= 0; i
< n
; i
++) {
3701 GLuint p
= uisrc
[i
];
3703 r11g11b10f_to_float3(p
, f
);
3704 rgba
[i
][rDst
] = f
[0];
3705 rgba
[i
][gDst
] = f
[1];
3706 rgba
[i
][bDst
] = f
[2];
3707 rgba
[i
][aDst
] = 1.0F
;
3711 const GLuint
*uisrc
= (const GLuint
*) src
;
3714 for (i
= 0; i
< n
; i
++) {
3715 r11g11b10f_to_float3(uisrc
[i
], f
);
3716 rgba
[i
][rDst
] = f
[0];
3717 rgba
[i
][gDst
] = f
[1];
3718 rgba
[i
][bDst
] = f
[2];
3719 rgba
[i
][aDst
] = 1.0F
;
3724 _mesa_problem(NULL
, "bad srcType in extract float data");
3731 static inline GLuint
3732 clamp_float_to_uint(GLfloat f
)
3734 return f
< 0.0F
? 0 : F_TO_I(f
);
3738 static inline GLuint
3739 clamp_half_to_uint(GLhalfARB h
)
3741 GLfloat f
= _mesa_half_to_float(h
);
3742 return f
< 0.0F
? 0 : F_TO_I(f
);
3747 * \sa extract_float_rgba()
3750 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3751 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3752 GLboolean swapBytes
)
3754 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3756 GLint rDst
, bDst
, gDst
, aDst
;
3758 ASSERT(srcFormat
== GL_RED
||
3759 srcFormat
== GL_GREEN
||
3760 srcFormat
== GL_BLUE
||
3761 srcFormat
== GL_ALPHA
||
3762 srcFormat
== GL_LUMINANCE
||
3763 srcFormat
== GL_LUMINANCE_ALPHA
||
3764 srcFormat
== GL_INTENSITY
||
3765 srcFormat
== GL_RG
||
3766 srcFormat
== GL_RGB
||
3767 srcFormat
== GL_BGR
||
3768 srcFormat
== GL_RGBA
||
3769 srcFormat
== GL_BGRA
||
3770 srcFormat
== GL_ABGR_EXT
||
3771 srcFormat
== GL_DU8DV8_ATI
||
3772 srcFormat
== GL_DUDV_ATI
||
3773 srcFormat
== GL_RED_INTEGER_EXT
||
3774 srcFormat
== GL_RG_INTEGER
||
3775 srcFormat
== GL_GREEN_INTEGER_EXT
||
3776 srcFormat
== GL_BLUE_INTEGER_EXT
||
3777 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3778 srcFormat
== GL_RGB_INTEGER_EXT
||
3779 srcFormat
== GL_RGBA_INTEGER_EXT
||
3780 srcFormat
== GL_BGR_INTEGER_EXT
||
3781 srcFormat
== GL_BGRA_INTEGER_EXT
||
3782 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3783 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3785 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3786 srcType
== GL_BYTE
||
3787 srcType
== GL_UNSIGNED_SHORT
||
3788 srcType
== GL_SHORT
||
3789 srcType
== GL_UNSIGNED_INT
||
3790 srcType
== GL_INT
||
3791 srcType
== GL_HALF_FLOAT_ARB
||
3792 srcType
== GL_FLOAT
||
3793 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3794 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3795 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3796 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3797 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3798 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3799 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3800 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3801 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3802 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3803 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3804 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3805 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3806 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3808 get_component_mapping(srcFormat
,
3809 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3810 &rDst
, &gDst
, &bDst
, &aDst
);
3812 stride
= _mesa_components_in_format(srcFormat
);
3814 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3815 if ((SRC_INDEX) < 0) { \
3817 for (i = 0; i < n; i++) { \
3818 rgba[i][DST_INDEX] = DEFAULT; \
3821 else if (swapBytes) { \
3822 const TYPE *s = (const TYPE *) src; \
3824 for (i = 0; i < n; i++) { \
3825 TYPE value = s[SRC_INDEX]; \
3826 if (sizeof(TYPE) == 2) { \
3829 else if (sizeof(TYPE) == 4) { \
3832 rgba[i][DST_INDEX] = CONVERSION(value); \
3837 const TYPE *s = (const TYPE *) src; \
3839 for (i = 0; i < n; i++) { \
3840 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3846 case GL_UNSIGNED_BYTE
:
3847 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3848 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3849 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3850 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3853 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3854 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3855 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3856 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3858 case GL_UNSIGNED_SHORT
:
3859 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3860 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3861 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3862 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3865 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3866 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3867 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3868 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3870 case GL_UNSIGNED_INT
:
3871 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3872 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3873 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3874 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3877 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3878 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3879 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3880 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3883 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3884 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3885 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3886 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3888 case GL_HALF_FLOAT_ARB
:
3889 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3890 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3891 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3892 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3894 case GL_UNSIGNED_BYTE_3_3_2
:
3896 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3898 for (i
= 0; i
< n
; i
++) {
3899 GLubyte p
= ubsrc
[i
];
3900 rgba
[i
][rDst
] = ((p
>> 5) );
3901 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3902 rgba
[i
][bDst
] = ((p
) & 0x3);
3907 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3909 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3911 for (i
= 0; i
< n
; i
++) {
3912 GLubyte p
= ubsrc
[i
];
3913 rgba
[i
][rDst
] = ((p
) & 0x7);
3914 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3915 rgba
[i
][bDst
] = ((p
>> 6) );
3920 case GL_UNSIGNED_SHORT_5_6_5
:
3922 const GLushort
*ussrc
= (const GLushort
*) src
;
3924 for (i
= 0; i
< n
; i
++) {
3925 GLushort p
= ussrc
[i
];
3927 rgba
[i
][rDst
] = ((p
>> 11) );
3928 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3929 rgba
[i
][bDst
] = ((p
) & 0x1f);
3934 const GLushort
*ussrc
= (const GLushort
*) src
;
3936 for (i
= 0; i
< n
; i
++) {
3937 GLushort p
= ussrc
[i
];
3938 rgba
[i
][rDst
] = ((p
>> 11) );
3939 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3940 rgba
[i
][bDst
] = ((p
) & 0x1f);
3945 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3947 const GLushort
*ussrc
= (const GLushort
*) src
;
3949 for (i
= 0; i
< n
; i
++) {
3950 GLushort p
= ussrc
[i
];
3952 rgba
[i
][rDst
] = ((p
) & 0x1f);
3953 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3954 rgba
[i
][bDst
] = ((p
>> 11) );
3959 const GLushort
*ussrc
= (const GLushort
*) src
;
3961 for (i
= 0; i
< n
; i
++) {
3962 GLushort p
= ussrc
[i
];
3963 rgba
[i
][rDst
] = ((p
) & 0x1f);
3964 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3965 rgba
[i
][bDst
] = ((p
>> 11) );
3970 case GL_UNSIGNED_SHORT_4_4_4_4
:
3972 const GLushort
*ussrc
= (const GLushort
*) src
;
3974 for (i
= 0; i
< n
; i
++) {
3975 GLushort p
= ussrc
[i
];
3977 rgba
[i
][rDst
] = ((p
>> 12) );
3978 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3979 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3980 rgba
[i
][aDst
] = ((p
) & 0xf);
3984 const GLushort
*ussrc
= (const GLushort
*) src
;
3986 for (i
= 0; i
< n
; i
++) {
3987 GLushort p
= ussrc
[i
];
3988 rgba
[i
][rDst
] = ((p
>> 12) );
3989 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3990 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3991 rgba
[i
][aDst
] = ((p
) & 0xf);
3995 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3997 const GLushort
*ussrc
= (const GLushort
*) src
;
3999 for (i
= 0; i
< n
; i
++) {
4000 GLushort p
= ussrc
[i
];
4002 rgba
[i
][rDst
] = ((p
) & 0xf);
4003 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
4004 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
4005 rgba
[i
][aDst
] = ((p
>> 12) );
4009 const GLushort
*ussrc
= (const GLushort
*) src
;
4011 for (i
= 0; i
< n
; i
++) {
4012 GLushort p
= ussrc
[i
];
4013 rgba
[i
][rDst
] = ((p
) & 0xf);
4014 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
4015 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
4016 rgba
[i
][aDst
] = ((p
>> 12) );
4020 case GL_UNSIGNED_SHORT_5_5_5_1
:
4022 const GLushort
*ussrc
= (const GLushort
*) src
;
4024 for (i
= 0; i
< n
; i
++) {
4025 GLushort p
= ussrc
[i
];
4027 rgba
[i
][rDst
] = ((p
>> 11) );
4028 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
4029 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
4030 rgba
[i
][aDst
] = ((p
) & 0x1 );
4034 const GLushort
*ussrc
= (const GLushort
*) src
;
4036 for (i
= 0; i
< n
; i
++) {
4037 GLushort p
= ussrc
[i
];
4038 rgba
[i
][rDst
] = ((p
>> 11) );
4039 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
4040 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
4041 rgba
[i
][aDst
] = ((p
) & 0x1 );
4045 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
4047 const GLushort
*ussrc
= (const GLushort
*) src
;
4049 for (i
= 0; i
< n
; i
++) {
4050 GLushort p
= ussrc
[i
];
4052 rgba
[i
][rDst
] = ((p
) & 0x1f);
4053 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
4054 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
4055 rgba
[i
][aDst
] = ((p
>> 15) );
4059 const GLushort
*ussrc
= (const GLushort
*) src
;
4061 for (i
= 0; i
< n
; i
++) {
4062 GLushort p
= ussrc
[i
];
4063 rgba
[i
][rDst
] = ((p
) & 0x1f);
4064 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
4065 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
4066 rgba
[i
][aDst
] = ((p
>> 15) );
4070 case GL_UNSIGNED_INT_8_8_8_8
:
4072 const GLuint
*uisrc
= (const GLuint
*) src
;
4074 for (i
= 0; i
< n
; i
++) {
4075 GLuint p
= uisrc
[i
];
4076 rgba
[i
][rDst
] = ((p
) & 0xff);
4077 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4078 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4079 rgba
[i
][aDst
] = ((p
>> 24) );
4083 const GLuint
*uisrc
= (const GLuint
*) src
;
4085 for (i
= 0; i
< n
; i
++) {
4086 GLuint p
= uisrc
[i
];
4087 rgba
[i
][rDst
] = ((p
>> 24) );
4088 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4089 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4090 rgba
[i
][aDst
] = ((p
) & 0xff);
4094 case GL_UNSIGNED_INT_8_8_8_8_REV
:
4096 const GLuint
*uisrc
= (const GLuint
*) src
;
4098 for (i
= 0; i
< n
; i
++) {
4099 GLuint p
= uisrc
[i
];
4100 rgba
[i
][rDst
] = ((p
>> 24) );
4101 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4102 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4103 rgba
[i
][aDst
] = ((p
) & 0xff);
4107 const GLuint
*uisrc
= (const GLuint
*) src
;
4109 for (i
= 0; i
< n
; i
++) {
4110 GLuint p
= uisrc
[i
];
4111 rgba
[i
][rDst
] = ((p
) & 0xff);
4112 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4113 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4114 rgba
[i
][aDst
] = ((p
>> 24) );
4118 case GL_UNSIGNED_INT_10_10_10_2
:
4120 const GLuint
*uisrc
= (const GLuint
*) src
;
4122 for (i
= 0; i
< n
; i
++) {
4123 GLuint p
= uisrc
[i
];
4125 rgba
[i
][rDst
] = ((p
>> 22) );
4126 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4127 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4128 rgba
[i
][aDst
] = ((p
) & 0x3 );
4132 const GLuint
*uisrc
= (const GLuint
*) src
;
4134 for (i
= 0; i
< n
; i
++) {
4135 GLuint p
= uisrc
[i
];
4136 rgba
[i
][rDst
] = ((p
>> 22) );
4137 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4138 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4139 rgba
[i
][aDst
] = ((p
) & 0x3 );
4143 case GL_UNSIGNED_INT_2_10_10_10_REV
:
4145 const GLuint
*uisrc
= (const GLuint
*) src
;
4147 for (i
= 0; i
< n
; i
++) {
4148 GLuint p
= uisrc
[i
];
4150 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4151 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4152 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4153 rgba
[i
][aDst
] = ((p
>> 30) );
4157 const GLuint
*uisrc
= (const GLuint
*) src
;
4159 for (i
= 0; i
< n
; i
++) {
4160 GLuint p
= uisrc
[i
];
4161 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4162 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4163 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4164 rgba
[i
][aDst
] = ((p
>> 30) );
4168 case GL_UNSIGNED_INT_5_9_9_9_REV
:
4170 const GLuint
*uisrc
= (const GLuint
*) src
;
4173 for (i
= 0; i
< n
; i
++) {
4174 GLuint p
= uisrc
[i
];
4176 rgb9e5_to_float3(p
, f
);
4177 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4178 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4179 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4184 const GLuint
*uisrc
= (const GLuint
*) src
;
4187 for (i
= 0; i
< n
; i
++) {
4188 GLuint p
= uisrc
[i
];
4189 rgb9e5_to_float3(p
, f
);
4190 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4191 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4192 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4197 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
4199 const GLuint
*uisrc
= (const GLuint
*) src
;
4202 for (i
= 0; i
< n
; i
++) {
4203 GLuint p
= uisrc
[i
];
4205 r11g11b10f_to_float3(p
, f
);
4206 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4207 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4208 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4213 const GLuint
*uisrc
= (const GLuint
*) src
;
4216 for (i
= 0; i
< n
; i
++) {
4217 GLuint p
= uisrc
[i
];
4218 r11g11b10f_to_float3(p
, f
);
4219 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4220 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4221 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4227 _mesa_problem(NULL
, "bad srcType in extract uint data");
4236 * Unpack a row of color image data from a client buffer according to
4237 * the pixel unpacking parameters.
4238 * Return GLubyte values in the specified dest image format.
4239 * This is used by glDrawPixels and glTexImage?D().
4240 * \param ctx - the context
4241 * n - number of pixels in the span
4242 * dstFormat - format of destination color array
4243 * dest - the destination color array
4244 * srcFormat - source image format
4245 * srcType - source image data type
4246 * source - source image pointer
4247 * srcPacking - pixel unpacking parameters
4248 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
4250 * XXX perhaps expand this to process whole images someday.
4253 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
4254 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
4255 GLenum srcFormat
, GLenum srcType
,
4256 const GLvoid
*source
,
4257 const struct gl_pixelstore_attrib
*srcPacking
,
4258 GLbitfield transferOps
)
4260 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4261 ASSERT(dstFormat
== GL_ALPHA
||
4262 dstFormat
== GL_LUMINANCE
||
4263 dstFormat
== GL_LUMINANCE_ALPHA
||
4264 dstFormat
== GL_INTENSITY
||
4265 dstFormat
== GL_RED
||
4266 dstFormat
== GL_RG
||
4267 dstFormat
== GL_RGB
||
4268 dstFormat
== GL_RGBA
);
4270 ASSERT(srcFormat
== GL_RED
||
4271 srcFormat
== GL_GREEN
||
4272 srcFormat
== GL_BLUE
||
4273 srcFormat
== GL_ALPHA
||
4274 srcFormat
== GL_LUMINANCE
||
4275 srcFormat
== GL_LUMINANCE_ALPHA
||
4276 srcFormat
== GL_INTENSITY
||
4277 srcFormat
== GL_RG
||
4278 srcFormat
== GL_RGB
||
4279 srcFormat
== GL_BGR
||
4280 srcFormat
== GL_RGBA
||
4281 srcFormat
== GL_BGRA
||
4282 srcFormat
== GL_ABGR_EXT
||
4283 srcFormat
== GL_COLOR_INDEX
);
4285 ASSERT(srcType
== GL_BITMAP
||
4286 srcType
== GL_UNSIGNED_BYTE
||
4287 srcType
== GL_BYTE
||
4288 srcType
== GL_UNSIGNED_SHORT
||
4289 srcType
== GL_SHORT
||
4290 srcType
== GL_UNSIGNED_INT
||
4291 srcType
== GL_INT
||
4292 srcType
== GL_HALF_FLOAT_ARB
||
4293 srcType
== GL_FLOAT
||
4294 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4295 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4296 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4297 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4298 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4299 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4300 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4301 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4302 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4303 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4304 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4305 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4306 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4307 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4309 /* EXT_texture_integer specifies no transfer ops on integer
4310 * types in the resolved issues section. Just set them to 0
4311 * for integer surfaces.
4316 /* Try simple cases first */
4317 if (transferOps
== 0) {
4318 if (srcType
== GL_UNSIGNED_BYTE
) {
4319 if (dstFormat
== GL_RGBA
) {
4320 if (srcFormat
== GL_RGBA
) {
4321 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
4324 else if (srcFormat
== GL_RGB
) {
4326 const GLubyte
*src
= (const GLubyte
*) source
;
4327 GLubyte
*dst
= dest
;
4328 for (i
= 0; i
< n
; i
++) {
4339 else if (dstFormat
== GL_RGB
) {
4340 if (srcFormat
== GL_RGB
) {
4341 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
4344 else if (srcFormat
== GL_RGBA
) {
4346 const GLubyte
*src
= (const GLubyte
*) source
;
4347 GLubyte
*dst
= dest
;
4348 for (i
= 0; i
< n
; i
++) {
4358 else if (dstFormat
== srcFormat
) {
4359 GLint comps
= _mesa_components_in_format(srcFormat
);
4361 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
4368 /* general solution begins here */
4370 GLint dstComponents
;
4371 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4372 GLfloat (*rgba
)[4] = malloc(4 * n
* sizeof(GLfloat
));
4375 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4379 dstComponents
= _mesa_components_in_format( dstFormat
);
4380 /* source & dest image formats should have been error checked by now */
4381 assert(dstComponents
> 0);
4384 * Extract image data and convert to RGBA floats
4386 if (srcFormat
== GL_COLOR_INDEX
) {
4387 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4390 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4395 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4398 /* Convert indexes to RGBA */
4399 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4400 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4402 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4404 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4405 * with color indexes.
4407 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4412 /* non-color index data */
4413 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4414 srcPacking
->SwapBytes
);
4417 /* Need to clamp if returning GLubytes */
4418 transferOps
|= IMAGE_CLAMP_BIT
;
4421 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4424 get_component_indexes(dstFormat
,
4425 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4427 /* Now return the GLubyte data in the requested dstFormat */
4429 GLubyte
*dst
= dest
;
4431 for (i
= 0; i
< n
; i
++) {
4432 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
4433 dst
+= dstComponents
;
4438 GLubyte
*dst
= dest
;
4440 for (i
= 0; i
< n
; i
++) {
4441 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
4442 dst
+= dstComponents
;
4447 GLubyte
*dst
= dest
;
4449 for (i
= 0; i
< n
; i
++) {
4450 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
4451 dst
+= dstComponents
;
4456 GLubyte
*dst
= dest
;
4458 for (i
= 0; i
< n
; i
++) {
4459 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
4460 dst
+= dstComponents
;
4465 GLubyte
*dst
= dest
;
4468 assert(dstComponents
== 1);
4469 for (i
= 0; i
< n
; i
++) {
4470 /* Intensity comes from red channel */
4471 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
4476 GLubyte
*dst
= dest
;
4479 for (i
= 0; i
< n
; i
++) {
4480 /* Luminance comes from red channel */
4481 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
4482 dst
+= dstComponents
;
4492 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
4493 * instead of GLubyte.
4496 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
4497 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4498 GLenum srcFormat
, GLenum srcType
,
4499 const GLvoid
*source
,
4500 const struct gl_pixelstore_attrib
*srcPacking
,
4501 GLbitfield transferOps
)
4503 ASSERT(dstFormat
== GL_ALPHA
||
4504 dstFormat
== GL_LUMINANCE
||
4505 dstFormat
== GL_LUMINANCE_ALPHA
||
4506 dstFormat
== GL_INTENSITY
||
4507 dstFormat
== GL_RED
||
4508 dstFormat
== GL_RG
||
4509 dstFormat
== GL_RGB
||
4510 dstFormat
== GL_RGBA
);
4512 ASSERT(srcFormat
== GL_RED
||
4513 srcFormat
== GL_GREEN
||
4514 srcFormat
== GL_BLUE
||
4515 srcFormat
== GL_ALPHA
||
4516 srcFormat
== GL_LUMINANCE
||
4517 srcFormat
== GL_LUMINANCE_ALPHA
||
4518 srcFormat
== GL_INTENSITY
||
4519 srcFormat
== GL_RG
||
4520 srcFormat
== GL_RGB
||
4521 srcFormat
== GL_BGR
||
4522 srcFormat
== GL_RGBA
||
4523 srcFormat
== GL_BGRA
||
4524 srcFormat
== GL_ABGR_EXT
||
4525 srcFormat
== GL_RED_INTEGER_EXT
||
4526 srcFormat
== GL_GREEN_INTEGER_EXT
||
4527 srcFormat
== GL_BLUE_INTEGER_EXT
||
4528 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4529 srcFormat
== GL_RG_INTEGER
||
4530 srcFormat
== GL_RGB_INTEGER_EXT
||
4531 srcFormat
== GL_RGBA_INTEGER_EXT
||
4532 srcFormat
== GL_BGR_INTEGER_EXT
||
4533 srcFormat
== GL_BGRA_INTEGER_EXT
||
4534 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4535 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4536 srcFormat
== GL_COLOR_INDEX
);
4538 ASSERT(srcType
== GL_BITMAP
||
4539 srcType
== GL_UNSIGNED_BYTE
||
4540 srcType
== GL_BYTE
||
4541 srcType
== GL_UNSIGNED_SHORT
||
4542 srcType
== GL_SHORT
||
4543 srcType
== GL_UNSIGNED_INT
||
4544 srcType
== GL_INT
||
4545 srcType
== GL_HALF_FLOAT_ARB
||
4546 srcType
== GL_FLOAT
||
4547 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4548 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4549 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4550 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4551 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4552 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4553 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4554 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4555 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4556 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4557 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4558 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4559 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4560 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4562 /* general solution, no special cases, yet */
4564 GLint dstComponents
;
4565 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4566 GLfloat (*rgba
)[4] = malloc(4 * n
* sizeof(GLfloat
));
4567 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4570 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4574 dstComponents
= _mesa_components_in_format( dstFormat
);
4575 /* source & dest image formats should have been error checked by now */
4576 assert(dstComponents
> 0);
4578 /* EXT_texture_integer specifies no transfer ops on integer
4579 * types in the resolved issues section. Just set them to 0
4580 * for integer surfaces.
4586 * Extract image data and convert to RGBA floats
4588 if (srcFormat
== GL_COLOR_INDEX
) {
4589 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4592 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4597 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4600 /* Convert indexes to RGBA */
4601 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4602 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4604 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4606 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4607 * with color indexes.
4609 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4614 /* non-color index data */
4615 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4616 srcPacking
->SwapBytes
);
4620 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4623 get_component_indexes(dstFormat
,
4624 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4626 /* Now pack results in the requested dstFormat */
4628 GLfloat
*dst
= dest
;
4630 for (i
= 0; i
< n
; i
++) {
4631 dst
[rDst
] = rgba
[i
][RCOMP
];
4632 dst
+= dstComponents
;
4637 GLfloat
*dst
= dest
;
4639 for (i
= 0; i
< n
; i
++) {
4640 dst
[gDst
] = rgba
[i
][GCOMP
];
4641 dst
+= dstComponents
;
4646 GLfloat
*dst
= dest
;
4648 for (i
= 0; i
< n
; i
++) {
4649 dst
[bDst
] = rgba
[i
][BCOMP
];
4650 dst
+= dstComponents
;
4655 GLfloat
*dst
= dest
;
4657 for (i
= 0; i
< n
; i
++) {
4658 dst
[aDst
] = rgba
[i
][ACOMP
];
4659 dst
+= dstComponents
;
4664 GLfloat
*dst
= dest
;
4667 assert(dstComponents
== 1);
4668 for (i
= 0; i
< n
; i
++) {
4669 /* Intensity comes from red channel */
4670 dst
[i
] = rgba
[i
][RCOMP
];
4675 GLfloat
*dst
= dest
;
4678 for (i
= 0; i
< n
; i
++) {
4679 /* Luminance comes from red channel */
4680 dst
[0] = rgba
[i
][RCOMP
];
4681 dst
+= dstComponents
;
4691 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4692 * instead of GLubyte.
4693 * No pixel transfer ops are applied.
4696 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4697 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4698 GLenum srcFormat
, GLenum srcType
,
4699 const GLvoid
*source
,
4700 const struct gl_pixelstore_attrib
*srcPacking
)
4702 GLuint (*rgba
)[4] = malloc(n
* 4 * sizeof(GLfloat
));
4705 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4709 ASSERT(dstFormat
== GL_ALPHA
||
4710 dstFormat
== GL_LUMINANCE
||
4711 dstFormat
== GL_LUMINANCE_ALPHA
||
4712 dstFormat
== GL_INTENSITY
||
4713 dstFormat
== GL_RED
||
4714 dstFormat
== GL_RG
||
4715 dstFormat
== GL_RGB
||
4716 dstFormat
== GL_RGBA
);
4718 ASSERT(srcFormat
== GL_RED
||
4719 srcFormat
== GL_GREEN
||
4720 srcFormat
== GL_BLUE
||
4721 srcFormat
== GL_ALPHA
||
4722 srcFormat
== GL_LUMINANCE
||
4723 srcFormat
== GL_LUMINANCE_ALPHA
||
4724 srcFormat
== GL_INTENSITY
||
4725 srcFormat
== GL_RG
||
4726 srcFormat
== GL_RGB
||
4727 srcFormat
== GL_BGR
||
4728 srcFormat
== GL_RGBA
||
4729 srcFormat
== GL_BGRA
||
4730 srcFormat
== GL_ABGR_EXT
||
4731 srcFormat
== GL_RED_INTEGER_EXT
||
4732 srcFormat
== GL_GREEN_INTEGER_EXT
||
4733 srcFormat
== GL_BLUE_INTEGER_EXT
||
4734 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4735 srcFormat
== GL_RG_INTEGER
||
4736 srcFormat
== GL_RGB_INTEGER_EXT
||
4737 srcFormat
== GL_RGBA_INTEGER_EXT
||
4738 srcFormat
== GL_BGR_INTEGER_EXT
||
4739 srcFormat
== GL_BGRA_INTEGER_EXT
||
4740 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4741 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4743 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4744 srcType
== GL_BYTE
||
4745 srcType
== GL_UNSIGNED_SHORT
||
4746 srcType
== GL_SHORT
||
4747 srcType
== GL_UNSIGNED_INT
||
4748 srcType
== GL_INT
||
4749 srcType
== GL_HALF_FLOAT_ARB
||
4750 srcType
== GL_FLOAT
||
4751 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4752 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4753 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4754 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4755 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4756 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4757 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4758 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4759 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4760 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4761 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4762 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4763 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4764 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4767 /* Extract image data as uint[4] pixels */
4768 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4769 srcPacking
->SwapBytes
);
4771 if (dstFormat
== GL_RGBA
) {
4773 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4777 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4778 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4780 assert(dstComponents
> 0);
4782 get_component_indexes(dstFormat
,
4783 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4785 /* Now pack values in the requested dest format */
4789 for (i
= 0; i
< n
; i
++) {
4790 dst
[rDst
] = rgba
[i
][RCOMP
];
4791 dst
+= dstComponents
;
4798 for (i
= 0; i
< n
; i
++) {
4799 dst
[gDst
] = rgba
[i
][GCOMP
];
4800 dst
+= dstComponents
;
4807 for (i
= 0; i
< n
; i
++) {
4808 dst
[bDst
] = rgba
[i
][BCOMP
];
4809 dst
+= dstComponents
;
4816 for (i
= 0; i
< n
; i
++) {
4817 dst
[aDst
] = rgba
[i
][ACOMP
];
4818 dst
+= dstComponents
;
4826 assert(dstComponents
== 1);
4827 for (i
= 0; i
< n
; i
++) {
4828 /* Intensity comes from red channel */
4829 dst
[i
] = rgba
[i
][RCOMP
];
4837 for (i
= 0; i
< n
; i
++) {
4838 /* Luminance comes from red channel */
4839 dst
[0] = rgba
[i
][RCOMP
];
4840 dst
+= dstComponents
;
4851 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4852 * directly return GLbyte data, no transfer ops apply.
4855 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4856 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4857 GLenum srcFormat
, GLenum srcType
,
4858 const GLvoid
*source
,
4859 const struct gl_pixelstore_attrib
*srcPacking
,
4860 GLbitfield transferOps
)
4862 ASSERT(dstFormat
== GL_DUDV_ATI
);
4863 ASSERT(srcFormat
== GL_DUDV_ATI
||
4864 srcFormat
== GL_DU8DV8_ATI
);
4866 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4867 srcType
== GL_BYTE
||
4868 srcType
== GL_UNSIGNED_SHORT
||
4869 srcType
== GL_SHORT
||
4870 srcType
== GL_UNSIGNED_INT
||
4871 srcType
== GL_INT
||
4872 srcType
== GL_HALF_FLOAT_ARB
||
4873 srcType
== GL_FLOAT
);
4875 /* general solution */
4877 GLint dstComponents
;
4880 GLfloat (*rgba
)[4] = malloc(4 * n
* sizeof(GLfloat
));
4883 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4887 dstComponents
= _mesa_components_in_format( dstFormat
);
4888 /* source & dest image formats should have been error checked by now */
4889 assert(dstComponents
> 0);
4892 * Extract image data and convert to RGBA floats
4894 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4895 srcPacking
->SwapBytes
);
4898 /* Now determine which color channels we need to produce.
4899 * And determine the dest index (offset) within each color tuple.
4902 /* Now pack results in the requested dstFormat */
4903 for (i
= 0; i
< n
; i
++) {
4904 /* not sure - need clamp[-1,1] here? */
4905 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4906 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4907 dst
+= dstComponents
;
4915 * Unpack a row of color index data from a client buffer according to
4916 * the pixel unpacking parameters.
4917 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4919 * Args: ctx - the context
4920 * n - number of pixels
4921 * dstType - destination data type
4922 * dest - destination array
4923 * srcType - source pixel type
4924 * source - source data pointer
4925 * srcPacking - pixel unpacking parameters
4926 * transferOps - the pixel transfer operations to apply
4929 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4930 GLenum dstType
, GLvoid
*dest
,
4931 GLenum srcType
, const GLvoid
*source
,
4932 const struct gl_pixelstore_attrib
*srcPacking
,
4933 GLbitfield transferOps
)
4935 ASSERT(srcType
== GL_BITMAP
||
4936 srcType
== GL_UNSIGNED_BYTE
||
4937 srcType
== GL_BYTE
||
4938 srcType
== GL_UNSIGNED_SHORT
||
4939 srcType
== GL_SHORT
||
4940 srcType
== GL_UNSIGNED_INT
||
4941 srcType
== GL_INT
||
4942 srcType
== GL_HALF_FLOAT_ARB
||
4943 srcType
== GL_FLOAT
);
4945 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4946 dstType
== GL_UNSIGNED_SHORT
||
4947 dstType
== GL_UNSIGNED_INT
);
4950 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4953 * Try simple cases first
4955 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4956 && dstType
== GL_UNSIGNED_BYTE
) {
4957 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4959 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4960 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4961 memcpy(dest
, source
, n
* sizeof(GLuint
));
4967 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4970 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4974 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4978 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4980 /* convert to dest type */
4982 case GL_UNSIGNED_BYTE
:
4984 GLubyte
*dst
= (GLubyte
*) dest
;
4986 for (i
= 0; i
< n
; i
++) {
4987 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4991 case GL_UNSIGNED_SHORT
:
4993 GLuint
*dst
= (GLuint
*) dest
;
4995 for (i
= 0; i
< n
; i
++) {
4996 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
5000 case GL_UNSIGNED_INT
:
5001 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
5004 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
5013 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
5014 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
5015 const struct gl_pixelstore_attrib
*dstPacking
,
5016 GLbitfield transferOps
)
5018 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
5021 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5025 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
5027 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
5028 /* make a copy of input */
5029 memcpy(indexes
, source
, n
* sizeof(GLuint
));
5030 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
5035 case GL_UNSIGNED_BYTE
:
5037 GLubyte
*dst
= (GLubyte
*) dest
;
5039 for (i
= 0; i
< n
; i
++) {
5040 *dst
++ = (GLubyte
) source
[i
];
5046 GLbyte
*dst
= (GLbyte
*) dest
;
5048 for (i
= 0; i
< n
; i
++) {
5049 dst
[i
] = (GLbyte
) source
[i
];
5053 case GL_UNSIGNED_SHORT
:
5055 GLushort
*dst
= (GLushort
*) dest
;
5057 for (i
= 0; i
< n
; i
++) {
5058 dst
[i
] = (GLushort
) source
[i
];
5060 if (dstPacking
->SwapBytes
) {
5061 _mesa_swap2( (GLushort
*) dst
, n
);
5067 GLshort
*dst
= (GLshort
*) dest
;
5069 for (i
= 0; i
< n
; i
++) {
5070 dst
[i
] = (GLshort
) source
[i
];
5072 if (dstPacking
->SwapBytes
) {
5073 _mesa_swap2( (GLushort
*) dst
, n
);
5077 case GL_UNSIGNED_INT
:
5079 GLuint
*dst
= (GLuint
*) dest
;
5081 for (i
= 0; i
< n
; i
++) {
5082 dst
[i
] = (GLuint
) source
[i
];
5084 if (dstPacking
->SwapBytes
) {
5085 _mesa_swap4( (GLuint
*) dst
, n
);
5091 GLint
*dst
= (GLint
*) dest
;
5093 for (i
= 0; i
< n
; i
++) {
5094 dst
[i
] = (GLint
) source
[i
];
5096 if (dstPacking
->SwapBytes
) {
5097 _mesa_swap4( (GLuint
*) dst
, n
);
5103 GLfloat
*dst
= (GLfloat
*) dest
;
5105 for (i
= 0; i
< n
; i
++) {
5106 dst
[i
] = (GLfloat
) source
[i
];
5108 if (dstPacking
->SwapBytes
) {
5109 _mesa_swap4( (GLuint
*) dst
, n
);
5113 case GL_HALF_FLOAT_ARB
:
5115 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5117 for (i
= 0; i
< n
; i
++) {
5118 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
5120 if (dstPacking
->SwapBytes
) {
5121 _mesa_swap2( (GLushort
*) dst
, n
);
5126 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5134 * Unpack a row of stencil data from a client buffer according to
5135 * the pixel unpacking parameters.
5136 * This is (or will be) used by glDrawPixels
5138 * Args: ctx - the context
5139 * n - number of pixels
5140 * dstType - destination data type
5141 * dest - destination array
5142 * srcType - source pixel type
5143 * source - source data pointer
5144 * srcPacking - pixel unpacking parameters
5145 * transferOps - apply offset/bias/lookup ops?
5148 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5149 GLenum dstType
, GLvoid
*dest
,
5150 GLenum srcType
, const GLvoid
*source
,
5151 const struct gl_pixelstore_attrib
*srcPacking
,
5152 GLbitfield transferOps
)
5154 ASSERT(srcType
== GL_BITMAP
||
5155 srcType
== GL_UNSIGNED_BYTE
||
5156 srcType
== GL_BYTE
||
5157 srcType
== GL_UNSIGNED_SHORT
||
5158 srcType
== GL_SHORT
||
5159 srcType
== GL_UNSIGNED_INT
||
5160 srcType
== GL_INT
||
5161 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
5162 srcType
== GL_HALF_FLOAT_ARB
||
5163 srcType
== GL_FLOAT
||
5164 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5166 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
5167 dstType
== GL_UNSIGNED_SHORT
||
5168 dstType
== GL_UNSIGNED_INT
||
5169 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5171 /* only shift and offset apply to stencil */
5172 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
5175 * Try simple cases first
5177 if (transferOps
== 0 &&
5178 !ctx
->Pixel
.MapStencilFlag
&&
5179 srcType
== GL_UNSIGNED_BYTE
&&
5180 dstType
== GL_UNSIGNED_BYTE
) {
5181 memcpy(dest
, source
, n
* sizeof(GLubyte
));
5183 else if (transferOps
== 0 &&
5184 !ctx
->Pixel
.MapStencilFlag
&&
5185 srcType
== GL_UNSIGNED_INT
&&
5186 dstType
== GL_UNSIGNED_INT
&&
5187 !srcPacking
->SwapBytes
) {
5188 memcpy(dest
, source
, n
* sizeof(GLuint
));
5194 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
5197 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
5201 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
5204 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
5205 /* shift and offset indexes */
5206 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
5209 if (ctx
->Pixel
.MapStencilFlag
) {
5210 /* Apply stencil lookup table */
5211 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
5213 for (i
= 0; i
< n
; i
++) {
5214 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
5218 /* convert to dest type */
5220 case GL_UNSIGNED_BYTE
:
5222 GLubyte
*dst
= (GLubyte
*) dest
;
5224 for (i
= 0; i
< n
; i
++) {
5225 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
5229 case GL_UNSIGNED_SHORT
:
5231 GLuint
*dst
= (GLuint
*) dest
;
5233 for (i
= 0; i
< n
; i
++) {
5234 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
5238 case GL_UNSIGNED_INT
:
5239 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
5241 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5243 GLuint
*dst
= (GLuint
*) dest
;
5245 for (i
= 0; i
< n
; i
++) {
5246 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
5251 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
5260 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5261 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
5262 const struct gl_pixelstore_attrib
*dstPacking
)
5264 GLubyte
*stencil
= malloc(n
* sizeof(GLubyte
));
5267 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
5271 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
5272 ctx
->Pixel
.MapStencilFlag
) {
5273 /* make a copy of input */
5274 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
5275 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
5280 case GL_UNSIGNED_BYTE
:
5281 memcpy(dest
, source
, n
);
5285 GLbyte
*dst
= (GLbyte
*) dest
;
5288 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
5292 case GL_UNSIGNED_SHORT
:
5294 GLushort
*dst
= (GLushort
*) dest
;
5297 dst
[i
] = (GLushort
) source
[i
];
5299 if (dstPacking
->SwapBytes
) {
5300 _mesa_swap2( (GLushort
*) dst
, n
);
5306 GLshort
*dst
= (GLshort
*) dest
;
5309 dst
[i
] = (GLshort
) source
[i
];
5311 if (dstPacking
->SwapBytes
) {
5312 _mesa_swap2( (GLushort
*) dst
, n
);
5316 case GL_UNSIGNED_INT
:
5318 GLuint
*dst
= (GLuint
*) dest
;
5321 dst
[i
] = (GLuint
) source
[i
];
5323 if (dstPacking
->SwapBytes
) {
5324 _mesa_swap4( (GLuint
*) dst
, n
);
5330 GLint
*dst
= (GLint
*) dest
;
5333 dst
[i
] = (GLint
) source
[i
];
5335 if (dstPacking
->SwapBytes
) {
5336 _mesa_swap4( (GLuint
*) dst
, n
);
5342 GLfloat
*dst
= (GLfloat
*) dest
;
5345 dst
[i
] = (GLfloat
) source
[i
];
5347 if (dstPacking
->SwapBytes
) {
5348 _mesa_swap4( (GLuint
*) dst
, n
);
5352 case GL_HALF_FLOAT_ARB
:
5354 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5357 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5359 if (dstPacking
->SwapBytes
) {
5360 _mesa_swap2( (GLushort
*) dst
, n
);
5365 if (dstPacking
->LsbFirst
) {
5366 GLubyte
*dst
= (GLubyte
*) dest
;
5369 for (i
= 0; i
< n
; i
++) {
5372 *dst
|= ((source
[i
] != 0) << shift
);
5381 GLubyte
*dst
= (GLubyte
*) dest
;
5384 for (i
= 0; i
< n
; i
++) {
5387 *dst
|= ((source
[i
] != 0) << shift
);
5397 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5403 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5406 const GLTYPE *src = (const GLTYPE *)source; \
5407 for (i = 0; i < n; i++) { \
5408 GLTYPE value = src[i]; \
5409 if (srcPacking->SwapBytes) { \
5410 if (sizeof(GLTYPE) == 2) { \
5412 } else if (sizeof(GLTYPE) == 4) { \
5416 depthValues[i] = GLTYPE2FLOAT(value); \
5422 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5423 * or GLfloat values.
5424 * The glPixelTransfer (scale/bias) params will be applied.
5426 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5427 * \param depthMax max value for returned GLushort or GLuint values
5428 * (ignored for GLfloat).
5431 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
5432 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5433 GLenum srcType
, const GLvoid
*source
,
5434 const struct gl_pixelstore_attrib
*srcPacking
)
5436 GLfloat
*depthTemp
= NULL
, *depthValues
;
5437 GLboolean needClamp
= GL_FALSE
;
5439 /* Look for special cases first.
5440 * Not only are these faster, they're less prone to numeric conversion
5441 * problems. Otherwise, converting from an int type to a float then
5442 * back to an int type can introduce errors that will show up as
5443 * artifacts in things like depth peeling which uses glCopyTexImage.
5445 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5446 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5447 const GLuint
*src
= (const GLuint
*) source
;
5448 GLushort
*dst
= (GLushort
*) dest
;
5450 for (i
= 0; i
< n
; i
++) {
5451 dst
[i
] = src
[i
] >> 16;
5455 if (srcType
== GL_UNSIGNED_SHORT
5456 && dstType
== GL_UNSIGNED_INT
5457 && depthMax
== 0xffffffff) {
5458 const GLushort
*src
= (const GLushort
*) source
;
5459 GLuint
*dst
= (GLuint
*) dest
;
5461 for (i
= 0; i
< n
; i
++) {
5462 dst
[i
] = src
[i
] | (src
[i
] << 16);
5466 if (srcType
== GL_UNSIGNED_INT_24_8
5467 && dstType
== GL_UNSIGNED_INT
5468 && depthMax
== 0xffffff) {
5469 const GLuint
*src
= (const GLuint
*) source
;
5470 GLuint
*dst
= (GLuint
*) dest
;
5472 for (i
= 0; i
< n
; i
++) {
5473 dst
[i
] = src
[i
] >> 8;
5477 /* XXX may want to add additional cases here someday */
5480 /* general case path follows */
5482 if (dstType
== GL_FLOAT
) {
5483 depthValues
= (GLfloat
*) dest
;
5486 depthTemp
= malloc(n
* sizeof(GLfloat
));
5488 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
5492 depthValues
= depthTemp
;
5495 /* Convert incoming values to GLfloat. Some conversions will require
5500 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
5501 needClamp
= GL_TRUE
;
5503 case GL_UNSIGNED_BYTE
:
5504 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5507 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
5508 needClamp
= GL_TRUE
;
5510 case GL_UNSIGNED_SHORT
:
5511 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5514 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5515 needClamp
= GL_TRUE
;
5517 case GL_UNSIGNED_INT
:
5518 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5520 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5521 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5522 depthMax
== 0xffffff &&
5523 ctx
->Pixel
.DepthScale
== 1.0 &&
5524 ctx
->Pixel
.DepthBias
== 0.0) {
5525 const GLuint
*src
= (const GLuint
*) source
;
5526 GLuint
*zValues
= (GLuint
*) dest
;
5528 for (i
= 0; i
< n
; i
++) {
5529 GLuint value
= src
[i
];
5530 if (srcPacking
->SwapBytes
) {
5533 zValues
[i
] = value
& 0xffffff00;
5539 const GLuint
*src
= (const GLuint
*) source
;
5540 const GLfloat scale
= 1.0f
/ 0xffffff;
5542 for (i
= 0; i
< n
; i
++) {
5543 GLuint value
= src
[i
];
5544 if (srcPacking
->SwapBytes
) {
5547 depthValues
[i
] = (value
>> 8) * scale
;
5551 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5554 const GLfloat
*src
= (const GLfloat
*)source
;
5555 for (i
= 0; i
< n
; i
++) {
5556 GLfloat value
= src
[i
* 2];
5557 if (srcPacking
->SwapBytes
) {
5560 depthValues
[i
] = value
;
5562 needClamp
= GL_TRUE
;
5566 DEPTH_VALUES(GLfloat
, 1*);
5567 needClamp
= GL_TRUE
;
5569 case GL_HALF_FLOAT_ARB
:
5572 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5573 for (i
= 0; i
< n
; i
++) {
5574 GLhalfARB value
= src
[i
];
5575 if (srcPacking
->SwapBytes
) {
5578 depthValues
[i
] = _mesa_half_to_float(value
);
5580 needClamp
= GL_TRUE
;
5584 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5589 /* apply depth scale and bias */
5591 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5592 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5593 if (scale
!= 1.0 || bias
!= 0.0) {
5595 for (i
= 0; i
< n
; i
++) {
5596 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5598 needClamp
= GL_TRUE
;
5602 /* clamp to [0, 1] */
5605 for (i
= 0; i
< n
; i
++) {
5606 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5611 * Convert values to dstType
5613 if (dstType
== GL_UNSIGNED_INT
) {
5614 GLuint
*zValues
= (GLuint
*) dest
;
5616 if (depthMax
<= 0xffffff) {
5617 /* no overflow worries */
5618 for (i
= 0; i
< n
; i
++) {
5619 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5623 /* need to use double precision to prevent overflow problems */
5624 for (i
= 0; i
< n
; i
++) {
5625 GLdouble z
= depthValues
[i
] * (GLdouble
) depthMax
;
5626 if (z
>= (GLdouble
) 0xffffffff)
5627 zValues
[i
] = 0xffffffff;
5629 zValues
[i
] = (GLuint
) z
;
5633 else if (dstType
== GL_UNSIGNED_SHORT
) {
5634 GLushort
*zValues
= (GLushort
*) dest
;
5636 ASSERT(depthMax
<= 0xffff);
5637 for (i
= 0; i
< n
; i
++) {
5638 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5641 else if (dstType
== GL_FLOAT
) {
5642 /* Nothing to do. depthValues is pointing to dest. */
5644 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
5645 GLfloat
*zValues
= (GLfloat
*) dest
;
5647 for (i
= 0; i
< n
; i
++) {
5648 zValues
[i
*2] = depthValues
[i
];
5660 * Pack an array of depth values. The values are floats in [0,1].
5663 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
5664 GLenum dstType
, const GLfloat
*depthSpan
,
5665 const struct gl_pixelstore_attrib
*dstPacking
)
5667 GLfloat
*depthCopy
= malloc(n
* sizeof(GLfloat
));
5669 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5673 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5674 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5675 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5676 depthSpan
= depthCopy
;
5680 case GL_UNSIGNED_BYTE
:
5682 GLubyte
*dst
= (GLubyte
*) dest
;
5684 for (i
= 0; i
< n
; i
++) {
5685 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5691 GLbyte
*dst
= (GLbyte
*) dest
;
5693 for (i
= 0; i
< n
; i
++) {
5694 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5698 case GL_UNSIGNED_SHORT
:
5700 GLushort
*dst
= (GLushort
*) dest
;
5702 for (i
= 0; i
< n
; i
++) {
5703 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5705 if (dstPacking
->SwapBytes
) {
5706 _mesa_swap2( (GLushort
*) dst
, n
);
5712 GLshort
*dst
= (GLshort
*) dest
;
5714 for (i
= 0; i
< n
; i
++) {
5715 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5717 if (dstPacking
->SwapBytes
) {
5718 _mesa_swap2( (GLushort
*) dst
, n
);
5722 case GL_UNSIGNED_INT
:
5724 GLuint
*dst
= (GLuint
*) dest
;
5726 for (i
= 0; i
< n
; i
++) {
5727 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5729 if (dstPacking
->SwapBytes
) {
5730 _mesa_swap4( (GLuint
*) dst
, n
);
5736 GLint
*dst
= (GLint
*) dest
;
5738 for (i
= 0; i
< n
; i
++) {
5739 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5741 if (dstPacking
->SwapBytes
) {
5742 _mesa_swap4( (GLuint
*) dst
, n
);
5748 GLfloat
*dst
= (GLfloat
*) dest
;
5750 for (i
= 0; i
< n
; i
++) {
5751 dst
[i
] = depthSpan
[i
];
5753 if (dstPacking
->SwapBytes
) {
5754 _mesa_swap4( (GLuint
*) dst
, n
);
5758 case GL_HALF_FLOAT_ARB
:
5760 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5762 for (i
= 0; i
< n
; i
++) {
5763 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5765 if (dstPacking
->SwapBytes
) {
5766 _mesa_swap2( (GLushort
*) dst
, n
);
5771 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5780 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5783 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5784 GLenum dstType
, GLuint
*dest
,
5785 const GLfloat
*depthVals
,
5786 const GLubyte
*stencilVals
,
5787 const struct gl_pixelstore_attrib
*dstPacking
)
5789 GLfloat
*depthCopy
= malloc(n
* sizeof(GLfloat
));
5790 GLubyte
*stencilCopy
= malloc(n
* sizeof(GLubyte
));
5793 if (!depthCopy
|| !stencilCopy
) {
5794 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5800 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5801 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5802 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5803 depthVals
= depthCopy
;
5806 if (ctx
->Pixel
.IndexShift
||
5807 ctx
->Pixel
.IndexOffset
||
5808 ctx
->Pixel
.MapStencilFlag
) {
5809 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5810 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5811 stencilVals
= stencilCopy
;
5815 case GL_UNSIGNED_INT_24_8
:
5816 for (i
= 0; i
< n
; i
++) {
5817 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5818 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5821 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5822 for (i
= 0; i
< n
; i
++) {
5823 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5824 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5829 if (dstPacking
->SwapBytes
) {
5830 _mesa_swap4(dest
, n
);
5841 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5842 * Return all image data in a contiguous block. This is used when we
5843 * compile glDrawPixels, glTexImage, etc into a display list. We
5844 * need a copy of the data in a standard format.
5847 _mesa_unpack_image( GLuint dimensions
,
5848 GLsizei width
, GLsizei height
, GLsizei depth
,
5849 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5850 const struct gl_pixelstore_attrib
*unpack
)
5852 GLint bytesPerRow
, compsPerRow
;
5853 GLboolean flipBytes
, swap2
, swap4
;
5856 return NULL
; /* not necessarily an error */
5858 if (width
<= 0 || height
<= 0 || depth
<= 0)
5859 return NULL
; /* generate error later */
5861 if (type
== GL_BITMAP
) {
5862 bytesPerRow
= (width
+ 7) >> 3;
5863 flipBytes
= unpack
->LsbFirst
;
5864 swap2
= swap4
= GL_FALSE
;
5868 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5869 GLint components
= _mesa_components_in_format(format
);
5872 if (_mesa_type_is_packed(type
))
5875 if (bytesPerPixel
<= 0 || components
<= 0)
5876 return NULL
; /* bad format or type. generate error later */
5877 bytesPerRow
= bytesPerPixel
* width
;
5878 bytesPerComp
= bytesPerPixel
/ components
;
5879 flipBytes
= GL_FALSE
;
5880 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5881 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5882 compsPerRow
= components
* width
;
5883 assert(compsPerRow
>= width
);
5888 = malloc(bytesPerRow
* height
* depth
);
5892 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5895 for (img
= 0; img
< depth
; img
++) {
5896 for (row
= 0; row
< height
; row
++) {
5897 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5898 width
, height
, format
, type
, img
, row
, 0);
5900 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5902 flipBytes
= GL_FALSE
;
5903 if (unpack
->LsbFirst
) {
5904 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5905 GLubyte dstMask
= 128;
5906 const GLubyte
*s
= src
;
5909 for (i
= 0; i
< width
; i
++) {
5913 if (srcMask
== 128) {
5918 srcMask
= srcMask
<< 1;
5926 dstMask
= dstMask
>> 1;
5931 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5932 GLubyte dstMask
= 128;
5933 const GLubyte
*s
= src
;
5936 for (i
= 0; i
< width
; i
++) {
5945 srcMask
= srcMask
>> 1;
5953 dstMask
= dstMask
>> 1;
5959 memcpy(dst
, src
, bytesPerRow
);
5962 /* byte flipping/swapping */
5964 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5967 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5970 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5982 * If we unpack colors from a luminance surface, we'll get pixel colors
5983 * such as (l, l, l, a).
5984 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5985 * function will compute L=R+G+B before packing. The net effect is we'll
5986 * accidentally store luminance values = 3*l.
5987 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5989 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5992 * Finally, we also need to do this when the actual surface format does
5993 * not match the logical surface format. For example, suppose the user
5994 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5995 * Again, we'll get pixel values like (l,l,l,a).
5998 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
6002 switch (baseFormat
) {
6004 for (i
= 0; i
< n
; i
++) {
6005 rgba
[i
][RCOMP
] = 0.0F
;
6006 rgba
[i
][GCOMP
] = 0.0F
;
6007 rgba
[i
][BCOMP
] = 0.0F
;
6013 for (i
= 0; i
< n
; i
++) {
6014 rgba
[i
][GCOMP
] = 0.0F
;
6015 rgba
[i
][BCOMP
] = 0.0F
;
6016 rgba
[i
][ACOMP
] = 1.0F
;
6019 case GL_LUMINANCE_ALPHA
:
6020 for (i
= 0; i
< n
; i
++) {
6021 rgba
[i
][GCOMP
] = 0.0F
;
6022 rgba
[i
][BCOMP
] = 0.0F
;
6026 for (i
= 0; i
< n
; i
++) {
6027 rgba
[i
][ACOMP
] = 1.0F
;
6031 for (i
= 0; i
< n
; i
++) {
6032 rgba
[i
][BCOMP
] = 0.0F
;
6033 rgba
[i
][ACOMP
] = 1.0F
;
6037 for (i
= 0; i
< n
; i
++) {
6038 rgba
[i
][GCOMP
] = 0.0F
;
6039 rgba
[i
][BCOMP
] = 0.0F
;
6040 rgba
[i
][ACOMP
] = 1.0F
;
6052 * As above, but GLuint components.
6055 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
6059 switch (baseFormat
) {
6061 for (i
= 0; i
< n
; i
++) {
6070 for (i
= 0; i
< n
; i
++) {
6076 case GL_LUMINANCE_ALPHA
:
6077 for (i
= 0; i
< n
; i
++) {
6083 for (i
= 0; i
< n
; i
++) {
6088 for (i
= 0; i
< n
; i
++) {
6094 for (i
= 0; i
< n
; i
++) {