2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34 * this global optimization.
37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
40 #if defined(_MSC_VER) && defined(_M_X64)
41 # pragma optimize( "g", off )
53 #include "pixeltransfer.h"
55 #include "glformats.h"
56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
61 * Flip the 8 bits in each byte of the given array.
64 * \param n number of bytes.
66 * \todo try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
74 flip_bytes( GLubyte
*p
, GLuint n
)
77 for (i
= 0; i
< n
; i
++) {
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
94 * Unpack a 32x32 pixel polygon stipple from user memory using the
95 * current pixel unpack settings.
98 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
99 const struct gl_pixelstore_attrib
*unpacking
)
101 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
103 /* Convert pattern from GLubytes to GLuints and handle big/little
108 for (i
= 0; i
< 32; i
++) {
109 dest
[i
] = (p
[0] << 24)
121 * Pack polygon stipple into user memory given current pixel packing
125 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
126 const struct gl_pixelstore_attrib
*packing
)
128 /* Convert pattern from GLuints to GLubytes to handle big/little
129 * endian differences.
133 for (i
= 0; i
< 32; i
++) {
134 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
135 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
136 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
137 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
140 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
146 * order with row alignment = 1 byte.
149 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
150 const struct gl_pixelstore_attrib
*packing
)
152 GLint bytes
, row
, width_in_bytes
;
153 GLubyte
*buffer
, *dst
;
158 /* Alloc dest storage */
159 bytes
= ((width
+ 7) / 8 * height
);
160 buffer
= (GLubyte
*) malloc( bytes
);
164 width_in_bytes
= CEILING( width
, 8 );
166 for (row
= 0; row
< height
; row
++) {
167 const GLubyte
*src
= (const GLubyte
*)
168 _mesa_image_address2d(packing
, pixels
, width
, height
,
169 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
175 if ((packing
->SkipPixels
& 7) == 0) {
176 memcpy( dst
, src
, width_in_bytes
);
177 if (packing
->LsbFirst
) {
178 flip_bytes( dst
, width_in_bytes
);
182 /* handling SkipPixels is a bit tricky (no pun intended!) */
184 if (packing
->LsbFirst
) {
185 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
186 GLubyte dstMask
= 128;
187 const GLubyte
*s
= src
;
190 for (i
= 0; i
< width
; i
++) {
194 if (srcMask
== 128) {
199 srcMask
= srcMask
<< 1;
207 dstMask
= dstMask
>> 1;
212 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
213 GLubyte dstMask
= 128;
214 const GLubyte
*s
= src
;
217 for (i
= 0; i
< width
; i
++) {
226 srcMask
= srcMask
>> 1;
234 dstMask
= dstMask
>> 1;
239 dst
+= width_in_bytes
;
250 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
251 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
253 GLint row
, width_in_bytes
;
259 width_in_bytes
= CEILING( width
, 8 );
261 for (row
= 0; row
< height
; row
++) {
262 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
263 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
267 if ((packing
->SkipPixels
& 7) == 0) {
268 memcpy( dst
, src
, width_in_bytes
);
269 if (packing
->LsbFirst
) {
270 flip_bytes( dst
, width_in_bytes
);
274 /* handling SkipPixels is a bit tricky (no pun intended!) */
276 if (packing
->LsbFirst
) {
277 GLubyte srcMask
= 128;
278 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
279 const GLubyte
*s
= src
;
282 for (i
= 0; i
< width
; i
++) {
291 srcMask
= srcMask
>> 1;
293 if (dstMask
== 128) {
299 dstMask
= dstMask
<< 1;
304 GLubyte srcMask
= 128;
305 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
306 const GLubyte
*s
= src
;
309 for (i
= 0; i
< width
; i
++) {
318 srcMask
= srcMask
>> 1;
326 dstMask
= dstMask
>> 1;
331 src
+= width_in_bytes
;
337 * Get indexes of color components for a basic color format, such as
338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
342 get_component_indexes(GLenum format
,
347 GLint
*luminanceIndex
,
348 GLint
*intensityIndex
)
354 *luminanceIndex
= -1;
355 *intensityIndex
= -1;
359 case GL_LUMINANCE_INTEGER_EXT
:
362 case GL_LUMINANCE_ALPHA
:
363 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
371 case GL_RED_INTEGER_EXT
:
375 case GL_GREEN_INTEGER_EXT
:
379 case GL_BLUE_INTEGER_EXT
:
383 case GL_ALPHA_INTEGER_EXT
:
392 case GL_RGB_INTEGER_EXT
:
398 case GL_BGR_INTEGER_EXT
:
404 case GL_RGBA_INTEGER_EXT
:
411 case GL_BGRA_INTEGER
:
429 assert(0 && "bad format in get_component_indexes()");
436 * For small integer types, return the min and max possible values.
437 * Used for clamping floats to unscaled integer types.
438 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
441 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
448 case GL_UNSIGNED_BYTE
:
456 case GL_UNSIGNED_SHORT
:
465 /* Customization of 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) << 5)
561 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 2)
562 | (CLAMP(rgba
[i
][BCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) )
573 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 3)
574 | (CLAMP(rgba
[i
][BCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
585 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
586 | (CLAMP(rgba
[i
][BCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
597 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
598 | (CLAMP(rgba
[i
][BCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 12)
609 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
610 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
611 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
614 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
615 GLushort
*dst
= (GLushort
*) dstAddr
;
617 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 12)
618 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
619 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 4)
620 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
623 else if (dstFormat
== GL_ABGR_EXT
) {
624 GLushort
*dst
= (GLushort
*) dstAddr
;
626 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12)
627 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
628 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
629 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) )
640 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
641 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
642 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
645 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
646 GLushort
*dst
= (GLushort
*) dstAddr
;
648 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) )
649 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
650 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 8)
651 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
654 else if (dstFormat
== GL_ABGR_EXT
) {
655 GLushort
*dst
= (GLushort
*) dstAddr
;
657 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) )
658 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
659 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
660 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
671 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
672 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 1)
673 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
676 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
677 GLushort
*dst
= (GLushort
*) dstAddr
;
679 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 11)
680 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
681 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 1)
682 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
685 else if (dstFormat
== GL_ABGR_EXT
) {
686 GLushort
*dst
= (GLushort
*) dstAddr
;
688 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) << 11)
689 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 6)
690 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 1)
691 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
702 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
703 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 10)
704 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
707 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
708 GLushort
*dst
= (GLushort
*) dstAddr
;
710 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) )
711 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
712 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 10)
713 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
716 else if (dstFormat
== GL_ABGR_EXT
) {
717 GLushort
*dst
= (GLushort
*) dstAddr
;
719 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) )
720 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 5)
721 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 10)
722 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 24)
733 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
734 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
735 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
738 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
739 GLuint
*dst
= (GLuint
*) dstAddr
;
741 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 24)
742 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
743 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 8)
744 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
747 else if (dstFormat
== GL_ABGR_EXT
) {
748 GLuint
*dst
= (GLuint
*) dstAddr
;
750 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24)
751 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
752 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
753 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) )
764 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
765 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
766 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
769 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
770 GLuint
*dst
= (GLuint
*) dstAddr
;
772 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) )
773 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
774 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 16)
775 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
778 else if (dstFormat
== GL_ABGR_EXT
) {
779 GLuint
*dst
= (GLuint
*) dstAddr
;
781 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) )
782 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
783 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
784 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 22)
795 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
796 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 2)
797 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
800 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
801 GLuint
*dst
= (GLuint
*) dstAddr
;
803 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 22)
804 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
805 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 2)
806 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
809 else if (dstFormat
== GL_ABGR_EXT
) {
810 GLuint
*dst
= (GLuint
*) dstAddr
;
812 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) << 22)
813 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 12)
814 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 2)
815 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) )
826 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
827 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 20)
828 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
831 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
832 GLuint
*dst
= (GLuint
*) dstAddr
;
834 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) )
835 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
836 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 20)
837 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
840 else if (dstFormat
== GL_ABGR_EXT
) {
841 GLuint
*dst
= (GLuint
*) dstAddr
;
843 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) )
844 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 10)
845 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 20)
846 | (CLAMP(rgba
[i
][RCOMP
], 0, 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
= (GLfloat
*) 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(rgba
[i
][RCOMP
]);
1496 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1500 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1504 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1508 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
1510 case GL_LUMINANCE_ALPHA
:
1512 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
1513 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1518 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1519 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1524 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1525 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1526 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1531 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1532 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1533 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1534 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1539 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1540 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1541 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1546 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1547 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1548 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1549 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1554 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
1555 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
1556 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1557 dst
[i
*4+3] = FLOAT_TO_BYTE(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(rgba
[i
][RCOMP
]);
1635 dst
[i
*2+1] = FLOAT_TO_BYTE(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(rgba
[i
][RCOMP
]);
1810 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1814 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1818 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1822 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1824 case GL_LUMINANCE_ALPHA
:
1826 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1827 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1832 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1833 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1838 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1839 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1840 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1845 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1846 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1847 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1848 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1853 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1854 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1855 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1860 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1861 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1862 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1863 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1868 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1869 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1870 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1871 dst
[i
*4+3] = FLOAT_TO_SHORT(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(rgba
[i
][RCOMP
]);
1949 dst
[i
*2+1] = FLOAT_TO_SHORT(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
;
3644 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
3648 const GLuint
*uisrc
= (const GLuint
*) src
;
3650 for (i
= 0; i
< n
; i
++) {
3651 GLuint p
= uisrc
[i
];
3652 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3653 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3654 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3655 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
3659 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3661 const GLuint
*uisrc
= (const GLuint
*) src
;
3664 for (i
= 0; i
< n
; i
++) {
3665 GLuint p
= uisrc
[i
];
3667 rgb9e5_to_float3(p
, f
);
3668 rgba
[i
][rDst
] = f
[0];
3669 rgba
[i
][gDst
] = f
[1];
3670 rgba
[i
][bDst
] = f
[2];
3671 rgba
[i
][aDst
] = 1.0F
;
3675 const GLuint
*uisrc
= (const GLuint
*) src
;
3678 for (i
= 0; i
< n
; i
++) {
3679 rgb9e5_to_float3(uisrc
[i
], f
);
3680 rgba
[i
][rDst
] = f
[0];
3681 rgba
[i
][gDst
] = f
[1];
3682 rgba
[i
][bDst
] = f
[2];
3683 rgba
[i
][aDst
] = 1.0F
;
3687 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3689 const GLuint
*uisrc
= (const GLuint
*) src
;
3692 for (i
= 0; i
< n
; i
++) {
3693 GLuint p
= uisrc
[i
];
3695 r11g11b10f_to_float3(p
, f
);
3696 rgba
[i
][rDst
] = f
[0];
3697 rgba
[i
][gDst
] = f
[1];
3698 rgba
[i
][bDst
] = f
[2];
3699 rgba
[i
][aDst
] = 1.0F
;
3703 const GLuint
*uisrc
= (const GLuint
*) src
;
3706 for (i
= 0; i
< n
; i
++) {
3707 r11g11b10f_to_float3(uisrc
[i
], f
);
3708 rgba
[i
][rDst
] = f
[0];
3709 rgba
[i
][gDst
] = f
[1];
3710 rgba
[i
][bDst
] = f
[2];
3711 rgba
[i
][aDst
] = 1.0F
;
3716 _mesa_problem(NULL
, "bad srcType in extract float data");
3723 static inline GLuint
3724 clamp_float_to_uint(GLfloat f
)
3726 return f
< 0.0F
? 0 : F_TO_I(f
);
3730 static inline GLuint
3731 clamp_half_to_uint(GLhalfARB h
)
3733 GLfloat f
= _mesa_half_to_float(h
);
3734 return f
< 0.0F
? 0 : F_TO_I(f
);
3739 * \sa extract_float_rgba()
3742 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3743 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3744 GLboolean swapBytes
)
3746 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3748 GLint rDst
, bDst
, gDst
, aDst
;
3750 ASSERT(srcFormat
== GL_RED
||
3751 srcFormat
== GL_GREEN
||
3752 srcFormat
== GL_BLUE
||
3753 srcFormat
== GL_ALPHA
||
3754 srcFormat
== GL_LUMINANCE
||
3755 srcFormat
== GL_LUMINANCE_ALPHA
||
3756 srcFormat
== GL_INTENSITY
||
3757 srcFormat
== GL_RG
||
3758 srcFormat
== GL_RGB
||
3759 srcFormat
== GL_BGR
||
3760 srcFormat
== GL_RGBA
||
3761 srcFormat
== GL_BGRA
||
3762 srcFormat
== GL_ABGR_EXT
||
3763 srcFormat
== GL_DU8DV8_ATI
||
3764 srcFormat
== GL_DUDV_ATI
||
3765 srcFormat
== GL_RED_INTEGER_EXT
||
3766 srcFormat
== GL_RG_INTEGER
||
3767 srcFormat
== GL_GREEN_INTEGER_EXT
||
3768 srcFormat
== GL_BLUE_INTEGER_EXT
||
3769 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3770 srcFormat
== GL_RGB_INTEGER_EXT
||
3771 srcFormat
== GL_RGBA_INTEGER_EXT
||
3772 srcFormat
== GL_BGR_INTEGER_EXT
||
3773 srcFormat
== GL_BGRA_INTEGER_EXT
||
3774 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3775 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3777 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3778 srcType
== GL_BYTE
||
3779 srcType
== GL_UNSIGNED_SHORT
||
3780 srcType
== GL_SHORT
||
3781 srcType
== GL_UNSIGNED_INT
||
3782 srcType
== GL_INT
||
3783 srcType
== GL_HALF_FLOAT_ARB
||
3784 srcType
== GL_FLOAT
||
3785 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3786 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3787 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3788 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3789 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3790 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3791 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3792 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3793 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3794 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3795 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3796 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3797 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3798 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3800 get_component_mapping(srcFormat
,
3801 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3802 &rDst
, &gDst
, &bDst
, &aDst
);
3804 stride
= _mesa_components_in_format(srcFormat
);
3806 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3807 if ((SRC_INDEX) < 0) { \
3809 for (i = 0; i < n; i++) { \
3810 rgba[i][DST_INDEX] = DEFAULT; \
3813 else if (swapBytes) { \
3814 const TYPE *s = (const TYPE *) src; \
3816 for (i = 0; i < n; i++) { \
3817 TYPE value = s[SRC_INDEX]; \
3818 if (sizeof(TYPE) == 2) { \
3821 else if (sizeof(TYPE) == 4) { \
3824 rgba[i][DST_INDEX] = CONVERSION(value); \
3829 const TYPE *s = (const TYPE *) src; \
3831 for (i = 0; i < n; i++) { \
3832 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3838 case GL_UNSIGNED_BYTE
:
3839 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3840 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3841 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3842 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3845 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3846 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3847 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3848 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3850 case GL_UNSIGNED_SHORT
:
3851 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3852 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3853 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3854 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3857 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3858 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3859 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3860 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3862 case GL_UNSIGNED_INT
:
3863 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3864 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3865 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3866 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3869 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3870 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3871 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3872 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3875 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3876 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3877 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3878 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3880 case GL_HALF_FLOAT_ARB
:
3881 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3882 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3883 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3884 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3886 case GL_UNSIGNED_BYTE_3_3_2
:
3888 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3890 for (i
= 0; i
< n
; i
++) {
3891 GLubyte p
= ubsrc
[i
];
3892 rgba
[i
][rDst
] = ((p
>> 5) );
3893 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3894 rgba
[i
][bDst
] = ((p
) & 0x3);
3899 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3901 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3903 for (i
= 0; i
< n
; i
++) {
3904 GLubyte p
= ubsrc
[i
];
3905 rgba
[i
][rDst
] = ((p
) & 0x7);
3906 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3907 rgba
[i
][bDst
] = ((p
>> 6) );
3912 case GL_UNSIGNED_SHORT_5_6_5
:
3914 const GLushort
*ussrc
= (const GLushort
*) src
;
3916 for (i
= 0; i
< n
; i
++) {
3917 GLushort p
= ussrc
[i
];
3919 rgba
[i
][rDst
] = ((p
>> 11) );
3920 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3921 rgba
[i
][bDst
] = ((p
) & 0x1f);
3926 const GLushort
*ussrc
= (const GLushort
*) src
;
3928 for (i
= 0; i
< n
; i
++) {
3929 GLushort p
= ussrc
[i
];
3930 rgba
[i
][rDst
] = ((p
>> 11) );
3931 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3932 rgba
[i
][bDst
] = ((p
) & 0x1f);
3937 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3939 const GLushort
*ussrc
= (const GLushort
*) src
;
3941 for (i
= 0; i
< n
; i
++) {
3942 GLushort p
= ussrc
[i
];
3944 rgba
[i
][rDst
] = ((p
) & 0x1f);
3945 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3946 rgba
[i
][bDst
] = ((p
>> 11) );
3951 const GLushort
*ussrc
= (const GLushort
*) src
;
3953 for (i
= 0; i
< n
; i
++) {
3954 GLushort p
= ussrc
[i
];
3955 rgba
[i
][rDst
] = ((p
) & 0x1f);
3956 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3957 rgba
[i
][bDst
] = ((p
>> 11) );
3962 case GL_UNSIGNED_SHORT_4_4_4_4
:
3964 const GLushort
*ussrc
= (const GLushort
*) src
;
3966 for (i
= 0; i
< n
; i
++) {
3967 GLushort p
= ussrc
[i
];
3969 rgba
[i
][rDst
] = ((p
>> 12) );
3970 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3971 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3972 rgba
[i
][aDst
] = ((p
) & 0xf);
3976 const GLushort
*ussrc
= (const GLushort
*) src
;
3978 for (i
= 0; i
< n
; i
++) {
3979 GLushort p
= ussrc
[i
];
3980 rgba
[i
][rDst
] = ((p
>> 12) );
3981 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3982 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3983 rgba
[i
][aDst
] = ((p
) & 0xf);
3987 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3989 const GLushort
*ussrc
= (const GLushort
*) src
;
3991 for (i
= 0; i
< n
; i
++) {
3992 GLushort p
= ussrc
[i
];
3994 rgba
[i
][rDst
] = ((p
) & 0xf);
3995 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3996 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3997 rgba
[i
][aDst
] = ((p
>> 12) );
4001 const GLushort
*ussrc
= (const GLushort
*) src
;
4003 for (i
= 0; i
< n
; i
++) {
4004 GLushort p
= ussrc
[i
];
4005 rgba
[i
][rDst
] = ((p
) & 0xf);
4006 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
4007 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
4008 rgba
[i
][aDst
] = ((p
>> 12) );
4012 case GL_UNSIGNED_SHORT_5_5_5_1
:
4014 const GLushort
*ussrc
= (const GLushort
*) src
;
4016 for (i
= 0; i
< n
; i
++) {
4017 GLushort p
= ussrc
[i
];
4019 rgba
[i
][rDst
] = ((p
>> 11) );
4020 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
4021 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
4022 rgba
[i
][aDst
] = ((p
) & 0x1 );
4026 const GLushort
*ussrc
= (const GLushort
*) src
;
4028 for (i
= 0; i
< n
; i
++) {
4029 GLushort p
= ussrc
[i
];
4030 rgba
[i
][rDst
] = ((p
>> 11) );
4031 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
4032 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
4033 rgba
[i
][aDst
] = ((p
) & 0x1 );
4037 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
4039 const GLushort
*ussrc
= (const GLushort
*) src
;
4041 for (i
= 0; i
< n
; i
++) {
4042 GLushort p
= ussrc
[i
];
4044 rgba
[i
][rDst
] = ((p
) & 0x1f);
4045 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
4046 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
4047 rgba
[i
][aDst
] = ((p
>> 15) );
4051 const GLushort
*ussrc
= (const GLushort
*) src
;
4053 for (i
= 0; i
< n
; i
++) {
4054 GLushort p
= ussrc
[i
];
4055 rgba
[i
][rDst
] = ((p
) & 0x1f);
4056 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
4057 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
4058 rgba
[i
][aDst
] = ((p
>> 15) );
4062 case GL_UNSIGNED_INT_8_8_8_8
:
4064 const GLuint
*uisrc
= (const GLuint
*) src
;
4066 for (i
= 0; i
< n
; i
++) {
4067 GLuint p
= uisrc
[i
];
4068 rgba
[i
][rDst
] = ((p
) & 0xff);
4069 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4070 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4071 rgba
[i
][aDst
] = ((p
>> 24) );
4075 const GLuint
*uisrc
= (const GLuint
*) src
;
4077 for (i
= 0; i
< n
; i
++) {
4078 GLuint p
= uisrc
[i
];
4079 rgba
[i
][rDst
] = ((p
>> 24) );
4080 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4081 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4082 rgba
[i
][aDst
] = ((p
) & 0xff);
4086 case GL_UNSIGNED_INT_8_8_8_8_REV
:
4088 const GLuint
*uisrc
= (const GLuint
*) src
;
4090 for (i
= 0; i
< n
; i
++) {
4091 GLuint p
= uisrc
[i
];
4092 rgba
[i
][rDst
] = ((p
>> 24) );
4093 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4094 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4095 rgba
[i
][aDst
] = ((p
) & 0xff);
4099 const GLuint
*uisrc
= (const GLuint
*) src
;
4101 for (i
= 0; i
< n
; i
++) {
4102 GLuint p
= uisrc
[i
];
4103 rgba
[i
][rDst
] = ((p
) & 0xff);
4104 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4105 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4106 rgba
[i
][aDst
] = ((p
>> 24) );
4110 case GL_UNSIGNED_INT_10_10_10_2
:
4112 const GLuint
*uisrc
= (const GLuint
*) src
;
4114 for (i
= 0; i
< n
; i
++) {
4115 GLuint p
= uisrc
[i
];
4117 rgba
[i
][rDst
] = ((p
>> 22) );
4118 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4119 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4120 rgba
[i
][aDst
] = ((p
) & 0x3 );
4124 const GLuint
*uisrc
= (const GLuint
*) src
;
4126 for (i
= 0; i
< n
; i
++) {
4127 GLuint p
= uisrc
[i
];
4128 rgba
[i
][rDst
] = ((p
>> 22) );
4129 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4130 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4131 rgba
[i
][aDst
] = ((p
) & 0x3 );
4135 case GL_UNSIGNED_INT_2_10_10_10_REV
:
4137 const GLuint
*uisrc
= (const GLuint
*) src
;
4139 for (i
= 0; i
< n
; i
++) {
4140 GLuint p
= uisrc
[i
];
4142 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4143 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4144 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4145 rgba
[i
][aDst
] = ((p
>> 30) );
4149 const GLuint
*uisrc
= (const GLuint
*) src
;
4151 for (i
= 0; i
< n
; i
++) {
4152 GLuint p
= uisrc
[i
];
4153 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4154 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4155 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4156 rgba
[i
][aDst
] = ((p
>> 30) );
4160 case GL_UNSIGNED_INT_5_9_9_9_REV
:
4162 const GLuint
*uisrc
= (const GLuint
*) src
;
4165 for (i
= 0; i
< n
; i
++) {
4166 GLuint p
= uisrc
[i
];
4168 rgb9e5_to_float3(p
, f
);
4169 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4170 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4171 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4176 const GLuint
*uisrc
= (const GLuint
*) src
;
4179 for (i
= 0; i
< n
; i
++) {
4180 GLuint p
= uisrc
[i
];
4181 rgb9e5_to_float3(p
, f
);
4182 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4183 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4184 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4189 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
4191 const GLuint
*uisrc
= (const GLuint
*) src
;
4194 for (i
= 0; i
< n
; i
++) {
4195 GLuint p
= uisrc
[i
];
4197 r11g11b10f_to_float3(p
, f
);
4198 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4199 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4200 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4205 const GLuint
*uisrc
= (const GLuint
*) src
;
4208 for (i
= 0; i
< n
; i
++) {
4209 GLuint p
= uisrc
[i
];
4210 r11g11b10f_to_float3(p
, f
);
4211 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4212 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4213 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4219 _mesa_problem(NULL
, "bad srcType in extract uint data");
4228 * Unpack a row of color image data from a client buffer according to
4229 * the pixel unpacking parameters.
4230 * Return GLubyte values in the specified dest image format.
4231 * This is used by glDrawPixels and glTexImage?D().
4232 * \param ctx - the context
4233 * n - number of pixels in the span
4234 * dstFormat - format of destination color array
4235 * dest - the destination color array
4236 * srcFormat - source image format
4237 * srcType - source image data type
4238 * source - source image pointer
4239 * srcPacking - pixel unpacking parameters
4240 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
4242 * XXX perhaps expand this to process whole images someday.
4245 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
4246 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
4247 GLenum srcFormat
, GLenum srcType
,
4248 const GLvoid
*source
,
4249 const struct gl_pixelstore_attrib
*srcPacking
,
4250 GLbitfield transferOps
)
4252 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4253 ASSERT(dstFormat
== GL_ALPHA
||
4254 dstFormat
== GL_LUMINANCE
||
4255 dstFormat
== GL_LUMINANCE_ALPHA
||
4256 dstFormat
== GL_INTENSITY
||
4257 dstFormat
== GL_RED
||
4258 dstFormat
== GL_RG
||
4259 dstFormat
== GL_RGB
||
4260 dstFormat
== GL_RGBA
);
4262 ASSERT(srcFormat
== GL_RED
||
4263 srcFormat
== GL_GREEN
||
4264 srcFormat
== GL_BLUE
||
4265 srcFormat
== GL_ALPHA
||
4266 srcFormat
== GL_LUMINANCE
||
4267 srcFormat
== GL_LUMINANCE_ALPHA
||
4268 srcFormat
== GL_INTENSITY
||
4269 srcFormat
== GL_RG
||
4270 srcFormat
== GL_RGB
||
4271 srcFormat
== GL_BGR
||
4272 srcFormat
== GL_RGBA
||
4273 srcFormat
== GL_BGRA
||
4274 srcFormat
== GL_ABGR_EXT
||
4275 srcFormat
== GL_COLOR_INDEX
);
4277 ASSERT(srcType
== GL_BITMAP
||
4278 srcType
== GL_UNSIGNED_BYTE
||
4279 srcType
== GL_BYTE
||
4280 srcType
== GL_UNSIGNED_SHORT
||
4281 srcType
== GL_SHORT
||
4282 srcType
== GL_UNSIGNED_INT
||
4283 srcType
== GL_INT
||
4284 srcType
== GL_HALF_FLOAT_ARB
||
4285 srcType
== GL_FLOAT
||
4286 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4287 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4288 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4289 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4290 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4291 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4292 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4293 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4294 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4295 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4296 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4297 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4298 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4299 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4301 /* EXT_texture_integer specifies no transfer ops on integer
4302 * types in the resolved issues section. Just set them to 0
4303 * for integer surfaces.
4308 /* Try simple cases first */
4309 if (transferOps
== 0) {
4310 if (srcType
== GL_UNSIGNED_BYTE
) {
4311 if (dstFormat
== GL_RGBA
) {
4312 if (srcFormat
== GL_RGBA
) {
4313 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
4316 else if (srcFormat
== GL_RGB
) {
4318 const GLubyte
*src
= (const GLubyte
*) source
;
4319 GLubyte
*dst
= dest
;
4320 for (i
= 0; i
< n
; i
++) {
4331 else if (dstFormat
== GL_RGB
) {
4332 if (srcFormat
== GL_RGB
) {
4333 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
4336 else if (srcFormat
== GL_RGBA
) {
4338 const GLubyte
*src
= (const GLubyte
*) source
;
4339 GLubyte
*dst
= dest
;
4340 for (i
= 0; i
< n
; i
++) {
4350 else if (dstFormat
== srcFormat
) {
4351 GLint comps
= _mesa_components_in_format(srcFormat
);
4353 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
4360 /* general solution begins here */
4362 GLint dstComponents
;
4363 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4364 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4367 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4371 dstComponents
= _mesa_components_in_format( dstFormat
);
4372 /* source & dest image formats should have been error checked by now */
4373 assert(dstComponents
> 0);
4376 * Extract image data and convert to RGBA floats
4378 if (srcFormat
== GL_COLOR_INDEX
) {
4379 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4382 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4387 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4390 /* Convert indexes to RGBA */
4391 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4392 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4394 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4396 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4397 * with color indexes.
4399 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4404 /* non-color index data */
4405 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4406 srcPacking
->SwapBytes
);
4409 /* Need to clamp if returning GLubytes */
4410 transferOps
|= IMAGE_CLAMP_BIT
;
4413 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4416 get_component_indexes(dstFormat
,
4417 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4419 /* Now return the GLubyte data in the requested dstFormat */
4421 GLubyte
*dst
= dest
;
4423 for (i
= 0; i
< n
; i
++) {
4424 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
4425 dst
+= dstComponents
;
4430 GLubyte
*dst
= dest
;
4432 for (i
= 0; i
< n
; i
++) {
4433 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
4434 dst
+= dstComponents
;
4439 GLubyte
*dst
= dest
;
4441 for (i
= 0; i
< n
; i
++) {
4442 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
4443 dst
+= dstComponents
;
4448 GLubyte
*dst
= dest
;
4450 for (i
= 0; i
< n
; i
++) {
4451 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
4452 dst
+= dstComponents
;
4457 GLubyte
*dst
= dest
;
4460 assert(dstComponents
== 1);
4461 for (i
= 0; i
< n
; i
++) {
4462 /* Intensity comes from red channel */
4463 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
4468 GLubyte
*dst
= dest
;
4471 for (i
= 0; i
< n
; i
++) {
4472 /* Luminance comes from red channel */
4473 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
4474 dst
+= dstComponents
;
4484 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
4485 * instead of GLubyte.
4488 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
4489 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4490 GLenum srcFormat
, GLenum srcType
,
4491 const GLvoid
*source
,
4492 const struct gl_pixelstore_attrib
*srcPacking
,
4493 GLbitfield transferOps
)
4495 ASSERT(dstFormat
== GL_ALPHA
||
4496 dstFormat
== GL_LUMINANCE
||
4497 dstFormat
== GL_LUMINANCE_ALPHA
||
4498 dstFormat
== GL_INTENSITY
||
4499 dstFormat
== GL_RED
||
4500 dstFormat
== GL_RG
||
4501 dstFormat
== GL_RGB
||
4502 dstFormat
== GL_RGBA
);
4504 ASSERT(srcFormat
== GL_RED
||
4505 srcFormat
== GL_GREEN
||
4506 srcFormat
== GL_BLUE
||
4507 srcFormat
== GL_ALPHA
||
4508 srcFormat
== GL_LUMINANCE
||
4509 srcFormat
== GL_LUMINANCE_ALPHA
||
4510 srcFormat
== GL_INTENSITY
||
4511 srcFormat
== GL_RG
||
4512 srcFormat
== GL_RGB
||
4513 srcFormat
== GL_BGR
||
4514 srcFormat
== GL_RGBA
||
4515 srcFormat
== GL_BGRA
||
4516 srcFormat
== GL_ABGR_EXT
||
4517 srcFormat
== GL_RED_INTEGER_EXT
||
4518 srcFormat
== GL_GREEN_INTEGER_EXT
||
4519 srcFormat
== GL_BLUE_INTEGER_EXT
||
4520 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4521 srcFormat
== GL_RG_INTEGER
||
4522 srcFormat
== GL_RGB_INTEGER_EXT
||
4523 srcFormat
== GL_RGBA_INTEGER_EXT
||
4524 srcFormat
== GL_BGR_INTEGER_EXT
||
4525 srcFormat
== GL_BGRA_INTEGER_EXT
||
4526 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4527 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4528 srcFormat
== GL_COLOR_INDEX
);
4530 ASSERT(srcType
== GL_BITMAP
||
4531 srcType
== GL_UNSIGNED_BYTE
||
4532 srcType
== GL_BYTE
||
4533 srcType
== GL_UNSIGNED_SHORT
||
4534 srcType
== GL_SHORT
||
4535 srcType
== GL_UNSIGNED_INT
||
4536 srcType
== GL_INT
||
4537 srcType
== GL_HALF_FLOAT_ARB
||
4538 srcType
== GL_FLOAT
||
4539 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4540 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4541 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4542 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4543 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4544 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4545 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4546 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4547 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4548 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4549 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4550 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4551 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4552 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4554 /* general solution, no special cases, yet */
4556 GLint dstComponents
;
4557 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4558 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4559 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4562 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4566 dstComponents
= _mesa_components_in_format( dstFormat
);
4567 /* source & dest image formats should have been error checked by now */
4568 assert(dstComponents
> 0);
4570 /* EXT_texture_integer specifies no transfer ops on integer
4571 * types in the resolved issues section. Just set them to 0
4572 * for integer surfaces.
4578 * Extract image data and convert to RGBA floats
4580 if (srcFormat
== GL_COLOR_INDEX
) {
4581 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4584 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4589 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4592 /* Convert indexes to RGBA */
4593 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4594 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4596 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4598 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4599 * with color indexes.
4601 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4606 /* non-color index data */
4607 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4608 srcPacking
->SwapBytes
);
4612 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4615 get_component_indexes(dstFormat
,
4616 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4618 /* Now pack results in the requested dstFormat */
4620 GLfloat
*dst
= dest
;
4622 for (i
= 0; i
< n
; i
++) {
4623 dst
[rDst
] = rgba
[i
][RCOMP
];
4624 dst
+= dstComponents
;
4629 GLfloat
*dst
= dest
;
4631 for (i
= 0; i
< n
; i
++) {
4632 dst
[gDst
] = rgba
[i
][GCOMP
];
4633 dst
+= dstComponents
;
4638 GLfloat
*dst
= dest
;
4640 for (i
= 0; i
< n
; i
++) {
4641 dst
[bDst
] = rgba
[i
][BCOMP
];
4642 dst
+= dstComponents
;
4647 GLfloat
*dst
= dest
;
4649 for (i
= 0; i
< n
; i
++) {
4650 dst
[aDst
] = rgba
[i
][ACOMP
];
4651 dst
+= dstComponents
;
4656 GLfloat
*dst
= dest
;
4659 assert(dstComponents
== 1);
4660 for (i
= 0; i
< n
; i
++) {
4661 /* Intensity comes from red channel */
4662 dst
[i
] = rgba
[i
][RCOMP
];
4667 GLfloat
*dst
= dest
;
4670 for (i
= 0; i
< n
; i
++) {
4671 /* Luminance comes from red channel */
4672 dst
[0] = rgba
[i
][RCOMP
];
4673 dst
+= dstComponents
;
4683 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4684 * instead of GLubyte.
4685 * No pixel transfer ops are applied.
4688 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4689 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4690 GLenum srcFormat
, GLenum srcType
,
4691 const GLvoid
*source
,
4692 const struct gl_pixelstore_attrib
*srcPacking
)
4694 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
4697 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4701 ASSERT(dstFormat
== GL_ALPHA
||
4702 dstFormat
== GL_LUMINANCE
||
4703 dstFormat
== GL_LUMINANCE_ALPHA
||
4704 dstFormat
== GL_INTENSITY
||
4705 dstFormat
== GL_RED
||
4706 dstFormat
== GL_RG
||
4707 dstFormat
== GL_RGB
||
4708 dstFormat
== GL_RGBA
);
4710 ASSERT(srcFormat
== GL_RED
||
4711 srcFormat
== GL_GREEN
||
4712 srcFormat
== GL_BLUE
||
4713 srcFormat
== GL_ALPHA
||
4714 srcFormat
== GL_LUMINANCE
||
4715 srcFormat
== GL_LUMINANCE_ALPHA
||
4716 srcFormat
== GL_INTENSITY
||
4717 srcFormat
== GL_RG
||
4718 srcFormat
== GL_RGB
||
4719 srcFormat
== GL_BGR
||
4720 srcFormat
== GL_RGBA
||
4721 srcFormat
== GL_BGRA
||
4722 srcFormat
== GL_ABGR_EXT
||
4723 srcFormat
== GL_RED_INTEGER_EXT
||
4724 srcFormat
== GL_GREEN_INTEGER_EXT
||
4725 srcFormat
== GL_BLUE_INTEGER_EXT
||
4726 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4727 srcFormat
== GL_RG_INTEGER
||
4728 srcFormat
== GL_RGB_INTEGER_EXT
||
4729 srcFormat
== GL_RGBA_INTEGER_EXT
||
4730 srcFormat
== GL_BGR_INTEGER_EXT
||
4731 srcFormat
== GL_BGRA_INTEGER_EXT
||
4732 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4733 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4735 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4736 srcType
== GL_BYTE
||
4737 srcType
== GL_UNSIGNED_SHORT
||
4738 srcType
== GL_SHORT
||
4739 srcType
== GL_UNSIGNED_INT
||
4740 srcType
== GL_INT
||
4741 srcType
== GL_HALF_FLOAT_ARB
||
4742 srcType
== GL_FLOAT
||
4743 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4744 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4745 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4746 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4747 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4748 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4749 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4750 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4751 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4752 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4753 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4754 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4755 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4756 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4759 /* Extract image data as uint[4] pixels */
4760 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4761 srcPacking
->SwapBytes
);
4763 if (dstFormat
== GL_RGBA
) {
4765 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4769 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4770 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4772 assert(dstComponents
> 0);
4774 get_component_indexes(dstFormat
,
4775 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4777 /* Now pack values in the requested dest format */
4781 for (i
= 0; i
< n
; i
++) {
4782 dst
[rDst
] = rgba
[i
][RCOMP
];
4783 dst
+= dstComponents
;
4790 for (i
= 0; i
< n
; i
++) {
4791 dst
[gDst
] = rgba
[i
][GCOMP
];
4792 dst
+= dstComponents
;
4799 for (i
= 0; i
< n
; i
++) {
4800 dst
[bDst
] = rgba
[i
][BCOMP
];
4801 dst
+= dstComponents
;
4808 for (i
= 0; i
< n
; i
++) {
4809 dst
[aDst
] = rgba
[i
][ACOMP
];
4810 dst
+= dstComponents
;
4818 assert(dstComponents
== 1);
4819 for (i
= 0; i
< n
; i
++) {
4820 /* Intensity comes from red channel */
4821 dst
[i
] = rgba
[i
][RCOMP
];
4829 for (i
= 0; i
< n
; i
++) {
4830 /* Luminance comes from red channel */
4831 dst
[0] = rgba
[i
][RCOMP
];
4832 dst
+= dstComponents
;
4843 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4844 * directly return GLbyte data, no transfer ops apply.
4847 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4848 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4849 GLenum srcFormat
, GLenum srcType
,
4850 const GLvoid
*source
,
4851 const struct gl_pixelstore_attrib
*srcPacking
,
4852 GLbitfield transferOps
)
4854 ASSERT(dstFormat
== GL_DUDV_ATI
);
4855 ASSERT(srcFormat
== GL_DUDV_ATI
||
4856 srcFormat
== GL_DU8DV8_ATI
);
4858 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4859 srcType
== GL_BYTE
||
4860 srcType
== GL_UNSIGNED_SHORT
||
4861 srcType
== GL_SHORT
||
4862 srcType
== GL_UNSIGNED_INT
||
4863 srcType
== GL_INT
||
4864 srcType
== GL_HALF_FLOAT_ARB
||
4865 srcType
== GL_FLOAT
);
4867 /* general solution */
4869 GLint dstComponents
;
4872 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4875 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4879 dstComponents
= _mesa_components_in_format( dstFormat
);
4880 /* source & dest image formats should have been error checked by now */
4881 assert(dstComponents
> 0);
4884 * Extract image data and convert to RGBA floats
4886 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4887 srcPacking
->SwapBytes
);
4890 /* Now determine which color channels we need to produce.
4891 * And determine the dest index (offset) within each color tuple.
4894 /* Now pack results in the requested dstFormat */
4895 for (i
= 0; i
< n
; i
++) {
4896 /* not sure - need clamp[-1,1] here? */
4897 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4898 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4899 dst
+= dstComponents
;
4907 * Unpack a row of color index data from a client buffer according to
4908 * the pixel unpacking parameters.
4909 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4911 * Args: ctx - the context
4912 * n - number of pixels
4913 * dstType - destination data type
4914 * dest - destination array
4915 * srcType - source pixel type
4916 * source - source data pointer
4917 * srcPacking - pixel unpacking parameters
4918 * transferOps - the pixel transfer operations to apply
4921 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4922 GLenum dstType
, GLvoid
*dest
,
4923 GLenum srcType
, const GLvoid
*source
,
4924 const struct gl_pixelstore_attrib
*srcPacking
,
4925 GLbitfield transferOps
)
4927 ASSERT(srcType
== GL_BITMAP
||
4928 srcType
== GL_UNSIGNED_BYTE
||
4929 srcType
== GL_BYTE
||
4930 srcType
== GL_UNSIGNED_SHORT
||
4931 srcType
== GL_SHORT
||
4932 srcType
== GL_UNSIGNED_INT
||
4933 srcType
== GL_INT
||
4934 srcType
== GL_HALF_FLOAT_ARB
||
4935 srcType
== GL_FLOAT
);
4937 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4938 dstType
== GL_UNSIGNED_SHORT
||
4939 dstType
== GL_UNSIGNED_INT
);
4942 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4945 * Try simple cases first
4947 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4948 && dstType
== GL_UNSIGNED_BYTE
) {
4949 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4951 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4952 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4953 memcpy(dest
, source
, n
* sizeof(GLuint
));
4959 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4962 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4966 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4970 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4972 /* convert to dest type */
4974 case GL_UNSIGNED_BYTE
:
4976 GLubyte
*dst
= (GLubyte
*) dest
;
4978 for (i
= 0; i
< n
; i
++) {
4979 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4983 case GL_UNSIGNED_SHORT
:
4985 GLuint
*dst
= (GLuint
*) dest
;
4987 for (i
= 0; i
< n
; i
++) {
4988 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4992 case GL_UNSIGNED_INT
:
4993 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4996 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
5005 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
5006 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
5007 const struct gl_pixelstore_attrib
*dstPacking
,
5008 GLbitfield transferOps
)
5010 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
5013 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5017 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
5019 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
5020 /* make a copy of input */
5021 memcpy(indexes
, source
, n
* sizeof(GLuint
));
5022 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
5027 case GL_UNSIGNED_BYTE
:
5029 GLubyte
*dst
= (GLubyte
*) dest
;
5031 for (i
= 0; i
< n
; i
++) {
5032 *dst
++ = (GLubyte
) source
[i
];
5038 GLbyte
*dst
= (GLbyte
*) dest
;
5040 for (i
= 0; i
< n
; i
++) {
5041 dst
[i
] = (GLbyte
) source
[i
];
5045 case GL_UNSIGNED_SHORT
:
5047 GLushort
*dst
= (GLushort
*) dest
;
5049 for (i
= 0; i
< n
; i
++) {
5050 dst
[i
] = (GLushort
) source
[i
];
5052 if (dstPacking
->SwapBytes
) {
5053 _mesa_swap2( (GLushort
*) dst
, n
);
5059 GLshort
*dst
= (GLshort
*) dest
;
5061 for (i
= 0; i
< n
; i
++) {
5062 dst
[i
] = (GLshort
) source
[i
];
5064 if (dstPacking
->SwapBytes
) {
5065 _mesa_swap2( (GLushort
*) dst
, n
);
5069 case GL_UNSIGNED_INT
:
5071 GLuint
*dst
= (GLuint
*) dest
;
5073 for (i
= 0; i
< n
; i
++) {
5074 dst
[i
] = (GLuint
) source
[i
];
5076 if (dstPacking
->SwapBytes
) {
5077 _mesa_swap4( (GLuint
*) dst
, n
);
5083 GLint
*dst
= (GLint
*) dest
;
5085 for (i
= 0; i
< n
; i
++) {
5086 dst
[i
] = (GLint
) source
[i
];
5088 if (dstPacking
->SwapBytes
) {
5089 _mesa_swap4( (GLuint
*) dst
, n
);
5095 GLfloat
*dst
= (GLfloat
*) dest
;
5097 for (i
= 0; i
< n
; i
++) {
5098 dst
[i
] = (GLfloat
) source
[i
];
5100 if (dstPacking
->SwapBytes
) {
5101 _mesa_swap4( (GLuint
*) dst
, n
);
5105 case GL_HALF_FLOAT_ARB
:
5107 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5109 for (i
= 0; i
< n
; i
++) {
5110 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
5112 if (dstPacking
->SwapBytes
) {
5113 _mesa_swap2( (GLushort
*) dst
, n
);
5118 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5126 * Unpack a row of stencil data from a client buffer according to
5127 * the pixel unpacking parameters.
5128 * This is (or will be) used by glDrawPixels
5130 * Args: ctx - the context
5131 * n - number of pixels
5132 * dstType - destination data type
5133 * dest - destination array
5134 * srcType - source pixel type
5135 * source - source data pointer
5136 * srcPacking - pixel unpacking parameters
5137 * transferOps - apply offset/bias/lookup ops?
5140 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5141 GLenum dstType
, GLvoid
*dest
,
5142 GLenum srcType
, const GLvoid
*source
,
5143 const struct gl_pixelstore_attrib
*srcPacking
,
5144 GLbitfield transferOps
)
5146 ASSERT(srcType
== GL_BITMAP
||
5147 srcType
== GL_UNSIGNED_BYTE
||
5148 srcType
== GL_BYTE
||
5149 srcType
== GL_UNSIGNED_SHORT
||
5150 srcType
== GL_SHORT
||
5151 srcType
== GL_UNSIGNED_INT
||
5152 srcType
== GL_INT
||
5153 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
5154 srcType
== GL_HALF_FLOAT_ARB
||
5155 srcType
== GL_FLOAT
||
5156 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5158 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
5159 dstType
== GL_UNSIGNED_SHORT
||
5160 dstType
== GL_UNSIGNED_INT
||
5161 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5163 /* only shift and offset apply to stencil */
5164 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
5167 * Try simple cases first
5169 if (transferOps
== 0 &&
5170 !ctx
->Pixel
.MapStencilFlag
&&
5171 srcType
== GL_UNSIGNED_BYTE
&&
5172 dstType
== GL_UNSIGNED_BYTE
) {
5173 memcpy(dest
, source
, n
* sizeof(GLubyte
));
5175 else if (transferOps
== 0 &&
5176 !ctx
->Pixel
.MapStencilFlag
&&
5177 srcType
== GL_UNSIGNED_INT
&&
5178 dstType
== GL_UNSIGNED_INT
&&
5179 !srcPacking
->SwapBytes
) {
5180 memcpy(dest
, source
, n
* sizeof(GLuint
));
5186 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
5189 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
5193 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
5196 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
5197 /* shift and offset indexes */
5198 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
5201 if (ctx
->Pixel
.MapStencilFlag
) {
5202 /* Apply stencil lookup table */
5203 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
5205 for (i
= 0; i
< n
; i
++) {
5206 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
5210 /* convert to dest type */
5212 case GL_UNSIGNED_BYTE
:
5214 GLubyte
*dst
= (GLubyte
*) dest
;
5216 for (i
= 0; i
< n
; i
++) {
5217 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
5221 case GL_UNSIGNED_SHORT
:
5223 GLuint
*dst
= (GLuint
*) dest
;
5225 for (i
= 0; i
< n
; i
++) {
5226 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
5230 case GL_UNSIGNED_INT
:
5231 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
5233 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5235 GLuint
*dst
= (GLuint
*) dest
;
5237 for (i
= 0; i
< n
; i
++) {
5238 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
5243 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
5252 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5253 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
5254 const struct gl_pixelstore_attrib
*dstPacking
)
5256 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5259 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
5263 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
5264 ctx
->Pixel
.MapStencilFlag
) {
5265 /* make a copy of input */
5266 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
5267 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
5272 case GL_UNSIGNED_BYTE
:
5273 memcpy(dest
, source
, n
);
5277 GLbyte
*dst
= (GLbyte
*) dest
;
5280 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
5284 case GL_UNSIGNED_SHORT
:
5286 GLushort
*dst
= (GLushort
*) dest
;
5289 dst
[i
] = (GLushort
) source
[i
];
5291 if (dstPacking
->SwapBytes
) {
5292 _mesa_swap2( (GLushort
*) dst
, n
);
5298 GLshort
*dst
= (GLshort
*) dest
;
5301 dst
[i
] = (GLshort
) source
[i
];
5303 if (dstPacking
->SwapBytes
) {
5304 _mesa_swap2( (GLushort
*) dst
, n
);
5308 case GL_UNSIGNED_INT
:
5310 GLuint
*dst
= (GLuint
*) dest
;
5313 dst
[i
] = (GLuint
) source
[i
];
5315 if (dstPacking
->SwapBytes
) {
5316 _mesa_swap4( (GLuint
*) dst
, n
);
5322 GLint
*dst
= (GLint
*) dest
;
5325 dst
[i
] = (GLint
) source
[i
];
5327 if (dstPacking
->SwapBytes
) {
5328 _mesa_swap4( (GLuint
*) dst
, n
);
5334 GLfloat
*dst
= (GLfloat
*) dest
;
5337 dst
[i
] = (GLfloat
) source
[i
];
5339 if (dstPacking
->SwapBytes
) {
5340 _mesa_swap4( (GLuint
*) dst
, n
);
5344 case GL_HALF_FLOAT_ARB
:
5346 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5349 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5351 if (dstPacking
->SwapBytes
) {
5352 _mesa_swap2( (GLushort
*) dst
, n
);
5357 if (dstPacking
->LsbFirst
) {
5358 GLubyte
*dst
= (GLubyte
*) dest
;
5361 for (i
= 0; i
< n
; i
++) {
5364 *dst
|= ((source
[i
] != 0) << shift
);
5373 GLubyte
*dst
= (GLubyte
*) dest
;
5376 for (i
= 0; i
< n
; i
++) {
5379 *dst
|= ((source
[i
] != 0) << shift
);
5389 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5395 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5398 const GLTYPE *src = (const GLTYPE *)source; \
5399 for (i = 0; i < n; i++) { \
5400 GLTYPE value = src[i]; \
5401 if (srcPacking->SwapBytes) { \
5402 if (sizeof(GLTYPE) == 2) { \
5404 } else if (sizeof(GLTYPE) == 4) { \
5408 depthValues[i] = GLTYPE2FLOAT(value); \
5414 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5415 * or GLfloat values.
5416 * The glPixelTransfer (scale/bias) params will be applied.
5418 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5419 * \param depthMax max value for returned GLushort or GLuint values
5420 * (ignored for GLfloat).
5423 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
5424 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5425 GLenum srcType
, const GLvoid
*source
,
5426 const struct gl_pixelstore_attrib
*srcPacking
)
5428 GLfloat
*depthTemp
= NULL
, *depthValues
;
5429 GLboolean needClamp
= GL_FALSE
;
5431 /* Look for special cases first.
5432 * Not only are these faster, they're less prone to numeric conversion
5433 * problems. Otherwise, converting from an int type to a float then
5434 * back to an int type can introduce errors that will show up as
5435 * artifacts in things like depth peeling which uses glCopyTexImage.
5437 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5438 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5439 const GLuint
*src
= (const GLuint
*) source
;
5440 GLushort
*dst
= (GLushort
*) dest
;
5442 for (i
= 0; i
< n
; i
++) {
5443 dst
[i
] = src
[i
] >> 16;
5447 if (srcType
== GL_UNSIGNED_SHORT
5448 && dstType
== GL_UNSIGNED_INT
5449 && depthMax
== 0xffffffff) {
5450 const GLushort
*src
= (const GLushort
*) source
;
5451 GLuint
*dst
= (GLuint
*) dest
;
5453 for (i
= 0; i
< n
; i
++) {
5454 dst
[i
] = src
[i
] | (src
[i
] << 16);
5458 if (srcType
== GL_UNSIGNED_INT_24_8
5459 && dstType
== GL_UNSIGNED_INT
5460 && depthMax
== 0xffffff) {
5461 const GLuint
*src
= (const GLuint
*) source
;
5462 GLuint
*dst
= (GLuint
*) dest
;
5464 for (i
= 0; i
< n
; i
++) {
5465 dst
[i
] = src
[i
] >> 8;
5469 /* XXX may want to add additional cases here someday */
5472 /* general case path follows */
5474 if (dstType
== GL_FLOAT
) {
5475 depthValues
= (GLfloat
*) dest
;
5478 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5480 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
5484 depthValues
= depthTemp
;
5487 /* Convert incoming values to GLfloat. Some conversions will require
5492 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
5493 needClamp
= GL_TRUE
;
5495 case GL_UNSIGNED_BYTE
:
5496 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5499 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
5500 needClamp
= GL_TRUE
;
5502 case GL_UNSIGNED_SHORT
:
5503 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5506 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5507 needClamp
= GL_TRUE
;
5509 case GL_UNSIGNED_INT
:
5510 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5512 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5513 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5514 depthMax
== 0xffffff &&
5515 ctx
->Pixel
.DepthScale
== 1.0 &&
5516 ctx
->Pixel
.DepthBias
== 0.0) {
5517 const GLuint
*src
= (const GLuint
*) source
;
5518 GLuint
*zValues
= (GLuint
*) dest
;
5520 for (i
= 0; i
< n
; i
++) {
5521 GLuint value
= src
[i
];
5522 if (srcPacking
->SwapBytes
) {
5525 zValues
[i
] = value
& 0xffffff00;
5531 const GLuint
*src
= (const GLuint
*) source
;
5532 const GLfloat scale
= 1.0f
/ 0xffffff;
5534 for (i
= 0; i
< n
; i
++) {
5535 GLuint value
= src
[i
];
5536 if (srcPacking
->SwapBytes
) {
5539 depthValues
[i
] = (value
>> 8) * scale
;
5543 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5546 const GLfloat
*src
= (const GLfloat
*)source
;
5547 for (i
= 0; i
< n
; i
++) {
5548 GLfloat value
= src
[i
* 2];
5549 if (srcPacking
->SwapBytes
) {
5552 depthValues
[i
] = value
;
5554 needClamp
= GL_TRUE
;
5558 DEPTH_VALUES(GLfloat
, 1*);
5559 needClamp
= GL_TRUE
;
5561 case GL_HALF_FLOAT_ARB
:
5564 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5565 for (i
= 0; i
< n
; i
++) {
5566 GLhalfARB value
= src
[i
];
5567 if (srcPacking
->SwapBytes
) {
5570 depthValues
[i
] = _mesa_half_to_float(value
);
5572 needClamp
= GL_TRUE
;
5576 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5581 /* apply depth scale and bias */
5583 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5584 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5585 if (scale
!= 1.0 || bias
!= 0.0) {
5587 for (i
= 0; i
< n
; i
++) {
5588 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5590 needClamp
= GL_TRUE
;
5594 /* clamp to [0, 1] */
5597 for (i
= 0; i
< n
; i
++) {
5598 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5603 * Convert values to dstType
5605 if (dstType
== GL_UNSIGNED_INT
) {
5606 GLuint
*zValues
= (GLuint
*) dest
;
5608 if (depthMax
<= 0xffffff) {
5609 /* no overflow worries */
5610 for (i
= 0; i
< n
; i
++) {
5611 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5615 /* need to use double precision to prevent overflow problems */
5616 for (i
= 0; i
< n
; i
++) {
5617 GLdouble z
= depthValues
[i
] * (GLdouble
) depthMax
;
5618 if (z
>= (GLdouble
) 0xffffffff)
5619 zValues
[i
] = 0xffffffff;
5621 zValues
[i
] = (GLuint
) z
;
5625 else if (dstType
== GL_UNSIGNED_SHORT
) {
5626 GLushort
*zValues
= (GLushort
*) dest
;
5628 ASSERT(depthMax
<= 0xffff);
5629 for (i
= 0; i
< n
; i
++) {
5630 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5633 else if (dstType
== GL_FLOAT
) {
5634 /* Nothing to do. depthValues is pointing to dest. */
5636 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
5637 GLfloat
*zValues
= (GLfloat
*) dest
;
5639 for (i
= 0; i
< n
; i
++) {
5640 zValues
[i
*2] = depthValues
[i
];
5652 * Pack an array of depth values. The values are floats in [0,1].
5655 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
5656 GLenum dstType
, const GLfloat
*depthSpan
,
5657 const struct gl_pixelstore_attrib
*dstPacking
)
5659 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5661 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5665 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5666 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5667 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5668 depthSpan
= depthCopy
;
5672 case GL_UNSIGNED_BYTE
:
5674 GLubyte
*dst
= (GLubyte
*) dest
;
5676 for (i
= 0; i
< n
; i
++) {
5677 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5683 GLbyte
*dst
= (GLbyte
*) dest
;
5685 for (i
= 0; i
< n
; i
++) {
5686 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5690 case GL_UNSIGNED_SHORT
:
5692 GLushort
*dst
= (GLushort
*) dest
;
5694 for (i
= 0; i
< n
; i
++) {
5695 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5697 if (dstPacking
->SwapBytes
) {
5698 _mesa_swap2( (GLushort
*) dst
, n
);
5704 GLshort
*dst
= (GLshort
*) dest
;
5706 for (i
= 0; i
< n
; i
++) {
5707 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5709 if (dstPacking
->SwapBytes
) {
5710 _mesa_swap2( (GLushort
*) dst
, n
);
5714 case GL_UNSIGNED_INT
:
5716 GLuint
*dst
= (GLuint
*) dest
;
5718 for (i
= 0; i
< n
; i
++) {
5719 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5721 if (dstPacking
->SwapBytes
) {
5722 _mesa_swap4( (GLuint
*) dst
, n
);
5728 GLint
*dst
= (GLint
*) dest
;
5730 for (i
= 0; i
< n
; i
++) {
5731 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5733 if (dstPacking
->SwapBytes
) {
5734 _mesa_swap4( (GLuint
*) dst
, n
);
5740 GLfloat
*dst
= (GLfloat
*) dest
;
5742 for (i
= 0; i
< n
; i
++) {
5743 dst
[i
] = depthSpan
[i
];
5745 if (dstPacking
->SwapBytes
) {
5746 _mesa_swap4( (GLuint
*) dst
, n
);
5750 case GL_HALF_FLOAT_ARB
:
5752 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5754 for (i
= 0; i
< n
; i
++) {
5755 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5757 if (dstPacking
->SwapBytes
) {
5758 _mesa_swap2( (GLushort
*) dst
, n
);
5763 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5772 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5775 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5776 GLenum dstType
, GLuint
*dest
,
5777 const GLfloat
*depthVals
,
5778 const GLubyte
*stencilVals
,
5779 const struct gl_pixelstore_attrib
*dstPacking
)
5781 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5782 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5785 if (!depthCopy
|| !stencilCopy
) {
5786 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5792 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5793 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5794 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5795 depthVals
= depthCopy
;
5798 if (ctx
->Pixel
.IndexShift
||
5799 ctx
->Pixel
.IndexOffset
||
5800 ctx
->Pixel
.MapStencilFlag
) {
5801 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5802 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5803 stencilVals
= stencilCopy
;
5807 case GL_UNSIGNED_INT_24_8
:
5808 for (i
= 0; i
< n
; i
++) {
5809 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5810 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5813 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5814 for (i
= 0; i
< n
; i
++) {
5815 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5816 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5821 if (dstPacking
->SwapBytes
) {
5822 _mesa_swap4(dest
, n
);
5833 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5834 * Return all image data in a contiguous block. This is used when we
5835 * compile glDrawPixels, glTexImage, etc into a display list. We
5836 * need a copy of the data in a standard format.
5839 _mesa_unpack_image( GLuint dimensions
,
5840 GLsizei width
, GLsizei height
, GLsizei depth
,
5841 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5842 const struct gl_pixelstore_attrib
*unpack
)
5844 GLint bytesPerRow
, compsPerRow
;
5845 GLboolean flipBytes
, swap2
, swap4
;
5848 return NULL
; /* not necessarily an error */
5850 if (width
<= 0 || height
<= 0 || depth
<= 0)
5851 return NULL
; /* generate error later */
5853 if (type
== GL_BITMAP
) {
5854 bytesPerRow
= (width
+ 7) >> 3;
5855 flipBytes
= unpack
->LsbFirst
;
5856 swap2
= swap4
= GL_FALSE
;
5860 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5861 GLint components
= _mesa_components_in_format(format
);
5864 if (_mesa_type_is_packed(type
))
5867 if (bytesPerPixel
<= 0 || components
<= 0)
5868 return NULL
; /* bad format or type. generate error later */
5869 bytesPerRow
= bytesPerPixel
* width
;
5870 bytesPerComp
= bytesPerPixel
/ components
;
5871 flipBytes
= GL_FALSE
;
5872 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5873 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5874 compsPerRow
= components
* width
;
5875 assert(compsPerRow
>= width
);
5880 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5884 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5887 for (img
= 0; img
< depth
; img
++) {
5888 for (row
= 0; row
< height
; row
++) {
5889 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5890 width
, height
, format
, type
, img
, row
, 0);
5892 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5894 flipBytes
= GL_FALSE
;
5895 if (unpack
->LsbFirst
) {
5896 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5897 GLubyte dstMask
= 128;
5898 const GLubyte
*s
= src
;
5901 for (i
= 0; i
< width
; i
++) {
5905 if (srcMask
== 128) {
5910 srcMask
= srcMask
<< 1;
5918 dstMask
= dstMask
>> 1;
5923 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5924 GLubyte dstMask
= 128;
5925 const GLubyte
*s
= src
;
5928 for (i
= 0; i
< width
; i
++) {
5937 srcMask
= srcMask
>> 1;
5945 dstMask
= dstMask
>> 1;
5951 memcpy(dst
, src
, bytesPerRow
);
5954 /* byte flipping/swapping */
5956 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5959 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5962 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5974 * If we unpack colors from a luminance surface, we'll get pixel colors
5975 * such as (l, l, l, a).
5976 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5977 * function will compute L=R+G+B before packing. The net effect is we'll
5978 * accidentally store luminance values = 3*l.
5979 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5981 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5984 * Finally, we also need to do this when the actual surface format does
5985 * not match the logical surface format. For example, suppose the user
5986 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5987 * Again, we'll get pixel values like (l,l,l,a).
5990 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5994 switch (baseFormat
) {
5996 for (i
= 0; i
< n
; i
++) {
5997 rgba
[i
][RCOMP
] = 0.0F
;
5998 rgba
[i
][GCOMP
] = 0.0F
;
5999 rgba
[i
][BCOMP
] = 0.0F
;
6005 for (i
= 0; i
< n
; i
++) {
6006 rgba
[i
][GCOMP
] = 0.0F
;
6007 rgba
[i
][BCOMP
] = 0.0F
;
6008 rgba
[i
][ACOMP
] = 1.0F
;
6011 case GL_LUMINANCE_ALPHA
:
6012 for (i
= 0; i
< n
; i
++) {
6013 rgba
[i
][GCOMP
] = 0.0F
;
6014 rgba
[i
][BCOMP
] = 0.0F
;
6025 * As above, but GLuint components.
6028 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
6032 switch (baseFormat
) {
6034 for (i
= 0; i
< n
; i
++) {
6043 for (i
= 0; i
< n
; i
++) {
6049 case GL_LUMINANCE_ALPHA
:
6050 for (i
= 0; i
< n
; i
++) {