2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34 * this global optimization.
37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
40 #if defined(_MSC_VER) && defined(_M_X64)
41 # pragma optimize( "g", off )
53 #include "pixeltransfer.h"
55 #include "glformats.h"
56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
61 * Flip the 8 bits in each byte of the given array.
64 * \param n number of bytes.
66 * \todo try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
74 flip_bytes( GLubyte
*p
, GLuint n
)
77 for (i
= 0; i
< n
; i
++) {
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
94 * Unpack a 32x32 pixel polygon stipple from user memory using the
95 * current pixel unpack settings.
98 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
99 const struct gl_pixelstore_attrib
*unpacking
)
101 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
103 /* Convert pattern from GLubytes to GLuints and handle big/little
108 for (i
= 0; i
< 32; i
++) {
109 dest
[i
] = (p
[0] << 24)
121 * Pack polygon stipple into user memory given current pixel packing
125 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
126 const struct gl_pixelstore_attrib
*packing
)
128 /* Convert pattern from GLuints to GLubytes to handle big/little
129 * endian differences.
133 for (i
= 0; i
< 32; i
++) {
134 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
135 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
136 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
137 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
140 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
146 * order with row alignment = 1 byte.
149 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
150 const struct gl_pixelstore_attrib
*packing
)
152 GLint bytes
, row
, width_in_bytes
;
153 GLubyte
*buffer
, *dst
;
158 /* Alloc dest storage */
159 bytes
= ((width
+ 7) / 8 * height
);
160 buffer
= malloc( bytes
);
164 width_in_bytes
= CEILING( width
, 8 );
166 for (row
= 0; row
< height
; row
++) {
167 const GLubyte
*src
= (const GLubyte
*)
168 _mesa_image_address2d(packing
, pixels
, width
, height
,
169 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
175 if ((packing
->SkipPixels
& 7) == 0) {
176 memcpy( dst
, src
, width_in_bytes
);
177 if (packing
->LsbFirst
) {
178 flip_bytes( dst
, width_in_bytes
);
182 /* handling SkipPixels is a bit tricky (no pun intended!) */
184 if (packing
->LsbFirst
) {
185 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
186 GLubyte dstMask
= 128;
187 const GLubyte
*s
= src
;
190 for (i
= 0; i
< width
; i
++) {
194 if (srcMask
== 128) {
199 srcMask
= srcMask
<< 1;
207 dstMask
= dstMask
>> 1;
212 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
213 GLubyte dstMask
= 128;
214 const GLubyte
*s
= src
;
217 for (i
= 0; i
< width
; i
++) {
226 srcMask
= srcMask
>> 1;
234 dstMask
= dstMask
>> 1;
239 dst
+= width_in_bytes
;
250 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
251 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
253 GLint row
, width_in_bytes
;
259 width_in_bytes
= CEILING( width
, 8 );
261 for (row
= 0; row
< height
; row
++) {
262 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
263 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
267 if ((packing
->SkipPixels
& 7) == 0) {
268 memcpy( dst
, src
, width_in_bytes
);
269 if (packing
->LsbFirst
) {
270 flip_bytes( dst
, width_in_bytes
);
274 /* handling SkipPixels is a bit tricky (no pun intended!) */
276 if (packing
->LsbFirst
) {
277 GLubyte srcMask
= 128;
278 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
279 const GLubyte
*s
= src
;
282 for (i
= 0; i
< width
; i
++) {
291 srcMask
= srcMask
>> 1;
293 if (dstMask
== 128) {
299 dstMask
= dstMask
<< 1;
304 GLubyte srcMask
= 128;
305 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
306 const GLubyte
*s
= src
;
309 for (i
= 0; i
< width
; i
++) {
318 srcMask
= srcMask
>> 1;
326 dstMask
= dstMask
>> 1;
331 src
+= width_in_bytes
;
337 * Get indexes of color components for a basic color format, such as
338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
342 get_component_indexes(GLenum format
,
347 GLint
*luminanceIndex
,
348 GLint
*intensityIndex
)
354 *luminanceIndex
= -1;
355 *intensityIndex
= -1;
359 case GL_LUMINANCE_INTEGER_EXT
:
362 case GL_LUMINANCE_ALPHA
:
363 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
371 case GL_RED_INTEGER_EXT
:
375 case GL_GREEN_INTEGER_EXT
:
379 case GL_BLUE_INTEGER_EXT
:
383 case GL_ALPHA_INTEGER_EXT
:
392 case GL_RGB_INTEGER_EXT
:
398 case GL_BGR_INTEGER_EXT
:
404 case GL_RGBA_INTEGER_EXT
:
411 case GL_BGRA_INTEGER
:
424 assert(0 && "bad format in get_component_indexes()");
431 * For small integer types, return the min and max possible values.
432 * Used for clamping floats to unscaled integer types.
433 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
436 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
443 case GL_UNSIGNED_BYTE
:
451 case GL_UNSIGNED_SHORT
:
460 /* Customization of unsigned integer packing.
462 #define SRC_TYPE GLuint
464 #define DST_TYPE GLuint
465 #define SRC_CONVERT(x) (x)
466 #define FN_NAME pack_uint_from_uint_rgba
467 #include "pack_tmp.h"
472 #define DST_TYPE GLint
473 #define SRC_CONVERT(x) MIN2(x, 0x7fffffff)
474 #define FN_NAME pack_int_from_uint_rgba
475 #include "pack_tmp.h"
480 #define DST_TYPE GLushort
481 #define SRC_CONVERT(x) MIN2(x, 0xffff)
482 #define FN_NAME pack_ushort_from_uint_rgba
483 #include "pack_tmp.h"
488 #define DST_TYPE GLshort
489 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
490 #define FN_NAME pack_short_from_uint_rgba
491 #include "pack_tmp.h"
496 #define DST_TYPE GLubyte
497 #define SRC_CONVERT(x) MIN2(x, 0xff)
498 #define FN_NAME pack_ubyte_from_uint_rgba
499 #include "pack_tmp.h"
504 #define DST_TYPE GLbyte
505 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
506 #define FN_NAME pack_byte_from_uint_rgba
507 #include "pack_tmp.h"
515 _pack_rgba_span_from_uints_problem(struct gl_context
*ctx
,
516 GLenum dstFormat
, GLenum dstType
)
519 "Unsupported type (%s) / format (%s) "
520 "in _mesa_pack_rgba_span_from_uints",
521 _mesa_lookup_enum_by_nr(dstType
),
522 _mesa_lookup_enum_by_nr(dstFormat
));
526 _mesa_pack_rgba_span_from_uints(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
527 GLenum dstFormat
, GLenum dstType
,
533 case GL_UNSIGNED_INT
:
534 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
537 pack_int_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
539 case GL_UNSIGNED_SHORT
:
540 pack_ushort_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
543 pack_short_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
545 case GL_UNSIGNED_BYTE
:
546 pack_ubyte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
549 pack_byte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
551 case GL_UNSIGNED_BYTE_3_3_2
:
552 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
553 GLubyte
*dst
= (GLubyte
*) dstAddr
;
555 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 7) << 5)
556 | (MIN2(rgba
[i
][GCOMP
], 7) << 2)
557 | (MIN2(rgba
[i
][BCOMP
], 3) );
560 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
563 case GL_UNSIGNED_BYTE_2_3_3_REV
:
564 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
565 GLubyte
*dst
= (GLubyte
*) dstAddr
;
567 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 7) )
568 | (MIN2(rgba
[i
][GCOMP
], 7) << 3)
569 | (MIN2(rgba
[i
][BCOMP
], 3) << 6);
572 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
575 case GL_UNSIGNED_SHORT_5_6_5
:
576 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
577 GLushort
*dst
= (GLushort
*) dstAddr
;
579 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) << 11)
580 | (MIN2(rgba
[i
][GCOMP
], 63) << 5)
581 | (MIN2(rgba
[i
][BCOMP
], 31) );
584 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
587 case GL_UNSIGNED_SHORT_5_6_5_REV
:
588 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
589 GLushort
*dst
= (GLushort
*) dstAddr
;
591 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) )
592 | (MIN2(rgba
[i
][GCOMP
], 63) << 5)
593 | (MIN2(rgba
[i
][BCOMP
], 31) << 11);
596 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
599 case GL_UNSIGNED_SHORT_4_4_4_4
:
600 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
601 GLushort
*dst
= (GLushort
*) dstAddr
;
603 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 15) << 12)
604 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
605 | (MIN2(rgba
[i
][BCOMP
], 15) << 4)
606 | (MIN2(rgba
[i
][ACOMP
], 15) );
609 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
610 GLushort
*dst
= (GLushort
*) dstAddr
;
612 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 15) << 12)
613 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
614 | (MIN2(rgba
[i
][RCOMP
], 15) << 4)
615 | (MIN2(rgba
[i
][ACOMP
], 15) );
618 else if (dstFormat
== GL_ABGR_EXT
) {
619 GLushort
*dst
= (GLushort
*) dstAddr
;
621 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 15) << 12)
622 | (MIN2(rgba
[i
][BCOMP
], 15) << 8)
623 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
624 | (MIN2(rgba
[i
][RCOMP
], 15) );
627 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
630 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
631 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
632 GLushort
*dst
= (GLushort
*) dstAddr
;
634 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 15) )
635 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
636 | (MIN2(rgba
[i
][BCOMP
], 15) << 8)
637 | (MIN2(rgba
[i
][ACOMP
], 15) << 12);
640 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
641 GLushort
*dst
= (GLushort
*) dstAddr
;
643 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 15) )
644 | (MIN2(rgba
[i
][GCOMP
], 15) << 4)
645 | (MIN2(rgba
[i
][RCOMP
], 15) << 8)
646 | (MIN2(rgba
[i
][ACOMP
], 15) << 12);
649 else if (dstFormat
== GL_ABGR_EXT
) {
650 GLushort
*dst
= (GLushort
*) dstAddr
;
652 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 15) )
653 | (MIN2(rgba
[i
][BCOMP
], 15) << 4)
654 | (MIN2(rgba
[i
][GCOMP
], 15) << 8)
655 | (MIN2(rgba
[i
][RCOMP
], 15) << 12);
658 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
661 case GL_UNSIGNED_SHORT_5_5_5_1
:
662 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
663 GLushort
*dst
= (GLushort
*) dstAddr
;
665 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) << 11)
666 | (MIN2(rgba
[i
][GCOMP
], 31) << 6)
667 | (MIN2(rgba
[i
][BCOMP
], 31) << 1)
668 | (MIN2(rgba
[i
][ACOMP
], 1) );
671 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
672 GLushort
*dst
= (GLushort
*) dstAddr
;
674 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 31) << 11)
675 | (MIN2(rgba
[i
][GCOMP
], 31) << 6)
676 | (MIN2(rgba
[i
][RCOMP
], 31) << 1)
677 | (MIN2(rgba
[i
][ACOMP
], 1) );
680 else if (dstFormat
== GL_ABGR_EXT
) {
681 GLushort
*dst
= (GLushort
*) dstAddr
;
683 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 31) << 11)
684 | (MIN2(rgba
[i
][BCOMP
], 31) << 6)
685 | (MIN2(rgba
[i
][GCOMP
], 31) << 1)
686 | (MIN2(rgba
[i
][RCOMP
], 1) );
689 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
692 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
693 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
694 GLushort
*dst
= (GLushort
*) dstAddr
;
696 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 31) )
697 | (MIN2(rgba
[i
][GCOMP
], 31) << 5)
698 | (MIN2(rgba
[i
][BCOMP
], 31) << 10)
699 | (MIN2(rgba
[i
][ACOMP
], 1) << 15);
702 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
703 GLushort
*dst
= (GLushort
*) dstAddr
;
705 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 31) )
706 | (MIN2(rgba
[i
][GCOMP
], 31) << 5)
707 | (MIN2(rgba
[i
][RCOMP
], 31) << 10)
708 | (MIN2(rgba
[i
][ACOMP
], 1) << 15);
711 else if (dstFormat
== GL_ABGR_EXT
) {
712 GLushort
*dst
= (GLushort
*) dstAddr
;
714 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 31) )
715 | (MIN2(rgba
[i
][BCOMP
], 31) << 5)
716 | (MIN2(rgba
[i
][GCOMP
], 31) << 10)
717 | (MIN2(rgba
[i
][RCOMP
], 1) << 15);
720 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
723 case GL_UNSIGNED_INT_8_8_8_8
:
724 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
725 GLuint
*dst
= (GLuint
*) dstAddr
;
727 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 255) << 24)
728 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
729 | (MIN2(rgba
[i
][BCOMP
], 255) << 8)
730 | (MIN2(rgba
[i
][ACOMP
], 255) );
733 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
734 GLuint
*dst
= (GLuint
*) dstAddr
;
736 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 255) << 24)
737 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
738 | (MIN2(rgba
[i
][RCOMP
], 255) << 8)
739 | (MIN2(rgba
[i
][ACOMP
], 255) );
742 else if (dstFormat
== GL_ABGR_EXT
) {
743 GLuint
*dst
= (GLuint
*) dstAddr
;
745 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 255) << 24)
746 | (MIN2(rgba
[i
][BCOMP
], 255) << 16)
747 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
748 | (MIN2(rgba
[i
][RCOMP
], 255) );
751 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
754 case GL_UNSIGNED_INT_8_8_8_8_REV
:
755 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
756 GLuint
*dst
= (GLuint
*) dstAddr
;
758 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 255) )
759 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
760 | (MIN2(rgba
[i
][BCOMP
], 255) << 16)
761 | (MIN2(rgba
[i
][ACOMP
], 255) << 24);
764 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
765 GLuint
*dst
= (GLuint
*) dstAddr
;
767 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 255) )
768 | (MIN2(rgba
[i
][GCOMP
], 255) << 8)
769 | (MIN2(rgba
[i
][RCOMP
], 255) << 16)
770 | (MIN2(rgba
[i
][ACOMP
], 255) << 24);
773 else if (dstFormat
== GL_ABGR_EXT
) {
774 GLuint
*dst
= (GLuint
*) dstAddr
;
776 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 255) )
777 | (MIN2(rgba
[i
][BCOMP
], 255) << 8)
778 | (MIN2(rgba
[i
][GCOMP
], 255) << 16)
779 | (MIN2(rgba
[i
][RCOMP
], 255) << 24);
782 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
785 case GL_UNSIGNED_INT_10_10_10_2
:
786 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
787 GLuint
*dst
= (GLuint
*) dstAddr
;
789 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 1023) << 22)
790 | (MIN2(rgba
[i
][GCOMP
], 1023) << 12)
791 | (MIN2(rgba
[i
][BCOMP
], 1023) << 2)
792 | (MIN2(rgba
[i
][ACOMP
], 3) );
795 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
796 GLuint
*dst
= (GLuint
*) dstAddr
;
798 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 1023) << 22)
799 | (MIN2(rgba
[i
][GCOMP
], 1023) << 12)
800 | (MIN2(rgba
[i
][RCOMP
], 1023) << 2)
801 | (MIN2(rgba
[i
][ACOMP
], 3) );
804 else if (dstFormat
== GL_ABGR_EXT
) {
805 GLuint
*dst
= (GLuint
*) dstAddr
;
807 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 1023) << 22)
808 | (MIN2(rgba
[i
][BCOMP
], 1023) << 12)
809 | (MIN2(rgba
[i
][GCOMP
], 1023) << 2)
810 | (MIN2(rgba
[i
][RCOMP
], 3) );
813 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
816 case GL_UNSIGNED_INT_2_10_10_10_REV
:
817 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
818 GLuint
*dst
= (GLuint
*) dstAddr
;
820 dst
[i
] = (MIN2(rgba
[i
][RCOMP
], 1023) )
821 | (MIN2(rgba
[i
][GCOMP
], 1023) << 10)
822 | (MIN2(rgba
[i
][BCOMP
], 1023) << 20)
823 | (MIN2(rgba
[i
][ACOMP
], 3) << 30);
826 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
827 GLuint
*dst
= (GLuint
*) dstAddr
;
829 dst
[i
] = (MIN2(rgba
[i
][BCOMP
], 1023) )
830 | (MIN2(rgba
[i
][GCOMP
], 1023) << 10)
831 | (MIN2(rgba
[i
][RCOMP
], 1023) << 20)
832 | (MIN2(rgba
[i
][ACOMP
], 3) << 30);
835 else if (dstFormat
== GL_ABGR_EXT
) {
836 GLuint
*dst
= (GLuint
*) dstAddr
;
838 dst
[i
] = (MIN2(rgba
[i
][ACOMP
], 1023) )
839 | (MIN2(rgba
[i
][BCOMP
], 1023) << 10)
840 | (MIN2(rgba
[i
][GCOMP
], 1023) << 20)
841 | (MIN2(rgba
[i
][RCOMP
], 3) << 30);
844 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
848 _pack_rgba_span_from_uints_problem(ctx
, dstFormat
, dstType
);
854 /* Customization of signed integer packing.
856 #define SRC_TYPE GLint
858 #define DST_TYPE GLuint
859 #define SRC_CONVERT(x) MAX2(x, 0)
860 #define FN_NAME pack_uint_from_int_rgba
861 #include "pack_tmp.h"
866 #define DST_TYPE GLushort
867 #define SRC_CONVERT(x) MAX2(x, 0)
868 #define FN_NAME pack_ushort_from_int_rgba
869 #include "pack_tmp.h"
874 #define DST_TYPE GLshort
875 #define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff)
876 #define FN_NAME pack_short_from_int_rgba
877 #include "pack_tmp.h"
882 #define DST_TYPE GLubyte
883 #define SRC_CONVERT(x) MAX2(x, 0)
884 #define FN_NAME pack_ubyte_from_int_rgba
885 #include "pack_tmp.h"
890 #define DST_TYPE GLbyte
891 #define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f)
892 #define FN_NAME pack_byte_from_int_rgba
893 #include "pack_tmp.h"
901 _pack_rgba_span_from_ints_problem(struct gl_context
*ctx
,
902 GLenum dstFormat
, GLenum dstType
)
905 "Unsupported type (%s) / format (%s) "
906 "in _mesa_pack_rgba_span_from_ints",
907 _mesa_lookup_enum_by_nr(dstType
),
908 _mesa_lookup_enum_by_nr(dstFormat
));
912 _mesa_pack_rgba_span_from_ints(struct gl_context
*ctx
, GLuint n
, GLint rgba
[][4],
913 GLenum dstFormat
, GLenum dstType
,
919 case GL_UNSIGNED_INT
:
920 pack_uint_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
923 /* No conversion necessary. */
924 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, (GLuint (*)[4]) rgba
, n
);
926 case GL_UNSIGNED_SHORT
:
927 pack_ushort_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
930 pack_short_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
932 case GL_UNSIGNED_BYTE
:
933 pack_ubyte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
936 pack_byte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
938 case GL_UNSIGNED_BYTE_3_3_2
:
939 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
940 GLubyte
*dst
= (GLubyte
*) dstAddr
;
942 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) << 5)
943 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 2)
944 | (CLAMP(rgba
[i
][BCOMP
], 0, 3) );
947 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
950 case GL_UNSIGNED_BYTE_2_3_3_REV
:
951 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
952 GLubyte
*dst
= (GLubyte
*) dstAddr
;
954 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 7) )
955 | (CLAMP(rgba
[i
][GCOMP
], 0, 7) << 3)
956 | (CLAMP(rgba
[i
][BCOMP
], 0, 3) << 6);
959 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
962 case GL_UNSIGNED_SHORT_5_6_5
:
963 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
964 GLushort
*dst
= (GLushort
*) dstAddr
;
966 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
967 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
968 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) );
971 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
974 case GL_UNSIGNED_SHORT_5_6_5_REV
:
975 if ((dstFormat
== GL_RGB
) || (dstFormat
== GL_RGB_INTEGER
)) {
976 GLushort
*dst
= (GLushort
*) dstAddr
;
978 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
979 | (CLAMP(rgba
[i
][GCOMP
], 0, 63) << 5)
980 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 11);
983 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
986 case GL_UNSIGNED_SHORT_4_4_4_4
:
987 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
988 GLushort
*dst
= (GLushort
*) dstAddr
;
990 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 12)
991 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
992 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
993 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
996 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
997 GLushort
*dst
= (GLushort
*) dstAddr
;
999 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 12)
1000 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
1001 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 4)
1002 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) );
1005 else if (dstFormat
== GL_ABGR_EXT
) {
1006 GLushort
*dst
= (GLushort
*) dstAddr
;
1008 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12)
1009 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
1010 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1011 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) );
1014 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1017 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1018 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1019 GLushort
*dst
= (GLushort
*) dstAddr
;
1021 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 15) )
1022 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1023 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 8)
1024 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
1027 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1028 GLushort
*dst
= (GLushort
*) dstAddr
;
1030 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 15) )
1031 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 4)
1032 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 8)
1033 | (CLAMP(rgba
[i
][ACOMP
], 0, 15) << 12);
1036 else if (dstFormat
== GL_ABGR_EXT
) {
1037 GLushort
*dst
= (GLushort
*) dstAddr
;
1039 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 15) )
1040 | (CLAMP(rgba
[i
][BCOMP
], 0, 15) << 4)
1041 | (CLAMP(rgba
[i
][GCOMP
], 0, 15) << 8)
1042 | (CLAMP(rgba
[i
][RCOMP
], 0, 15) << 12);
1045 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1048 case GL_UNSIGNED_SHORT_5_5_5_1
:
1049 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1050 GLushort
*dst
= (GLushort
*) dstAddr
;
1052 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 11)
1053 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
1054 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 1)
1055 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
1058 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1059 GLushort
*dst
= (GLushort
*) dstAddr
;
1061 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 11)
1062 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 6)
1063 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 1)
1064 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) );
1067 else if (dstFormat
== GL_ABGR_EXT
) {
1068 GLushort
*dst
= (GLushort
*) dstAddr
;
1070 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) << 11)
1071 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 6)
1072 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 1)
1073 | (CLAMP(rgba
[i
][RCOMP
], 0, 1) );
1076 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1079 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1080 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1081 GLushort
*dst
= (GLushort
*) dstAddr
;
1083 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 31) )
1084 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
1085 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 10)
1086 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
1089 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1090 GLushort
*dst
= (GLushort
*) dstAddr
;
1092 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 31) )
1093 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 5)
1094 | (CLAMP(rgba
[i
][RCOMP
], 0, 31) << 10)
1095 | (CLAMP(rgba
[i
][ACOMP
], 0, 1) << 15);
1098 else if (dstFormat
== GL_ABGR_EXT
) {
1099 GLushort
*dst
= (GLushort
*) dstAddr
;
1101 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 31) )
1102 | (CLAMP(rgba
[i
][BCOMP
], 0, 31) << 5)
1103 | (CLAMP(rgba
[i
][GCOMP
], 0, 31) << 10)
1104 | (CLAMP(rgba
[i
][RCOMP
], 0, 1) << 15);
1107 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1110 case GL_UNSIGNED_INT_8_8_8_8
:
1111 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1112 GLuint
*dst
= (GLuint
*) dstAddr
;
1114 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 24)
1115 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1116 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
1117 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
1120 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1121 GLuint
*dst
= (GLuint
*) dstAddr
;
1123 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 24)
1124 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1125 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 8)
1126 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) );
1129 else if (dstFormat
== GL_ABGR_EXT
) {
1130 GLuint
*dst
= (GLuint
*) dstAddr
;
1132 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24)
1133 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
1134 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1135 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) );
1138 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1141 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1142 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1143 GLuint
*dst
= (GLuint
*) dstAddr
;
1145 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 255) )
1146 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1147 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 16)
1148 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
1151 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1152 GLuint
*dst
= (GLuint
*) dstAddr
;
1154 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 255) )
1155 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 8)
1156 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 16)
1157 | (CLAMP(rgba
[i
][ACOMP
], 0, 255) << 24);
1160 else if (dstFormat
== GL_ABGR_EXT
) {
1161 GLuint
*dst
= (GLuint
*) dstAddr
;
1163 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 255) )
1164 | (CLAMP(rgba
[i
][BCOMP
], 0, 255) << 8)
1165 | (CLAMP(rgba
[i
][GCOMP
], 0, 255) << 16)
1166 | (CLAMP(rgba
[i
][RCOMP
], 0, 255) << 24);
1169 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1172 case GL_UNSIGNED_INT_10_10_10_2
:
1173 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1174 GLuint
*dst
= (GLuint
*) dstAddr
;
1176 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 22)
1177 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
1178 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 2)
1179 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
1182 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1183 GLuint
*dst
= (GLuint
*) dstAddr
;
1185 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 22)
1186 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 12)
1187 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 2)
1188 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) );
1191 else if (dstFormat
== GL_ABGR_EXT
) {
1192 GLuint
*dst
= (GLuint
*) dstAddr
;
1194 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) << 22)
1195 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 12)
1196 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 2)
1197 | (CLAMP(rgba
[i
][RCOMP
], 0, 3) );
1200 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1203 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1204 if ((dstFormat
== GL_RGBA
) || (dstFormat
== GL_RGBA_INTEGER_EXT
)) {
1205 GLuint
*dst
= (GLuint
*) dstAddr
;
1207 dst
[i
] = (CLAMP(rgba
[i
][RCOMP
], 0, 1023) )
1208 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
1209 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 20)
1210 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
1213 else if ((dstFormat
== GL_BGRA
) || (dstFormat
== GL_BGRA_INTEGER
)) {
1214 GLuint
*dst
= (GLuint
*) dstAddr
;
1216 dst
[i
] = (CLAMP(rgba
[i
][BCOMP
], 0, 1023) )
1217 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 10)
1218 | (CLAMP(rgba
[i
][RCOMP
], 0, 1023) << 20)
1219 | (CLAMP(rgba
[i
][ACOMP
], 0, 3) << 30);
1222 else if (dstFormat
== GL_ABGR_EXT
) {
1223 GLuint
*dst
= (GLuint
*) dstAddr
;
1225 dst
[i
] = (CLAMP(rgba
[i
][ACOMP
], 0, 1023) )
1226 | (CLAMP(rgba
[i
][BCOMP
], 0, 1023) << 10)
1227 | (CLAMP(rgba
[i
][GCOMP
], 0, 1023) << 20)
1228 | (CLAMP(rgba
[i
][RCOMP
], 0, 3) << 30);
1231 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1235 _pack_rgba_span_from_ints_problem(ctx
, dstFormat
, dstType
);
1242 * Used to pack an array [][4] of RGBA float colors as specified
1243 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
1244 * Historically, the RGBA values were in [0,1] and rescaled to fit
1245 * into GLubytes, etc. But with new integer formats, the RGBA values
1246 * may have any value and we don't always rescale when converting to
1249 * Note: the rgba values will be modified by this function when any pixel
1250 * transfer ops are enabled.
1253 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
1254 GLenum dstFormat
, GLenum dstType
,
1256 const struct gl_pixelstore_attrib
*dstPacking
,
1257 GLbitfield transferOps
)
1260 const GLint comps
= _mesa_components_in_format(dstFormat
);
1261 const GLboolean intDstFormat
= _mesa_is_enum_format_integer(dstFormat
);
1264 if (dstFormat
== GL_LUMINANCE
||
1265 dstFormat
== GL_LUMINANCE_ALPHA
||
1266 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
1267 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
1268 luminance
= malloc(n
* sizeof(GLfloat
));
1270 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
1278 /* EXT_texture_integer specifies no transfer ops on integer
1279 * types in the resolved issues section. Just set them to 0
1280 * for integer surfaces.
1286 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
1290 * Component clamping (besides clamping to [0,1] in
1291 * _mesa_apply_rgba_transfer_ops()).
1294 /* clamping to dest type's min/max values */
1296 if (get_type_min_max(dstType
, &min
, &max
)) {
1297 for (i
= 0; i
< n
; i
++) {
1298 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
1299 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
1300 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
1301 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
1305 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
1306 /* compute luminance values */
1307 if (transferOps
& IMAGE_CLAMP_BIT
) {
1308 for (i
= 0; i
< n
; i
++) {
1309 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1310 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
1314 for (i
= 0; i
< n
; i
++) {
1315 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
1321 * Pack/store the pixels. Ugh! Lots of cases!!!
1324 case GL_UNSIGNED_BYTE
:
1326 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1327 switch (dstFormat
) {
1330 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1334 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1338 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1342 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1346 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
1348 case GL_LUMINANCE_ALPHA
:
1350 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
1351 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1356 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1357 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1362 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1363 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1364 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1369 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1370 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1371 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1372 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1377 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1378 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1379 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1384 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1385 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1386 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1387 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1392 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
1393 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
1394 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
1395 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
1398 case GL_RED_INTEGER_EXT
:
1400 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
1403 case GL_GREEN_INTEGER_EXT
:
1405 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
1408 case GL_BLUE_INTEGER_EXT
:
1410 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
1413 case GL_ALPHA_INTEGER_EXT
:
1415 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
1420 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
1421 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
1424 case GL_RGB_INTEGER_EXT
:
1426 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
1427 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
1428 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
1431 case GL_RGBA_INTEGER_EXT
:
1433 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
1434 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
1435 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
1436 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
1439 case GL_BGR_INTEGER_EXT
:
1441 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
1442 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
1443 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
1446 case GL_BGRA_INTEGER_EXT
:
1448 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
1449 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
1450 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
1451 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
1454 case GL_LUMINANCE_INTEGER_EXT
:
1456 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
1459 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
1462 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1464 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
1470 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1476 GLbyte
*dst
= (GLbyte
*) dstAddr
;
1477 switch (dstFormat
) {
1480 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1484 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1488 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1492 dst
[i
] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1496 dst
[i
] = FLOAT_TO_BYTE_TEX(luminance
[i
]);
1498 case GL_LUMINANCE_ALPHA
:
1500 dst
[i
*2+0] = FLOAT_TO_BYTE_TEX(luminance
[i
]);
1501 dst
[i
*2+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1506 dst
[i
*2+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1507 dst
[i
*2+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1512 dst
[i
*3+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1513 dst
[i
*3+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1514 dst
[i
*3+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1519 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1520 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1521 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1522 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1527 dst
[i
*3+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1528 dst
[i
*3+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1529 dst
[i
*3+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1534 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1535 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1536 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1537 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1542 dst
[i
*4+0] = FLOAT_TO_BYTE_TEX(rgba
[i
][ACOMP
]);
1543 dst
[i
*4+1] = FLOAT_TO_BYTE_TEX(rgba
[i
][BCOMP
]);
1544 dst
[i
*4+2] = FLOAT_TO_BYTE_TEX(rgba
[i
][GCOMP
]);
1545 dst
[i
*4+3] = FLOAT_TO_BYTE_TEX(rgba
[i
][RCOMP
]);
1548 case GL_RED_INTEGER_EXT
:
1550 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
1553 case GL_GREEN_INTEGER_EXT
:
1555 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
1558 case GL_BLUE_INTEGER_EXT
:
1560 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
1563 case GL_ALPHA_INTEGER_EXT
:
1565 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
1570 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
1571 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
1574 case GL_RGB_INTEGER_EXT
:
1576 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
1577 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
1578 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
1581 case GL_RGBA_INTEGER_EXT
:
1583 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
1584 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
1585 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
1586 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
1589 case GL_BGR_INTEGER_EXT
:
1591 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
1592 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
1593 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
1596 case GL_BGRA_INTEGER_EXT
:
1598 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
1599 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
1600 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
1601 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
1604 case GL_LUMINANCE_INTEGER_EXT
:
1606 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
1609 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
1612 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1614 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
1620 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1624 case GL_UNSIGNED_SHORT
:
1626 GLushort
*dst
= (GLushort
*) dstAddr
;
1627 switch (dstFormat
) {
1630 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
1634 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
1638 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
1642 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
1646 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
1648 case GL_LUMINANCE_ALPHA
:
1650 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
1651 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
1656 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
1657 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
1662 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
1663 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1664 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
1669 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
1670 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1671 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
1672 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1677 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
1678 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1679 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
1684 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1685 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1686 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1687 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1692 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1693 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1694 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1695 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1698 case GL_RED_INTEGER_EXT
:
1700 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1703 case GL_GREEN_INTEGER_EXT
:
1705 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1708 case GL_BLUE_INTEGER_EXT
:
1710 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1713 case GL_ALPHA_INTEGER_EXT
:
1715 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1720 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1721 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1724 case GL_RGB_INTEGER_EXT
:
1726 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1727 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1728 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1731 case GL_RGBA_INTEGER_EXT
:
1733 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1734 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1735 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1736 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1739 case GL_BGR_INTEGER_EXT
:
1741 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1742 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1743 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1746 case GL_BGRA_INTEGER_EXT
:
1748 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1749 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1750 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1751 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1754 case GL_LUMINANCE_INTEGER_EXT
:
1756 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1759 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1762 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1764 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1770 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1776 GLshort
*dst
= (GLshort
*) dstAddr
;
1777 switch (dstFormat
) {
1780 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1784 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1788 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1792 dst
[i
] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1796 dst
[i
] = FLOAT_TO_SHORT_TEX(luminance
[i
]);
1798 case GL_LUMINANCE_ALPHA
:
1800 dst
[i
*2+0] = FLOAT_TO_SHORT_TEX(luminance
[i
]);
1801 dst
[i
*2+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1806 dst
[i
*2+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1807 dst
[i
*2+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1812 dst
[i
*3+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1813 dst
[i
*3+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1814 dst
[i
*3+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1819 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1820 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1821 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1822 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1827 dst
[i
*3+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1828 dst
[i
*3+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1829 dst
[i
*3+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1834 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1835 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1836 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1837 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1842 dst
[i
*4+0] = FLOAT_TO_SHORT_TEX(rgba
[i
][ACOMP
]);
1843 dst
[i
*4+1] = FLOAT_TO_SHORT_TEX(rgba
[i
][BCOMP
]);
1844 dst
[i
*4+2] = FLOAT_TO_SHORT_TEX(rgba
[i
][GCOMP
]);
1845 dst
[i
*4+3] = FLOAT_TO_SHORT_TEX(rgba
[i
][RCOMP
]);
1848 case GL_RED_INTEGER_EXT
:
1850 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1853 case GL_GREEN_INTEGER_EXT
:
1855 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1858 case GL_BLUE_INTEGER_EXT
:
1860 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1863 case GL_ALPHA_INTEGER_EXT
:
1865 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1870 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1871 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1874 case GL_RGB_INTEGER_EXT
:
1876 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1877 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1878 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1881 case GL_RGBA_INTEGER_EXT
:
1883 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1884 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1885 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1886 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1889 case GL_BGR_INTEGER_EXT
:
1891 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1892 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1893 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1896 case GL_BGRA_INTEGER_EXT
:
1898 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1899 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1900 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1901 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1904 case GL_LUMINANCE_INTEGER_EXT
:
1906 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1909 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1912 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1914 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1920 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1924 case GL_UNSIGNED_INT
:
1926 GLuint
*dst
= (GLuint
*) dstAddr
;
1927 switch (dstFormat
) {
1930 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1934 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1938 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1942 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1946 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1948 case GL_LUMINANCE_ALPHA
:
1950 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1951 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1956 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1957 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1962 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1963 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1964 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1969 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1970 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1971 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1972 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1977 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1978 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1979 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1984 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1985 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1986 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1987 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1992 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1993 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1994 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1995 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1998 case GL_RED_INTEGER_EXT
:
2000 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
2003 case GL_GREEN_INTEGER_EXT
:
2005 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
2008 case GL_BLUE_INTEGER_EXT
:
2010 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
2013 case GL_ALPHA_INTEGER_EXT
:
2015 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
2020 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
2021 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
2024 case GL_RGB_INTEGER_EXT
:
2026 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
2027 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
2028 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
2031 case GL_RGBA_INTEGER_EXT
:
2033 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
2034 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
2035 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
2036 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
2039 case GL_BGR_INTEGER_EXT
:
2041 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
2042 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
2043 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
2046 case GL_BGRA_INTEGER_EXT
:
2048 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
2049 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
2050 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
2051 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
2054 case GL_LUMINANCE_INTEGER_EXT
:
2056 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
2059 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
2062 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2064 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
2070 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2076 GLint
*dst
= (GLint
*) dstAddr
;
2077 switch (dstFormat
) {
2080 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2084 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2088 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2092 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2096 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
2098 case GL_LUMINANCE_ALPHA
:
2100 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
2101 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2106 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2107 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2112 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2113 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2114 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2119 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2120 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2121 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2122 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2127 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2128 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2129 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2134 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2135 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2136 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2137 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2142 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
2143 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
2144 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
2145 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
2148 case GL_RED_INTEGER_EXT
:
2150 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
2153 case GL_GREEN_INTEGER_EXT
:
2155 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
2158 case GL_BLUE_INTEGER_EXT
:
2160 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
2163 case GL_ALPHA_INTEGER_EXT
:
2165 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
2170 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
2171 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
2174 case GL_RGB_INTEGER_EXT
:
2176 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
2177 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
2178 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
2181 case GL_RGBA_INTEGER_EXT
:
2183 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
2184 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
2185 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
2186 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
2189 case GL_BGR_INTEGER_EXT
:
2191 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
2192 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
2193 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
2196 case GL_BGRA_INTEGER_EXT
:
2198 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
2199 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
2200 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
2201 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
2204 case GL_LUMINANCE_INTEGER_EXT
:
2206 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
2209 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
2212 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2214 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
2220 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2226 GLfloat
*dst
= (GLfloat
*) dstAddr
;
2227 switch (dstFormat
) {
2230 dst
[i
] = rgba
[i
][RCOMP
];
2234 dst
[i
] = rgba
[i
][GCOMP
];
2238 dst
[i
] = rgba
[i
][BCOMP
];
2242 dst
[i
] = rgba
[i
][ACOMP
];
2246 dst
[i
] = luminance
[i
];
2248 case GL_LUMINANCE_ALPHA
:
2250 dst
[i
*2+0] = luminance
[i
];
2251 dst
[i
*2+1] = rgba
[i
][ACOMP
];
2256 dst
[i
*2+0] = rgba
[i
][RCOMP
];
2257 dst
[i
*2+1] = rgba
[i
][GCOMP
];
2262 dst
[i
*3+0] = rgba
[i
][RCOMP
];
2263 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2264 dst
[i
*3+2] = rgba
[i
][BCOMP
];
2269 dst
[i
*4+0] = rgba
[i
][RCOMP
];
2270 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2271 dst
[i
*4+2] = rgba
[i
][BCOMP
];
2272 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2277 dst
[i
*3+0] = rgba
[i
][BCOMP
];
2278 dst
[i
*3+1] = rgba
[i
][GCOMP
];
2279 dst
[i
*3+2] = rgba
[i
][RCOMP
];
2284 dst
[i
*4+0] = rgba
[i
][BCOMP
];
2285 dst
[i
*4+1] = rgba
[i
][GCOMP
];
2286 dst
[i
*4+2] = rgba
[i
][RCOMP
];
2287 dst
[i
*4+3] = rgba
[i
][ACOMP
];
2292 dst
[i
*4+0] = rgba
[i
][ACOMP
];
2293 dst
[i
*4+1] = rgba
[i
][BCOMP
];
2294 dst
[i
*4+2] = rgba
[i
][GCOMP
];
2295 dst
[i
*4+3] = rgba
[i
][RCOMP
];
2299 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2303 case GL_HALF_FLOAT_ARB
:
2305 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
2306 switch (dstFormat
) {
2309 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2313 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2317 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2321 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2325 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
2327 case GL_LUMINANCE_ALPHA
:
2329 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
2330 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2335 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2336 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2341 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2342 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2343 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2348 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2349 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2350 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2351 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2356 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2357 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2358 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2363 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2364 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2365 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2366 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2371 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
2372 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
2373 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
2374 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
2378 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
2382 case GL_UNSIGNED_BYTE_3_3_2
:
2383 if (dstFormat
== GL_RGB
) {
2384 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2386 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
2387 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
2388 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
2392 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2393 if (dstFormat
== GL_RGB
) {
2394 GLubyte
*dst
= (GLubyte
*) dstAddr
;
2396 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
2397 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
2398 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
2402 case GL_UNSIGNED_SHORT_5_6_5
:
2403 if (dstFormat
== GL_RGB
) {
2404 GLushort
*dst
= (GLushort
*) dstAddr
;
2406 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2407 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2408 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
2412 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2413 if (dstFormat
== GL_RGB
) {
2414 GLushort
*dst
= (GLushort
*) dstAddr
;
2416 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
2417 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
2418 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
2422 case GL_UNSIGNED_SHORT_4_4_4_4
:
2423 if (dstFormat
== GL_RGBA
) {
2424 GLushort
*dst
= (GLushort
*) dstAddr
;
2426 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
2427 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2428 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2429 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
2432 else if (dstFormat
== GL_BGRA
) {
2433 GLushort
*dst
= (GLushort
*) dstAddr
;
2435 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
2436 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2437 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
2438 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
2441 else if (dstFormat
== GL_ABGR_EXT
) {
2442 GLushort
*dst
= (GLushort
*) dstAddr
;
2444 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
2445 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2446 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2447 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
2451 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2452 if (dstFormat
== GL_RGBA
) {
2453 GLushort
*dst
= (GLushort
*) dstAddr
;
2455 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
2456 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2457 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
2458 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2461 else if (dstFormat
== GL_BGRA
) {
2462 GLushort
*dst
= (GLushort
*) dstAddr
;
2464 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
2465 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
2466 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
2467 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
2470 else if (dstFormat
== GL_ABGR_EXT
) {
2471 GLushort
*dst
= (GLushort
*) dstAddr
;
2473 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
2474 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
2475 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
2476 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
2480 case GL_UNSIGNED_SHORT_5_5_5_1
:
2481 if (dstFormat
== GL_RGBA
) {
2482 GLushort
*dst
= (GLushort
*) dstAddr
;
2484 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
2485 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2486 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
2487 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
2490 else if (dstFormat
== GL_BGRA
) {
2491 GLushort
*dst
= (GLushort
*) dstAddr
;
2493 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
2494 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
2495 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
2496 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
2499 else if (dstFormat
== GL_ABGR_EXT
) {
2500 GLushort
*dst
= (GLushort
*) dstAddr
;
2502 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
2503 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
2504 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
2505 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
2509 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2510 if (dstFormat
== GL_RGBA
) {
2511 GLushort
*dst
= (GLushort
*) dstAddr
;
2513 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
2514 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2515 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
2516 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2519 else if (dstFormat
== GL_BGRA
) {
2520 GLushort
*dst
= (GLushort
*) dstAddr
;
2522 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
2523 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
2524 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
2525 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
2528 else if (dstFormat
== GL_ABGR_EXT
) {
2529 GLushort
*dst
= (GLushort
*) dstAddr
;
2531 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
2532 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
2533 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
2534 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
2538 case GL_UNSIGNED_INT_8_8_8_8
:
2539 if (dstFormat
== GL_RGBA
) {
2540 GLuint
*dst
= (GLuint
*) dstAddr
;
2542 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
2543 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
2544 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
2545 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2548 else if (dstFormat
== GL_BGRA
) {
2549 GLuint
*dst
= (GLuint
*) dstAddr
;
2551 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
2552 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
2553 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
2554 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2557 else if (dstFormat
== GL_ABGR_EXT
) {
2558 GLuint
*dst
= (GLuint
*) dstAddr
;
2560 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
2561 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
2562 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
2563 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
2567 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2568 if (dstFormat
== GL_RGBA
) {
2569 GLuint
*dst
= (GLuint
*) dstAddr
;
2571 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
2572 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2573 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2574 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2577 else if (dstFormat
== GL_BGRA
) {
2578 GLuint
*dst
= (GLuint
*) dstAddr
;
2580 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
2581 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2582 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2583 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2586 else if (dstFormat
== GL_ABGR_EXT
) {
2587 GLuint
*dst
= (GLuint
*) dstAddr
;
2589 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
2590 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2591 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2592 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2596 case GL_UNSIGNED_INT_10_10_10_2
:
2597 if (dstFormat
== GL_RGBA
) {
2598 GLuint
*dst
= (GLuint
*) dstAddr
;
2600 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2601 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2602 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2603 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2606 else if (dstFormat
== GL_BGRA
) {
2607 GLuint
*dst
= (GLuint
*) dstAddr
;
2609 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2610 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2611 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2612 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2615 else if (dstFormat
== GL_ABGR_EXT
) {
2616 GLuint
*dst
= (GLuint
*) dstAddr
;
2618 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
2619 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
2620 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
2621 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
2625 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2626 if (dstFormat
== GL_RGBA
) {
2627 GLuint
*dst
= (GLuint
*) dstAddr
;
2629 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
2630 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2631 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
2632 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2635 else if (dstFormat
== GL_BGRA
) {
2636 GLuint
*dst
= (GLuint
*) dstAddr
;
2638 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
2639 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2640 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2641 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2644 else if (dstFormat
== GL_ABGR_EXT
) {
2645 GLuint
*dst
= (GLuint
*) dstAddr
;
2647 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2648 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2649 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2650 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2654 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2656 GLuint
*dst
= (GLuint
*) dstAddr
;
2657 for (i
= 0; i
< n
; i
++) {
2658 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2662 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2664 GLuint
*dst
= (GLuint
*) dstAddr
;
2665 for (i
= 0; i
< n
; i
++) {
2666 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2671 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2676 if (dstPacking
->SwapBytes
) {
2677 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2678 if (swapSize
== 2) {
2679 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2681 else if (swapSize
== 4) {
2682 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2691 #define SWAP2BYTE(VALUE) \
2693 GLubyte *bytes = (GLubyte *) &(VALUE); \
2694 GLubyte tmp = bytes[0]; \
2695 bytes[0] = bytes[1]; \
2699 #define SWAP4BYTE(VALUE) \
2701 GLubyte *bytes = (GLubyte *) &(VALUE); \
2702 GLubyte tmp = bytes[0]; \
2703 bytes[0] = bytes[3]; \
2706 bytes[1] = bytes[2]; \
2712 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2713 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2714 const struct gl_pixelstore_attrib
*unpack
)
2716 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2718 ASSERT(srcType
== GL_BITMAP
||
2719 srcType
== GL_UNSIGNED_BYTE
||
2720 srcType
== GL_BYTE
||
2721 srcType
== GL_UNSIGNED_SHORT
||
2722 srcType
== GL_SHORT
||
2723 srcType
== GL_UNSIGNED_INT
||
2724 srcType
== GL_INT
||
2725 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2726 srcType
== GL_HALF_FLOAT_ARB
||
2727 srcType
== GL_FLOAT
||
2728 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2733 GLubyte
*ubsrc
= (GLubyte
*) src
;
2734 if (unpack
->LsbFirst
) {
2735 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2737 for (i
= 0; i
< n
; i
++) {
2738 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2749 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2751 for (i
= 0; i
< n
; i
++) {
2752 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2764 case GL_UNSIGNED_BYTE
:
2767 const GLubyte
*s
= (const GLubyte
*) src
;
2768 for (i
= 0; i
< n
; i
++)
2775 const GLbyte
*s
= (const GLbyte
*) src
;
2776 for (i
= 0; i
< n
; i
++)
2780 case GL_UNSIGNED_SHORT
:
2783 const GLushort
*s
= (const GLushort
*) src
;
2784 if (unpack
->SwapBytes
) {
2785 for (i
= 0; i
< n
; i
++) {
2786 GLushort value
= s
[i
];
2792 for (i
= 0; i
< n
; i
++)
2800 const GLshort
*s
= (const GLshort
*) src
;
2801 if (unpack
->SwapBytes
) {
2802 for (i
= 0; i
< n
; i
++) {
2803 GLshort value
= s
[i
];
2809 for (i
= 0; i
< n
; i
++)
2814 case GL_UNSIGNED_INT
:
2817 const GLuint
*s
= (const GLuint
*) src
;
2818 if (unpack
->SwapBytes
) {
2819 for (i
= 0; i
< n
; i
++) {
2820 GLuint value
= s
[i
];
2826 for (i
= 0; i
< n
; i
++)
2834 const GLint
*s
= (const GLint
*) src
;
2835 if (unpack
->SwapBytes
) {
2836 for (i
= 0; i
< n
; i
++) {
2843 for (i
= 0; i
< n
; i
++)
2851 const GLfloat
*s
= (const GLfloat
*) src
;
2852 if (unpack
->SwapBytes
) {
2853 for (i
= 0; i
< n
; i
++) {
2854 GLfloat value
= s
[i
];
2856 indexes
[i
] = (GLuint
) value
;
2860 for (i
= 0; i
< n
; i
++)
2861 indexes
[i
] = (GLuint
) s
[i
];
2865 case GL_HALF_FLOAT_ARB
:
2868 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2869 if (unpack
->SwapBytes
) {
2870 for (i
= 0; i
< n
; i
++) {
2871 GLhalfARB value
= s
[i
];
2873 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2877 for (i
= 0; i
< n
; i
++)
2878 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2882 case GL_UNSIGNED_INT_24_8_EXT
:
2885 const GLuint
*s
= (const GLuint
*) src
;
2886 if (unpack
->SwapBytes
) {
2887 for (i
= 0; i
< n
; i
++) {
2888 GLuint value
= s
[i
];
2890 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2894 for (i
= 0; i
< n
; i
++)
2895 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2899 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2902 const GLuint
*s
= (const GLuint
*) src
;
2903 if (unpack
->SwapBytes
) {
2904 for (i
= 0; i
< n
; i
++) {
2905 GLuint value
= s
[i
*2+1];
2907 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2911 for (i
= 0; i
< n
; i
++)
2912 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2918 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2925 * Return source/dest RGBA indexes for unpacking pixels.
2928 get_component_mapping(GLenum format
,
2940 case GL_RED_INTEGER_EXT
:
2942 *gSrc
= *bSrc
= *aSrc
= -1;
2945 case GL_GREEN_INTEGER_EXT
:
2947 *rSrc
= *bSrc
= *aSrc
= -1;
2950 case GL_BLUE_INTEGER_EXT
:
2952 *rSrc
= *gSrc
= *aSrc
= -1;
2955 case GL_ALPHA_INTEGER_EXT
:
2956 *rSrc
= *gSrc
= *bSrc
= -1;
2960 case GL_LUMINANCE_INTEGER_EXT
:
2961 *rSrc
= *gSrc
= *bSrc
= 0;
2964 case GL_LUMINANCE_ALPHA
:
2965 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2966 *rSrc
= *gSrc
= *bSrc
= 0;
2970 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2984 case GL_RGB_INTEGER
:
2995 case GL_BGR_INTEGER
:
3006 case GL_RGBA_INTEGER
:
3017 case GL_BGRA_INTEGER
:
3038 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
3039 _mesa_lookup_enum_by_nr(format
));
3047 * This function extracts floating point RGBA values from arbitrary
3048 * image data. srcFormat and srcType are the format and type parameters
3049 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
3051 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
3052 * implements the "Conversion to floating point", "Conversion to RGB",
3053 * and "Final Expansion to RGBA" operations.
3055 * Args: n - number of pixels
3056 * rgba - output colors
3057 * srcFormat - format of incoming data
3058 * srcType - data type of incoming data
3059 * src - source data pointer
3060 * swapBytes - perform byteswapping of incoming data?
3063 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
3064 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3065 GLboolean swapBytes
)
3067 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3069 GLint rDst
, bDst
, gDst
, aDst
;
3070 GLboolean intFormat
;
3071 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
3073 ASSERT(srcFormat
== GL_RED
||
3074 srcFormat
== GL_GREEN
||
3075 srcFormat
== GL_BLUE
||
3076 srcFormat
== GL_ALPHA
||
3077 srcFormat
== GL_LUMINANCE
||
3078 srcFormat
== GL_LUMINANCE_ALPHA
||
3079 srcFormat
== GL_INTENSITY
||
3080 srcFormat
== GL_RG
||
3081 srcFormat
== GL_RGB
||
3082 srcFormat
== GL_BGR
||
3083 srcFormat
== GL_RGBA
||
3084 srcFormat
== GL_BGRA
||
3085 srcFormat
== GL_ABGR_EXT
||
3086 srcFormat
== GL_RED_INTEGER_EXT
||
3087 srcFormat
== GL_GREEN_INTEGER_EXT
||
3088 srcFormat
== GL_BLUE_INTEGER_EXT
||
3089 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3090 srcFormat
== GL_RG_INTEGER
||
3091 srcFormat
== GL_RGB_INTEGER_EXT
||
3092 srcFormat
== GL_RGBA_INTEGER_EXT
||
3093 srcFormat
== GL_BGR_INTEGER_EXT
||
3094 srcFormat
== GL_BGRA_INTEGER_EXT
||
3095 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3096 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3098 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3099 srcType
== GL_BYTE
||
3100 srcType
== GL_UNSIGNED_SHORT
||
3101 srcType
== GL_SHORT
||
3102 srcType
== GL_UNSIGNED_INT
||
3103 srcType
== GL_INT
||
3104 srcType
== GL_HALF_FLOAT_ARB
||
3105 srcType
== GL_FLOAT
||
3106 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3107 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3108 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3109 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3110 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3111 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3112 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3113 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3114 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3115 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3116 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3117 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3118 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3119 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3121 get_component_mapping(srcFormat
,
3122 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3123 &rDst
, &gDst
, &bDst
, &aDst
);
3125 stride
= _mesa_components_in_format(srcFormat
);
3127 intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3129 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
3130 if ((SRC_INDEX) < 0) { \
3133 for (i = 0; i < n; i++) { \
3134 rgba[i][DST_INDEX] = DEFAULT_INT; \
3138 for (i = 0; i < n; i++) { \
3139 rgba[i][DST_INDEX] = DEFAULT_FLT; \
3143 else if (swapBytes) { \
3144 const TYPE *s = (const TYPE *) src; \
3146 for (i = 0; i < n; i++) { \
3147 TYPE value = s[SRC_INDEX]; \
3148 if (sizeof(TYPE) == 2) { \
3151 else if (sizeof(TYPE) == 4) { \
3155 rgba[i][DST_INDEX] = (GLfloat) value; \
3157 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
3162 const TYPE *s = (const TYPE *) src; \
3165 for (i = 0; i < n; i++) { \
3166 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
3171 for (i = 0; i < n; i++) { \
3172 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
3179 case GL_UNSIGNED_BYTE
:
3180 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3181 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3182 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
3183 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
3186 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT_TEX
);
3187 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT_TEX
);
3188 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT_TEX
);
3189 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT_TEX
);
3191 case GL_UNSIGNED_SHORT
:
3192 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3193 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3194 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
3195 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
3198 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT_TEX
);
3199 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT_TEX
);
3200 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT_TEX
);
3201 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT_TEX
);
3203 case GL_UNSIGNED_INT
:
3204 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3205 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3206 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
3207 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
3210 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3211 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3212 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
3213 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
3216 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3217 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3218 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
3219 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
3221 case GL_HALF_FLOAT_ARB
:
3222 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3223 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3224 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
3225 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
3227 case GL_UNSIGNED_BYTE_3_3_2
:
3229 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3236 for (i
= 0; i
< n
; i
++) {
3237 GLubyte p
= ubsrc
[i
];
3238 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
3239 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
3240 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
3241 rgba
[i
][aDst
] = 1.0F
;
3245 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3247 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3254 for (i
= 0; i
< n
; i
++) {
3255 GLubyte p
= ubsrc
[i
];
3256 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
3257 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
3258 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
3259 rgba
[i
][aDst
] = 1.0F
;
3263 case GL_UNSIGNED_SHORT_5_6_5
:
3270 const GLushort
*ussrc
= (const GLushort
*) src
;
3272 for (i
= 0; i
< n
; i
++) {
3273 GLushort p
= ussrc
[i
];
3275 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3276 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3277 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
3278 rgba
[i
][aDst
] = 1.0F
;
3282 const GLushort
*ussrc
= (const GLushort
*) src
;
3284 for (i
= 0; i
< n
; i
++) {
3285 GLushort p
= ussrc
[i
];
3286 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3287 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3288 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
3289 rgba
[i
][aDst
] = 1.0F
;
3293 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3300 const GLushort
*ussrc
= (const GLushort
*) src
;
3302 for (i
= 0; i
< n
; i
++) {
3303 GLushort p
= ussrc
[i
];
3305 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3306 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3307 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
3308 rgba
[i
][aDst
] = 1.0F
;
3312 const GLushort
*ussrc
= (const GLushort
*) src
;
3314 for (i
= 0; i
< n
; i
++) {
3315 GLushort p
= ussrc
[i
];
3316 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3317 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
3318 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
3319 rgba
[i
][aDst
] = 1.0F
;
3323 case GL_UNSIGNED_SHORT_4_4_4_4
:
3325 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3328 const GLushort
*ussrc
= (const GLushort
*) src
;
3330 for (i
= 0; i
< n
; i
++) {
3331 GLushort p
= ussrc
[i
];
3333 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
3334 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
3335 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
3336 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
3340 const GLushort
*ussrc
= (const GLushort
*) src
;
3342 for (i
= 0; i
< n
; i
++) {
3343 GLushort p
= ussrc
[i
];
3344 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
3345 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
3346 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
3347 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
3351 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3353 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
3356 const GLushort
*ussrc
= (const GLushort
*) src
;
3358 for (i
= 0; i
< n
; i
++) {
3359 GLushort p
= ussrc
[i
];
3361 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
3362 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
3363 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
3364 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
3368 const GLushort
*ussrc
= (const GLushort
*) src
;
3370 for (i
= 0; i
< n
; i
++) {
3371 GLushort p
= ussrc
[i
];
3372 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
3373 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
3374 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
3375 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
3379 case GL_UNSIGNED_SHORT_5_5_5_1
:
3381 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3384 const GLushort
*ussrc
= (const GLushort
*) src
;
3386 for (i
= 0; i
< n
; i
++) {
3387 GLushort p
= ussrc
[i
];
3389 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3390 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
3391 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
3392 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
3396 const GLushort
*ussrc
= (const GLushort
*) src
;
3398 for (i
= 0; i
< n
; i
++) {
3399 GLushort p
= ussrc
[i
];
3400 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
3401 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
3402 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
3403 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
3407 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3409 rs
= gs
= bs
= 1.0F
/ 31.0F
;
3412 const GLushort
*ussrc
= (const GLushort
*) src
;
3414 for (i
= 0; i
< n
; i
++) {
3415 GLushort p
= ussrc
[i
];
3417 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3418 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
3419 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
3420 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
3424 const GLushort
*ussrc
= (const GLushort
*) src
;
3426 for (i
= 0; i
< n
; i
++) {
3427 GLushort p
= ussrc
[i
];
3428 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
3429 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
3430 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
3431 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
3435 case GL_UNSIGNED_INT_8_8_8_8
:
3437 const GLuint
*uisrc
= (const GLuint
*) src
;
3440 for (i
= 0; i
< n
; i
++) {
3441 GLuint p
= uisrc
[i
];
3442 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
3443 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3444 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3445 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
3449 for (i
= 0; i
< n
; i
++) {
3450 GLuint p
= uisrc
[i
];
3451 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3452 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3453 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3454 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3459 const GLuint
*uisrc
= (const GLuint
*) src
;
3462 for (i
= 0; i
< n
; i
++) {
3463 GLuint p
= uisrc
[i
];
3464 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
3465 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3466 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3467 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
3471 for (i
= 0; i
< n
; i
++) {
3472 GLuint p
= uisrc
[i
];
3473 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3474 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3475 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3476 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3481 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3483 const GLuint
*uisrc
= (const GLuint
*) src
;
3486 for (i
= 0; i
< n
; i
++) {
3487 GLuint p
= uisrc
[i
];
3488 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
3489 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3490 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3491 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
3495 for (i
= 0; i
< n
; i
++) {
3496 GLuint p
= uisrc
[i
];
3497 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3498 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3499 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3500 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3505 const GLuint
*uisrc
= (const GLuint
*) src
;
3508 for (i
= 0; i
< n
; i
++) {
3509 GLuint p
= uisrc
[i
];
3510 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
3511 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
3512 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
3513 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
3517 for (i
= 0; i
< n
; i
++) {
3518 GLuint p
= uisrc
[i
];
3519 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
3520 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
3521 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
3522 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
3527 case GL_UNSIGNED_INT_10_10_10_2
:
3529 rs
= 1.0F
/ 1023.0F
;
3530 gs
= 1.0F
/ 1023.0F
;
3531 bs
= 1.0F
/ 1023.0F
;
3535 const GLuint
*uisrc
= (const GLuint
*) src
;
3537 for (i
= 0; i
< n
; i
++) {
3538 GLuint p
= uisrc
[i
];
3540 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3541 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3542 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3543 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3547 const GLuint
*uisrc
= (const GLuint
*) src
;
3549 for (i
= 0; i
< n
; i
++) {
3550 GLuint p
= uisrc
[i
];
3551 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3552 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3553 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3554 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3558 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3560 rs
= 1.0F
/ 1023.0F
;
3561 gs
= 1.0F
/ 1023.0F
;
3562 bs
= 1.0F
/ 1023.0F
;
3566 const GLuint
*uisrc
= (const GLuint
*) src
;
3568 for (i
= 0; i
< n
; i
++) {
3569 GLuint p
= uisrc
[i
];
3571 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3572 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3573 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3575 rgba
[i
][aDst
] = 1.0F
;
3577 rgba
[i
][aDst
] = (p
>> 30) * as
;
3582 const GLuint
*uisrc
= (const GLuint
*) src
;
3584 for (i
= 0; i
< n
; i
++) {
3585 GLuint p
= uisrc
[i
];
3586 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3587 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3588 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3590 rgba
[i
][aDst
] = 1.0F
;
3592 rgba
[i
][aDst
] = (p
>> 30) * as
;
3597 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3599 const GLuint
*uisrc
= (const GLuint
*) src
;
3602 for (i
= 0; i
< n
; i
++) {
3603 GLuint p
= uisrc
[i
];
3605 rgb9e5_to_float3(p
, f
);
3606 rgba
[i
][rDst
] = f
[0];
3607 rgba
[i
][gDst
] = f
[1];
3608 rgba
[i
][bDst
] = f
[2];
3609 rgba
[i
][aDst
] = 1.0F
;
3613 const GLuint
*uisrc
= (const GLuint
*) src
;
3616 for (i
= 0; i
< n
; i
++) {
3617 rgb9e5_to_float3(uisrc
[i
], f
);
3618 rgba
[i
][rDst
] = f
[0];
3619 rgba
[i
][gDst
] = f
[1];
3620 rgba
[i
][bDst
] = f
[2];
3621 rgba
[i
][aDst
] = 1.0F
;
3625 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3627 const GLuint
*uisrc
= (const GLuint
*) src
;
3630 for (i
= 0; i
< n
; i
++) {
3631 GLuint p
= uisrc
[i
];
3633 r11g11b10f_to_float3(p
, f
);
3634 rgba
[i
][rDst
] = f
[0];
3635 rgba
[i
][gDst
] = f
[1];
3636 rgba
[i
][bDst
] = f
[2];
3637 rgba
[i
][aDst
] = 1.0F
;
3641 const GLuint
*uisrc
= (const GLuint
*) src
;
3644 for (i
= 0; i
< n
; i
++) {
3645 r11g11b10f_to_float3(uisrc
[i
], f
);
3646 rgba
[i
][rDst
] = f
[0];
3647 rgba
[i
][gDst
] = f
[1];
3648 rgba
[i
][bDst
] = f
[2];
3649 rgba
[i
][aDst
] = 1.0F
;
3654 _mesa_problem(NULL
, "bad srcType in extract float data");
3661 static inline GLuint
3662 clamp_float_to_uint(GLfloat f
)
3664 return f
< 0.0F
? 0 : F_TO_I(f
);
3668 static inline GLuint
3669 clamp_half_to_uint(GLhalfARB h
)
3671 GLfloat f
= _mesa_half_to_float(h
);
3672 return f
< 0.0F
? 0 : F_TO_I(f
);
3677 * \sa extract_float_rgba()
3680 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3681 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3682 GLboolean swapBytes
)
3684 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3686 GLint rDst
, bDst
, gDst
, aDst
;
3688 ASSERT(srcFormat
== GL_RED
||
3689 srcFormat
== GL_GREEN
||
3690 srcFormat
== GL_BLUE
||
3691 srcFormat
== GL_ALPHA
||
3692 srcFormat
== GL_LUMINANCE
||
3693 srcFormat
== GL_LUMINANCE_ALPHA
||
3694 srcFormat
== GL_INTENSITY
||
3695 srcFormat
== GL_RG
||
3696 srcFormat
== GL_RGB
||
3697 srcFormat
== GL_BGR
||
3698 srcFormat
== GL_RGBA
||
3699 srcFormat
== GL_BGRA
||
3700 srcFormat
== GL_ABGR_EXT
||
3701 srcFormat
== GL_RED_INTEGER_EXT
||
3702 srcFormat
== GL_RG_INTEGER
||
3703 srcFormat
== GL_GREEN_INTEGER_EXT
||
3704 srcFormat
== GL_BLUE_INTEGER_EXT
||
3705 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3706 srcFormat
== GL_RGB_INTEGER_EXT
||
3707 srcFormat
== GL_RGBA_INTEGER_EXT
||
3708 srcFormat
== GL_BGR_INTEGER_EXT
||
3709 srcFormat
== GL_BGRA_INTEGER_EXT
||
3710 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3711 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3713 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3714 srcType
== GL_BYTE
||
3715 srcType
== GL_UNSIGNED_SHORT
||
3716 srcType
== GL_SHORT
||
3717 srcType
== GL_UNSIGNED_INT
||
3718 srcType
== GL_INT
||
3719 srcType
== GL_HALF_FLOAT_ARB
||
3720 srcType
== GL_FLOAT
||
3721 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3722 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3723 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3724 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3725 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3726 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3727 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3728 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3729 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3730 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3731 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3732 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3733 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3734 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3736 get_component_mapping(srcFormat
,
3737 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3738 &rDst
, &gDst
, &bDst
, &aDst
);
3740 stride
= _mesa_components_in_format(srcFormat
);
3742 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3743 if ((SRC_INDEX) < 0) { \
3745 for (i = 0; i < n; i++) { \
3746 rgba[i][DST_INDEX] = DEFAULT; \
3749 else if (swapBytes) { \
3750 const TYPE *s = (const TYPE *) src; \
3752 for (i = 0; i < n; i++) { \
3753 TYPE value = s[SRC_INDEX]; \
3754 if (sizeof(TYPE) == 2) { \
3757 else if (sizeof(TYPE) == 4) { \
3760 rgba[i][DST_INDEX] = CONVERSION(value); \
3765 const TYPE *s = (const TYPE *) src; \
3767 for (i = 0; i < n; i++) { \
3768 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3774 case GL_UNSIGNED_BYTE
:
3775 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3776 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3777 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3778 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3781 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3782 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3783 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3784 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3786 case GL_UNSIGNED_SHORT
:
3787 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3788 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3789 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3790 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3793 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3794 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3795 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3796 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3798 case GL_UNSIGNED_INT
:
3799 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3800 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3801 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3802 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3805 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3806 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3807 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3808 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3811 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3812 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3813 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3814 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3816 case GL_HALF_FLOAT_ARB
:
3817 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3818 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3819 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3820 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3822 case GL_UNSIGNED_BYTE_3_3_2
:
3824 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3826 for (i
= 0; i
< n
; i
++) {
3827 GLubyte p
= ubsrc
[i
];
3828 rgba
[i
][rDst
] = ((p
>> 5) );
3829 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3830 rgba
[i
][bDst
] = ((p
) & 0x3);
3835 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3837 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3839 for (i
= 0; i
< n
; i
++) {
3840 GLubyte p
= ubsrc
[i
];
3841 rgba
[i
][rDst
] = ((p
) & 0x7);
3842 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3843 rgba
[i
][bDst
] = ((p
>> 6) );
3848 case GL_UNSIGNED_SHORT_5_6_5
:
3850 const GLushort
*ussrc
= (const GLushort
*) src
;
3852 for (i
= 0; i
< n
; i
++) {
3853 GLushort p
= ussrc
[i
];
3855 rgba
[i
][rDst
] = ((p
>> 11) );
3856 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3857 rgba
[i
][bDst
] = ((p
) & 0x1f);
3862 const GLushort
*ussrc
= (const GLushort
*) src
;
3864 for (i
= 0; i
< n
; i
++) {
3865 GLushort p
= ussrc
[i
];
3866 rgba
[i
][rDst
] = ((p
>> 11) );
3867 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3868 rgba
[i
][bDst
] = ((p
) & 0x1f);
3873 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3875 const GLushort
*ussrc
= (const GLushort
*) src
;
3877 for (i
= 0; i
< n
; i
++) {
3878 GLushort p
= ussrc
[i
];
3880 rgba
[i
][rDst
] = ((p
) & 0x1f);
3881 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3882 rgba
[i
][bDst
] = ((p
>> 11) );
3887 const GLushort
*ussrc
= (const GLushort
*) src
;
3889 for (i
= 0; i
< n
; i
++) {
3890 GLushort p
= ussrc
[i
];
3891 rgba
[i
][rDst
] = ((p
) & 0x1f);
3892 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3893 rgba
[i
][bDst
] = ((p
>> 11) );
3898 case GL_UNSIGNED_SHORT_4_4_4_4
:
3900 const GLushort
*ussrc
= (const GLushort
*) src
;
3902 for (i
= 0; i
< n
; i
++) {
3903 GLushort p
= ussrc
[i
];
3905 rgba
[i
][rDst
] = ((p
>> 12) );
3906 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3907 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3908 rgba
[i
][aDst
] = ((p
) & 0xf);
3912 const GLushort
*ussrc
= (const GLushort
*) src
;
3914 for (i
= 0; i
< n
; i
++) {
3915 GLushort p
= ussrc
[i
];
3916 rgba
[i
][rDst
] = ((p
>> 12) );
3917 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3918 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3919 rgba
[i
][aDst
] = ((p
) & 0xf);
3923 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3925 const GLushort
*ussrc
= (const GLushort
*) src
;
3927 for (i
= 0; i
< n
; i
++) {
3928 GLushort p
= ussrc
[i
];
3930 rgba
[i
][rDst
] = ((p
) & 0xf);
3931 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3932 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3933 rgba
[i
][aDst
] = ((p
>> 12) );
3937 const GLushort
*ussrc
= (const GLushort
*) src
;
3939 for (i
= 0; i
< n
; i
++) {
3940 GLushort p
= ussrc
[i
];
3941 rgba
[i
][rDst
] = ((p
) & 0xf);
3942 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3943 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3944 rgba
[i
][aDst
] = ((p
>> 12) );
3948 case GL_UNSIGNED_SHORT_5_5_5_1
:
3950 const GLushort
*ussrc
= (const GLushort
*) src
;
3952 for (i
= 0; i
< n
; i
++) {
3953 GLushort p
= ussrc
[i
];
3955 rgba
[i
][rDst
] = ((p
>> 11) );
3956 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3957 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3958 rgba
[i
][aDst
] = ((p
) & 0x1 );
3962 const GLushort
*ussrc
= (const GLushort
*) src
;
3964 for (i
= 0; i
< n
; i
++) {
3965 GLushort p
= ussrc
[i
];
3966 rgba
[i
][rDst
] = ((p
>> 11) );
3967 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3968 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3969 rgba
[i
][aDst
] = ((p
) & 0x1 );
3973 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3975 const GLushort
*ussrc
= (const GLushort
*) src
;
3977 for (i
= 0; i
< n
; i
++) {
3978 GLushort p
= ussrc
[i
];
3980 rgba
[i
][rDst
] = ((p
) & 0x1f);
3981 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3982 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3983 rgba
[i
][aDst
] = ((p
>> 15) );
3987 const GLushort
*ussrc
= (const GLushort
*) src
;
3989 for (i
= 0; i
< n
; i
++) {
3990 GLushort p
= ussrc
[i
];
3991 rgba
[i
][rDst
] = ((p
) & 0x1f);
3992 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3993 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3994 rgba
[i
][aDst
] = ((p
>> 15) );
3998 case GL_UNSIGNED_INT_8_8_8_8
:
4000 const GLuint
*uisrc
= (const GLuint
*) src
;
4002 for (i
= 0; i
< n
; i
++) {
4003 GLuint p
= uisrc
[i
];
4004 rgba
[i
][rDst
] = ((p
) & 0xff);
4005 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4006 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4007 rgba
[i
][aDst
] = ((p
>> 24) );
4011 const GLuint
*uisrc
= (const GLuint
*) src
;
4013 for (i
= 0; i
< n
; i
++) {
4014 GLuint p
= uisrc
[i
];
4015 rgba
[i
][rDst
] = ((p
>> 24) );
4016 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4017 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4018 rgba
[i
][aDst
] = ((p
) & 0xff);
4022 case GL_UNSIGNED_INT_8_8_8_8_REV
:
4024 const GLuint
*uisrc
= (const GLuint
*) src
;
4026 for (i
= 0; i
< n
; i
++) {
4027 GLuint p
= uisrc
[i
];
4028 rgba
[i
][rDst
] = ((p
>> 24) );
4029 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
4030 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
4031 rgba
[i
][aDst
] = ((p
) & 0xff);
4035 const GLuint
*uisrc
= (const GLuint
*) src
;
4037 for (i
= 0; i
< n
; i
++) {
4038 GLuint p
= uisrc
[i
];
4039 rgba
[i
][rDst
] = ((p
) & 0xff);
4040 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
4041 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
4042 rgba
[i
][aDst
] = ((p
>> 24) );
4046 case GL_UNSIGNED_INT_10_10_10_2
:
4048 const GLuint
*uisrc
= (const GLuint
*) src
;
4050 for (i
= 0; i
< n
; i
++) {
4051 GLuint p
= uisrc
[i
];
4053 rgba
[i
][rDst
] = ((p
>> 22) );
4054 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4055 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4056 rgba
[i
][aDst
] = ((p
) & 0x3 );
4060 const GLuint
*uisrc
= (const GLuint
*) src
;
4062 for (i
= 0; i
< n
; i
++) {
4063 GLuint p
= uisrc
[i
];
4064 rgba
[i
][rDst
] = ((p
>> 22) );
4065 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
4066 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
4067 rgba
[i
][aDst
] = ((p
) & 0x3 );
4071 case GL_UNSIGNED_INT_2_10_10_10_REV
:
4073 const GLuint
*uisrc
= (const GLuint
*) src
;
4075 for (i
= 0; i
< n
; i
++) {
4076 GLuint p
= uisrc
[i
];
4078 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4079 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4080 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4081 rgba
[i
][aDst
] = ((p
>> 30) );
4085 const GLuint
*uisrc
= (const GLuint
*) src
;
4087 for (i
= 0; i
< n
; i
++) {
4088 GLuint p
= uisrc
[i
];
4089 rgba
[i
][rDst
] = ((p
) & 0x3ff);
4090 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
4091 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
4092 rgba
[i
][aDst
] = ((p
>> 30) );
4096 case GL_UNSIGNED_INT_5_9_9_9_REV
:
4098 const GLuint
*uisrc
= (const GLuint
*) src
;
4101 for (i
= 0; i
< n
; i
++) {
4102 GLuint p
= uisrc
[i
];
4104 rgb9e5_to_float3(p
, f
);
4105 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4106 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4107 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4112 const GLuint
*uisrc
= (const GLuint
*) src
;
4115 for (i
= 0; i
< n
; i
++) {
4116 GLuint p
= uisrc
[i
];
4117 rgb9e5_to_float3(p
, f
);
4118 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4119 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4120 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4125 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
4127 const GLuint
*uisrc
= (const GLuint
*) src
;
4130 for (i
= 0; i
< n
; i
++) {
4131 GLuint p
= uisrc
[i
];
4133 r11g11b10f_to_float3(p
, f
);
4134 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4135 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4136 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4141 const GLuint
*uisrc
= (const GLuint
*) src
;
4144 for (i
= 0; i
< n
; i
++) {
4145 GLuint p
= uisrc
[i
];
4146 r11g11b10f_to_float3(p
, f
);
4147 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
4148 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
4149 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
4155 _mesa_problem(NULL
, "bad srcType in extract uint data");
4164 * Unpack a row of color image data from a client buffer according to
4165 * the pixel unpacking parameters.
4166 * Return GLubyte values in the specified dest image format.
4167 * This is used by glDrawPixels and glTexImage?D().
4168 * \param ctx - the context
4169 * n - number of pixels in the span
4170 * dstFormat - format of destination color array
4171 * dest - the destination color array
4172 * srcFormat - source image format
4173 * srcType - source image data type
4174 * source - source image pointer
4175 * srcPacking - pixel unpacking parameters
4176 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
4178 * XXX perhaps expand this to process whole images someday.
4181 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
4182 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
4183 GLenum srcFormat
, GLenum srcType
,
4184 const GLvoid
*source
,
4185 const struct gl_pixelstore_attrib
*srcPacking
,
4186 GLbitfield transferOps
)
4188 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4189 ASSERT(dstFormat
== GL_ALPHA
||
4190 dstFormat
== GL_LUMINANCE
||
4191 dstFormat
== GL_LUMINANCE_ALPHA
||
4192 dstFormat
== GL_INTENSITY
||
4193 dstFormat
== GL_RED
||
4194 dstFormat
== GL_RG
||
4195 dstFormat
== GL_RGB
||
4196 dstFormat
== GL_RGBA
);
4198 ASSERT(srcFormat
== GL_RED
||
4199 srcFormat
== GL_GREEN
||
4200 srcFormat
== GL_BLUE
||
4201 srcFormat
== GL_ALPHA
||
4202 srcFormat
== GL_LUMINANCE
||
4203 srcFormat
== GL_LUMINANCE_ALPHA
||
4204 srcFormat
== GL_INTENSITY
||
4205 srcFormat
== GL_RG
||
4206 srcFormat
== GL_RGB
||
4207 srcFormat
== GL_BGR
||
4208 srcFormat
== GL_RGBA
||
4209 srcFormat
== GL_BGRA
||
4210 srcFormat
== GL_ABGR_EXT
||
4211 srcFormat
== GL_COLOR_INDEX
);
4213 ASSERT(srcType
== GL_BITMAP
||
4214 srcType
== GL_UNSIGNED_BYTE
||
4215 srcType
== GL_BYTE
||
4216 srcType
== GL_UNSIGNED_SHORT
||
4217 srcType
== GL_SHORT
||
4218 srcType
== GL_UNSIGNED_INT
||
4219 srcType
== GL_INT
||
4220 srcType
== GL_HALF_FLOAT_ARB
||
4221 srcType
== GL_FLOAT
||
4222 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4223 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4224 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4225 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4226 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4227 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4228 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4229 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4230 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4231 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4232 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4233 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4234 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4235 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4237 /* EXT_texture_integer specifies no transfer ops on integer
4238 * types in the resolved issues section. Just set them to 0
4239 * for integer surfaces.
4244 /* Try simple cases first */
4245 if (transferOps
== 0) {
4246 if (srcType
== GL_UNSIGNED_BYTE
) {
4247 if (dstFormat
== GL_RGBA
) {
4248 if (srcFormat
== GL_RGBA
) {
4249 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
4252 else if (srcFormat
== GL_RGB
) {
4254 const GLubyte
*src
= (const GLubyte
*) source
;
4255 GLubyte
*dst
= dest
;
4256 for (i
= 0; i
< n
; i
++) {
4267 else if (dstFormat
== GL_RGB
) {
4268 if (srcFormat
== GL_RGB
) {
4269 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
4272 else if (srcFormat
== GL_RGBA
) {
4274 const GLubyte
*src
= (const GLubyte
*) source
;
4275 GLubyte
*dst
= dest
;
4276 for (i
= 0; i
< n
; i
++) {
4286 else if (dstFormat
== srcFormat
) {
4287 GLint comps
= _mesa_components_in_format(srcFormat
);
4289 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
4296 /* general solution begins here */
4298 GLint dstComponents
;
4299 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4300 GLfloat (*rgba
)[4] = malloc(4 * n
* sizeof(GLfloat
));
4303 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4307 dstComponents
= _mesa_components_in_format( dstFormat
);
4308 /* source & dest image formats should have been error checked by now */
4309 assert(dstComponents
> 0);
4312 * Extract image data and convert to RGBA floats
4314 if (srcFormat
== GL_COLOR_INDEX
) {
4315 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4318 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4323 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4326 /* Convert indexes to RGBA */
4327 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4328 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4330 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4332 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4333 * with color indexes.
4335 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4340 /* non-color index data */
4341 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4342 srcPacking
->SwapBytes
);
4345 /* Need to clamp if returning GLubytes */
4346 transferOps
|= IMAGE_CLAMP_BIT
;
4349 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4352 get_component_indexes(dstFormat
,
4353 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4355 /* Now return the GLubyte data in the requested dstFormat */
4357 GLubyte
*dst
= dest
;
4359 for (i
= 0; i
< n
; i
++) {
4360 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
4361 dst
+= dstComponents
;
4366 GLubyte
*dst
= dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
4370 dst
+= dstComponents
;
4375 GLubyte
*dst
= dest
;
4377 for (i
= 0; i
< n
; i
++) {
4378 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
4379 dst
+= dstComponents
;
4384 GLubyte
*dst
= dest
;
4386 for (i
= 0; i
< n
; i
++) {
4387 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
4388 dst
+= dstComponents
;
4393 GLubyte
*dst
= dest
;
4396 assert(dstComponents
== 1);
4397 for (i
= 0; i
< n
; i
++) {
4398 /* Intensity comes from red channel */
4399 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
4404 GLubyte
*dst
= dest
;
4407 for (i
= 0; i
< n
; i
++) {
4408 /* Luminance comes from red channel */
4409 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
4410 dst
+= dstComponents
;
4420 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
4421 * instead of GLubyte.
4424 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
4425 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
4426 GLenum srcFormat
, GLenum srcType
,
4427 const GLvoid
*source
,
4428 const struct gl_pixelstore_attrib
*srcPacking
,
4429 GLbitfield transferOps
)
4431 ASSERT(dstFormat
== GL_ALPHA
||
4432 dstFormat
== GL_LUMINANCE
||
4433 dstFormat
== GL_LUMINANCE_ALPHA
||
4434 dstFormat
== GL_INTENSITY
||
4435 dstFormat
== GL_RED
||
4436 dstFormat
== GL_RG
||
4437 dstFormat
== GL_RGB
||
4438 dstFormat
== GL_RGBA
);
4440 ASSERT(srcFormat
== GL_RED
||
4441 srcFormat
== GL_GREEN
||
4442 srcFormat
== GL_BLUE
||
4443 srcFormat
== GL_ALPHA
||
4444 srcFormat
== GL_LUMINANCE
||
4445 srcFormat
== GL_LUMINANCE_ALPHA
||
4446 srcFormat
== GL_INTENSITY
||
4447 srcFormat
== GL_RG
||
4448 srcFormat
== GL_RGB
||
4449 srcFormat
== GL_BGR
||
4450 srcFormat
== GL_RGBA
||
4451 srcFormat
== GL_BGRA
||
4452 srcFormat
== GL_ABGR_EXT
||
4453 srcFormat
== GL_RED_INTEGER_EXT
||
4454 srcFormat
== GL_GREEN_INTEGER_EXT
||
4455 srcFormat
== GL_BLUE_INTEGER_EXT
||
4456 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4457 srcFormat
== GL_RG_INTEGER
||
4458 srcFormat
== GL_RGB_INTEGER_EXT
||
4459 srcFormat
== GL_RGBA_INTEGER_EXT
||
4460 srcFormat
== GL_BGR_INTEGER_EXT
||
4461 srcFormat
== GL_BGRA_INTEGER_EXT
||
4462 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4463 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
4464 srcFormat
== GL_COLOR_INDEX
);
4466 ASSERT(srcType
== GL_BITMAP
||
4467 srcType
== GL_UNSIGNED_BYTE
||
4468 srcType
== GL_BYTE
||
4469 srcType
== GL_UNSIGNED_SHORT
||
4470 srcType
== GL_SHORT
||
4471 srcType
== GL_UNSIGNED_INT
||
4472 srcType
== GL_INT
||
4473 srcType
== GL_HALF_FLOAT_ARB
||
4474 srcType
== GL_FLOAT
||
4475 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4476 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4477 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4478 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4479 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4480 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4481 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4482 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4483 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4484 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4485 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4486 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4487 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4488 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4490 /* general solution, no special cases, yet */
4492 GLint dstComponents
;
4493 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4494 GLfloat (*rgba
)[4] = malloc(4 * n
* sizeof(GLfloat
));
4495 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
4498 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4502 dstComponents
= _mesa_components_in_format( dstFormat
);
4503 /* source & dest image formats should have been error checked by now */
4504 assert(dstComponents
> 0);
4506 /* EXT_texture_integer specifies no transfer ops on integer
4507 * types in the resolved issues section. Just set them to 0
4508 * for integer surfaces.
4514 * Extract image data and convert to RGBA floats
4516 if (srcFormat
== GL_COLOR_INDEX
) {
4517 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4520 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4525 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
4528 /* Convert indexes to RGBA */
4529 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4530 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4532 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
4534 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
4535 * with color indexes.
4537 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
4542 /* non-color index data */
4543 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4544 srcPacking
->SwapBytes
);
4548 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4551 get_component_indexes(dstFormat
,
4552 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4554 /* Now pack results in the requested dstFormat */
4556 GLfloat
*dst
= dest
;
4558 for (i
= 0; i
< n
; i
++) {
4559 dst
[rDst
] = rgba
[i
][RCOMP
];
4560 dst
+= dstComponents
;
4565 GLfloat
*dst
= dest
;
4567 for (i
= 0; i
< n
; i
++) {
4568 dst
[gDst
] = rgba
[i
][GCOMP
];
4569 dst
+= dstComponents
;
4574 GLfloat
*dst
= dest
;
4576 for (i
= 0; i
< n
; i
++) {
4577 dst
[bDst
] = rgba
[i
][BCOMP
];
4578 dst
+= dstComponents
;
4583 GLfloat
*dst
= dest
;
4585 for (i
= 0; i
< n
; i
++) {
4586 dst
[aDst
] = rgba
[i
][ACOMP
];
4587 dst
+= dstComponents
;
4592 GLfloat
*dst
= dest
;
4595 assert(dstComponents
== 1);
4596 for (i
= 0; i
< n
; i
++) {
4597 /* Intensity comes from red channel */
4598 dst
[i
] = rgba
[i
][RCOMP
];
4603 GLfloat
*dst
= dest
;
4606 for (i
= 0; i
< n
; i
++) {
4607 /* Luminance comes from red channel */
4608 dst
[0] = rgba
[i
][RCOMP
];
4609 dst
+= dstComponents
;
4619 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4620 * instead of GLubyte.
4621 * No pixel transfer ops are applied.
4624 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4625 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4626 GLenum srcFormat
, GLenum srcType
,
4627 const GLvoid
*source
,
4628 const struct gl_pixelstore_attrib
*srcPacking
)
4630 GLuint (*rgba
)[4] = malloc(n
* 4 * sizeof(GLfloat
));
4633 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4637 ASSERT(dstFormat
== GL_ALPHA
||
4638 dstFormat
== GL_LUMINANCE
||
4639 dstFormat
== GL_LUMINANCE_ALPHA
||
4640 dstFormat
== GL_INTENSITY
||
4641 dstFormat
== GL_RED
||
4642 dstFormat
== GL_RG
||
4643 dstFormat
== GL_RGB
||
4644 dstFormat
== GL_RGBA
);
4646 ASSERT(srcFormat
== GL_RED
||
4647 srcFormat
== GL_GREEN
||
4648 srcFormat
== GL_BLUE
||
4649 srcFormat
== GL_ALPHA
||
4650 srcFormat
== GL_LUMINANCE
||
4651 srcFormat
== GL_LUMINANCE_ALPHA
||
4652 srcFormat
== GL_INTENSITY
||
4653 srcFormat
== GL_RG
||
4654 srcFormat
== GL_RGB
||
4655 srcFormat
== GL_BGR
||
4656 srcFormat
== GL_RGBA
||
4657 srcFormat
== GL_BGRA
||
4658 srcFormat
== GL_ABGR_EXT
||
4659 srcFormat
== GL_RED_INTEGER_EXT
||
4660 srcFormat
== GL_GREEN_INTEGER_EXT
||
4661 srcFormat
== GL_BLUE_INTEGER_EXT
||
4662 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4663 srcFormat
== GL_RG_INTEGER
||
4664 srcFormat
== GL_RGB_INTEGER_EXT
||
4665 srcFormat
== GL_RGBA_INTEGER_EXT
||
4666 srcFormat
== GL_BGR_INTEGER_EXT
||
4667 srcFormat
== GL_BGRA_INTEGER_EXT
||
4668 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4669 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4671 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4672 srcType
== GL_BYTE
||
4673 srcType
== GL_UNSIGNED_SHORT
||
4674 srcType
== GL_SHORT
||
4675 srcType
== GL_UNSIGNED_INT
||
4676 srcType
== GL_INT
||
4677 srcType
== GL_HALF_FLOAT_ARB
||
4678 srcType
== GL_FLOAT
||
4679 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4680 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4681 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4682 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4683 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4684 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4685 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4686 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4687 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4688 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4689 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4690 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4691 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4692 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4695 /* Extract image data as uint[4] pixels */
4696 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4697 srcPacking
->SwapBytes
);
4699 if (dstFormat
== GL_RGBA
) {
4701 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4705 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4706 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4708 assert(dstComponents
> 0);
4710 get_component_indexes(dstFormat
,
4711 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4713 /* Now pack values in the requested dest format */
4717 for (i
= 0; i
< n
; i
++) {
4718 dst
[rDst
] = rgba
[i
][RCOMP
];
4719 dst
+= dstComponents
;
4726 for (i
= 0; i
< n
; i
++) {
4727 dst
[gDst
] = rgba
[i
][GCOMP
];
4728 dst
+= dstComponents
;
4735 for (i
= 0; i
< n
; i
++) {
4736 dst
[bDst
] = rgba
[i
][BCOMP
];
4737 dst
+= dstComponents
;
4744 for (i
= 0; i
< n
; i
++) {
4745 dst
[aDst
] = rgba
[i
][ACOMP
];
4746 dst
+= dstComponents
;
4754 assert(dstComponents
== 1);
4755 for (i
= 0; i
< n
; i
++) {
4756 /* Intensity comes from red channel */
4757 dst
[i
] = rgba
[i
][RCOMP
];
4765 for (i
= 0; i
< n
; i
++) {
4766 /* Luminance comes from red channel */
4767 dst
[0] = rgba
[i
][RCOMP
];
4768 dst
+= dstComponents
;
4778 * Unpack a row of color index data from a client buffer according to
4779 * the pixel unpacking parameters.
4780 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4782 * Args: ctx - the context
4783 * n - number of pixels
4784 * dstType - destination data type
4785 * dest - destination array
4786 * srcType - source pixel type
4787 * source - source data pointer
4788 * srcPacking - pixel unpacking parameters
4789 * transferOps - the pixel transfer operations to apply
4792 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4793 GLenum dstType
, GLvoid
*dest
,
4794 GLenum srcType
, const GLvoid
*source
,
4795 const struct gl_pixelstore_attrib
*srcPacking
,
4796 GLbitfield transferOps
)
4798 ASSERT(srcType
== GL_BITMAP
||
4799 srcType
== GL_UNSIGNED_BYTE
||
4800 srcType
== GL_BYTE
||
4801 srcType
== GL_UNSIGNED_SHORT
||
4802 srcType
== GL_SHORT
||
4803 srcType
== GL_UNSIGNED_INT
||
4804 srcType
== GL_INT
||
4805 srcType
== GL_HALF_FLOAT_ARB
||
4806 srcType
== GL_FLOAT
);
4808 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4809 dstType
== GL_UNSIGNED_SHORT
||
4810 dstType
== GL_UNSIGNED_INT
);
4813 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4816 * Try simple cases first
4818 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4819 && dstType
== GL_UNSIGNED_BYTE
) {
4820 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4822 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4823 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4824 memcpy(dest
, source
, n
* sizeof(GLuint
));
4830 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4833 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4837 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4841 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4843 /* convert to dest type */
4845 case GL_UNSIGNED_BYTE
:
4847 GLubyte
*dst
= (GLubyte
*) dest
;
4849 for (i
= 0; i
< n
; i
++) {
4850 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4854 case GL_UNSIGNED_SHORT
:
4856 GLuint
*dst
= (GLuint
*) dest
;
4858 for (i
= 0; i
< n
; i
++) {
4859 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4863 case GL_UNSIGNED_INT
:
4864 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4867 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4876 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4877 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4878 const struct gl_pixelstore_attrib
*dstPacking
,
4879 GLbitfield transferOps
)
4881 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
4884 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4888 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4890 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4891 /* make a copy of input */
4892 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4893 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4898 case GL_UNSIGNED_BYTE
:
4900 GLubyte
*dst
= (GLubyte
*) dest
;
4902 for (i
= 0; i
< n
; i
++) {
4903 *dst
++ = (GLubyte
) source
[i
];
4909 GLbyte
*dst
= (GLbyte
*) dest
;
4911 for (i
= 0; i
< n
; i
++) {
4912 dst
[i
] = (GLbyte
) source
[i
];
4916 case GL_UNSIGNED_SHORT
:
4918 GLushort
*dst
= (GLushort
*) dest
;
4920 for (i
= 0; i
< n
; i
++) {
4921 dst
[i
] = (GLushort
) source
[i
];
4923 if (dstPacking
->SwapBytes
) {
4924 _mesa_swap2( (GLushort
*) dst
, n
);
4930 GLshort
*dst
= (GLshort
*) dest
;
4932 for (i
= 0; i
< n
; i
++) {
4933 dst
[i
] = (GLshort
) source
[i
];
4935 if (dstPacking
->SwapBytes
) {
4936 _mesa_swap2( (GLushort
*) dst
, n
);
4940 case GL_UNSIGNED_INT
:
4942 GLuint
*dst
= (GLuint
*) dest
;
4944 for (i
= 0; i
< n
; i
++) {
4945 dst
[i
] = (GLuint
) source
[i
];
4947 if (dstPacking
->SwapBytes
) {
4948 _mesa_swap4( (GLuint
*) dst
, n
);
4954 GLint
*dst
= (GLint
*) dest
;
4956 for (i
= 0; i
< n
; i
++) {
4957 dst
[i
] = (GLint
) source
[i
];
4959 if (dstPacking
->SwapBytes
) {
4960 _mesa_swap4( (GLuint
*) dst
, n
);
4966 GLfloat
*dst
= (GLfloat
*) dest
;
4968 for (i
= 0; i
< n
; i
++) {
4969 dst
[i
] = (GLfloat
) source
[i
];
4971 if (dstPacking
->SwapBytes
) {
4972 _mesa_swap4( (GLuint
*) dst
, n
);
4976 case GL_HALF_FLOAT_ARB
:
4978 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4980 for (i
= 0; i
< n
; i
++) {
4981 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4983 if (dstPacking
->SwapBytes
) {
4984 _mesa_swap2( (GLushort
*) dst
, n
);
4989 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4997 * Unpack a row of stencil data from a client buffer according to
4998 * the pixel unpacking parameters.
4999 * This is (or will be) used by glDrawPixels
5001 * Args: ctx - the context
5002 * n - number of pixels
5003 * dstType - destination data type
5004 * dest - destination array
5005 * srcType - source pixel type
5006 * source - source data pointer
5007 * srcPacking - pixel unpacking parameters
5008 * transferOps - apply offset/bias/lookup ops?
5011 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5012 GLenum dstType
, GLvoid
*dest
,
5013 GLenum srcType
, const GLvoid
*source
,
5014 const struct gl_pixelstore_attrib
*srcPacking
,
5015 GLbitfield transferOps
)
5017 ASSERT(srcType
== GL_BITMAP
||
5018 srcType
== GL_UNSIGNED_BYTE
||
5019 srcType
== GL_BYTE
||
5020 srcType
== GL_UNSIGNED_SHORT
||
5021 srcType
== GL_SHORT
||
5022 srcType
== GL_UNSIGNED_INT
||
5023 srcType
== GL_INT
||
5024 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
5025 srcType
== GL_HALF_FLOAT_ARB
||
5026 srcType
== GL_FLOAT
||
5027 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5029 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
5030 dstType
== GL_UNSIGNED_SHORT
||
5031 dstType
== GL_UNSIGNED_INT
||
5032 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
5034 /* only shift and offset apply to stencil */
5035 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
5038 * Try simple cases first
5040 if (transferOps
== 0 &&
5041 !ctx
->Pixel
.MapStencilFlag
&&
5042 srcType
== GL_UNSIGNED_BYTE
&&
5043 dstType
== GL_UNSIGNED_BYTE
) {
5044 memcpy(dest
, source
, n
* sizeof(GLubyte
));
5046 else if (transferOps
== 0 &&
5047 !ctx
->Pixel
.MapStencilFlag
&&
5048 srcType
== GL_UNSIGNED_INT
&&
5049 dstType
== GL_UNSIGNED_INT
&&
5050 !srcPacking
->SwapBytes
) {
5051 memcpy(dest
, source
, n
* sizeof(GLuint
));
5057 GLuint
*indexes
= malloc(n
* sizeof(GLuint
));
5060 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
5064 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
5067 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
5068 /* shift and offset indexes */
5069 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
5072 if (ctx
->Pixel
.MapStencilFlag
) {
5073 /* Apply stencil lookup table */
5074 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
5076 for (i
= 0; i
< n
; i
++) {
5077 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
5081 /* convert to dest type */
5083 case GL_UNSIGNED_BYTE
:
5085 GLubyte
*dst
= (GLubyte
*) dest
;
5087 for (i
= 0; i
< n
; i
++) {
5088 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
5092 case GL_UNSIGNED_SHORT
:
5094 GLuint
*dst
= (GLuint
*) dest
;
5096 for (i
= 0; i
< n
; i
++) {
5097 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
5101 case GL_UNSIGNED_INT
:
5102 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
5104 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5106 GLuint
*dst
= (GLuint
*) dest
;
5108 for (i
= 0; i
< n
; i
++) {
5109 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
5114 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
5123 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
5124 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
5125 const struct gl_pixelstore_attrib
*dstPacking
)
5127 GLubyte
*stencil
= malloc(n
* sizeof(GLubyte
));
5130 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
5134 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
5135 ctx
->Pixel
.MapStencilFlag
) {
5136 /* make a copy of input */
5137 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
5138 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
5143 case GL_UNSIGNED_BYTE
:
5144 memcpy(dest
, source
, n
);
5148 GLbyte
*dst
= (GLbyte
*) dest
;
5151 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
5155 case GL_UNSIGNED_SHORT
:
5157 GLushort
*dst
= (GLushort
*) dest
;
5160 dst
[i
] = (GLushort
) source
[i
];
5162 if (dstPacking
->SwapBytes
) {
5163 _mesa_swap2( (GLushort
*) dst
, n
);
5169 GLshort
*dst
= (GLshort
*) dest
;
5172 dst
[i
] = (GLshort
) source
[i
];
5174 if (dstPacking
->SwapBytes
) {
5175 _mesa_swap2( (GLushort
*) dst
, n
);
5179 case GL_UNSIGNED_INT
:
5181 GLuint
*dst
= (GLuint
*) dest
;
5184 dst
[i
] = (GLuint
) source
[i
];
5186 if (dstPacking
->SwapBytes
) {
5187 _mesa_swap4( (GLuint
*) dst
, n
);
5193 GLint
*dst
= (GLint
*) dest
;
5196 dst
[i
] = (GLint
) source
[i
];
5198 if (dstPacking
->SwapBytes
) {
5199 _mesa_swap4( (GLuint
*) dst
, n
);
5205 GLfloat
*dst
= (GLfloat
*) dest
;
5208 dst
[i
] = (GLfloat
) source
[i
];
5210 if (dstPacking
->SwapBytes
) {
5211 _mesa_swap4( (GLuint
*) dst
, n
);
5215 case GL_HALF_FLOAT_ARB
:
5217 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5220 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
5222 if (dstPacking
->SwapBytes
) {
5223 _mesa_swap2( (GLushort
*) dst
, n
);
5228 if (dstPacking
->LsbFirst
) {
5229 GLubyte
*dst
= (GLubyte
*) dest
;
5232 for (i
= 0; i
< n
; i
++) {
5235 *dst
|= ((source
[i
] != 0) << shift
);
5244 GLubyte
*dst
= (GLubyte
*) dest
;
5247 for (i
= 0; i
< n
; i
++) {
5250 *dst
|= ((source
[i
] != 0) << shift
);
5260 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
5266 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
5269 const GLTYPE *src = (const GLTYPE *)source; \
5270 for (i = 0; i < n; i++) { \
5271 GLTYPE value = src[i]; \
5272 if (srcPacking->SwapBytes) { \
5273 if (sizeof(GLTYPE) == 2) { \
5275 } else if (sizeof(GLTYPE) == 4) { \
5279 depthValues[i] = GLTYPE2FLOAT(value); \
5285 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
5286 * or GLfloat values.
5287 * The glPixelTransfer (scale/bias) params will be applied.
5289 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
5290 * \param depthMax max value for returned GLushort or GLuint values
5291 * (ignored for GLfloat).
5294 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
5295 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
5296 GLenum srcType
, const GLvoid
*source
,
5297 const struct gl_pixelstore_attrib
*srcPacking
)
5299 GLfloat
*depthTemp
= NULL
, *depthValues
;
5300 GLboolean needClamp
= GL_FALSE
;
5302 /* Look for special cases first.
5303 * Not only are these faster, they're less prone to numeric conversion
5304 * problems. Otherwise, converting from an int type to a float then
5305 * back to an int type can introduce errors that will show up as
5306 * artifacts in things like depth peeling which uses glCopyTexImage.
5308 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
5309 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
5310 const GLuint
*src
= (const GLuint
*) source
;
5311 GLushort
*dst
= (GLushort
*) dest
;
5313 for (i
= 0; i
< n
; i
++) {
5314 dst
[i
] = src
[i
] >> 16;
5318 if (srcType
== GL_UNSIGNED_SHORT
5319 && dstType
== GL_UNSIGNED_INT
5320 && depthMax
== 0xffffffff) {
5321 const GLushort
*src
= (const GLushort
*) source
;
5322 GLuint
*dst
= (GLuint
*) dest
;
5324 for (i
= 0; i
< n
; i
++) {
5325 dst
[i
] = src
[i
] | (src
[i
] << 16);
5329 if (srcType
== GL_UNSIGNED_INT_24_8
5330 && dstType
== GL_UNSIGNED_INT
5331 && depthMax
== 0xffffff) {
5332 const GLuint
*src
= (const GLuint
*) source
;
5333 GLuint
*dst
= (GLuint
*) dest
;
5335 for (i
= 0; i
< n
; i
++) {
5336 dst
[i
] = src
[i
] >> 8;
5340 /* XXX may want to add additional cases here someday */
5343 /* general case path follows */
5345 if (dstType
== GL_FLOAT
) {
5346 depthValues
= (GLfloat
*) dest
;
5349 depthTemp
= malloc(n
* sizeof(GLfloat
));
5351 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
5355 depthValues
= depthTemp
;
5358 /* Convert incoming values to GLfloat. Some conversions will require
5363 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
5364 needClamp
= GL_TRUE
;
5366 case GL_UNSIGNED_BYTE
:
5367 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
5370 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
5371 needClamp
= GL_TRUE
;
5373 case GL_UNSIGNED_SHORT
:
5374 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
5377 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
5378 needClamp
= GL_TRUE
;
5380 case GL_UNSIGNED_INT
:
5381 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
5383 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
5384 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
5385 depthMax
== 0xffffff &&
5386 ctx
->Pixel
.DepthScale
== 1.0 &&
5387 ctx
->Pixel
.DepthBias
== 0.0) {
5388 const GLuint
*src
= (const GLuint
*) source
;
5389 GLuint
*zValues
= (GLuint
*) dest
;
5391 for (i
= 0; i
< n
; i
++) {
5392 GLuint value
= src
[i
];
5393 if (srcPacking
->SwapBytes
) {
5396 zValues
[i
] = value
& 0xffffff00;
5402 const GLuint
*src
= (const GLuint
*) source
;
5403 const GLfloat scale
= 1.0f
/ 0xffffff;
5405 for (i
= 0; i
< n
; i
++) {
5406 GLuint value
= src
[i
];
5407 if (srcPacking
->SwapBytes
) {
5410 depthValues
[i
] = (value
>> 8) * scale
;
5414 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5417 const GLfloat
*src
= (const GLfloat
*)source
;
5418 for (i
= 0; i
< n
; i
++) {
5419 GLfloat value
= src
[i
* 2];
5420 if (srcPacking
->SwapBytes
) {
5423 depthValues
[i
] = value
;
5425 needClamp
= GL_TRUE
;
5429 DEPTH_VALUES(GLfloat
, 1*);
5430 needClamp
= GL_TRUE
;
5432 case GL_HALF_FLOAT_ARB
:
5435 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
5436 for (i
= 0; i
< n
; i
++) {
5437 GLhalfARB value
= src
[i
];
5438 if (srcPacking
->SwapBytes
) {
5441 depthValues
[i
] = _mesa_half_to_float(value
);
5443 needClamp
= GL_TRUE
;
5447 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
5452 /* apply depth scale and bias */
5454 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
5455 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
5456 if (scale
!= 1.0 || bias
!= 0.0) {
5458 for (i
= 0; i
< n
; i
++) {
5459 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
5461 needClamp
= GL_TRUE
;
5465 /* clamp to [0, 1] */
5468 for (i
= 0; i
< n
; i
++) {
5469 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
5474 * Convert values to dstType
5476 if (dstType
== GL_UNSIGNED_INT
) {
5477 GLuint
*zValues
= (GLuint
*) dest
;
5479 if (depthMax
<= 0xffffff) {
5480 /* no overflow worries */
5481 for (i
= 0; i
< n
; i
++) {
5482 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5486 /* need to use double precision to prevent overflow problems */
5487 for (i
= 0; i
< n
; i
++) {
5488 GLdouble z
= depthValues
[i
] * (GLdouble
) depthMax
;
5489 if (z
>= (GLdouble
) 0xffffffff)
5490 zValues
[i
] = 0xffffffff;
5492 zValues
[i
] = (GLuint
) z
;
5496 else if (dstType
== GL_UNSIGNED_SHORT
) {
5497 GLushort
*zValues
= (GLushort
*) dest
;
5499 ASSERT(depthMax
<= 0xffff);
5500 for (i
= 0; i
< n
; i
++) {
5501 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5504 else if (dstType
== GL_FLOAT
) {
5505 /* Nothing to do. depthValues is pointing to dest. */
5507 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
5508 GLfloat
*zValues
= (GLfloat
*) dest
;
5510 for (i
= 0; i
< n
; i
++) {
5511 zValues
[i
*2] = depthValues
[i
];
5523 * Pack an array of depth values. The values are floats in [0,1].
5526 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
5527 GLenum dstType
, const GLfloat
*depthSpan
,
5528 const struct gl_pixelstore_attrib
*dstPacking
)
5530 GLfloat
*depthCopy
= malloc(n
* sizeof(GLfloat
));
5532 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5536 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5537 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5538 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5539 depthSpan
= depthCopy
;
5543 case GL_UNSIGNED_BYTE
:
5545 GLubyte
*dst
= (GLubyte
*) dest
;
5547 for (i
= 0; i
< n
; i
++) {
5548 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5554 GLbyte
*dst
= (GLbyte
*) dest
;
5556 for (i
= 0; i
< n
; i
++) {
5557 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5561 case GL_UNSIGNED_SHORT
:
5563 GLushort
*dst
= (GLushort
*) dest
;
5565 for (i
= 0; i
< n
; i
++) {
5566 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5568 if (dstPacking
->SwapBytes
) {
5569 _mesa_swap2( (GLushort
*) dst
, n
);
5575 GLshort
*dst
= (GLshort
*) dest
;
5577 for (i
= 0; i
< n
; i
++) {
5578 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5580 if (dstPacking
->SwapBytes
) {
5581 _mesa_swap2( (GLushort
*) dst
, n
);
5585 case GL_UNSIGNED_INT
:
5587 GLuint
*dst
= (GLuint
*) dest
;
5589 for (i
= 0; i
< n
; i
++) {
5590 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5592 if (dstPacking
->SwapBytes
) {
5593 _mesa_swap4( (GLuint
*) dst
, n
);
5599 GLint
*dst
= (GLint
*) dest
;
5601 for (i
= 0; i
< n
; i
++) {
5602 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5604 if (dstPacking
->SwapBytes
) {
5605 _mesa_swap4( (GLuint
*) dst
, n
);
5611 GLfloat
*dst
= (GLfloat
*) dest
;
5613 for (i
= 0; i
< n
; i
++) {
5614 dst
[i
] = depthSpan
[i
];
5616 if (dstPacking
->SwapBytes
) {
5617 _mesa_swap4( (GLuint
*) dst
, n
);
5621 case GL_HALF_FLOAT_ARB
:
5623 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5625 for (i
= 0; i
< n
; i
++) {
5626 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5628 if (dstPacking
->SwapBytes
) {
5629 _mesa_swap2( (GLushort
*) dst
, n
);
5634 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5643 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5646 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5647 GLenum dstType
, GLuint
*dest
,
5648 const GLfloat
*depthVals
,
5649 const GLubyte
*stencilVals
,
5650 const struct gl_pixelstore_attrib
*dstPacking
)
5652 GLfloat
*depthCopy
= malloc(n
* sizeof(GLfloat
));
5653 GLubyte
*stencilCopy
= malloc(n
* sizeof(GLubyte
));
5656 if (!depthCopy
|| !stencilCopy
) {
5657 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5663 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5664 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5665 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5666 depthVals
= depthCopy
;
5669 if (ctx
->Pixel
.IndexShift
||
5670 ctx
->Pixel
.IndexOffset
||
5671 ctx
->Pixel
.MapStencilFlag
) {
5672 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5673 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5674 stencilVals
= stencilCopy
;
5678 case GL_UNSIGNED_INT_24_8
:
5679 for (i
= 0; i
< n
; i
++) {
5680 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5681 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5684 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5685 for (i
= 0; i
< n
; i
++) {
5686 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5687 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5692 if (dstPacking
->SwapBytes
) {
5693 _mesa_swap4(dest
, n
);
5704 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5705 * Return all image data in a contiguous block. This is used when we
5706 * compile glDrawPixels, glTexImage, etc into a display list. We
5707 * need a copy of the data in a standard format.
5710 _mesa_unpack_image( GLuint dimensions
,
5711 GLsizei width
, GLsizei height
, GLsizei depth
,
5712 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5713 const struct gl_pixelstore_attrib
*unpack
)
5715 GLint bytesPerRow
, compsPerRow
;
5716 GLboolean flipBytes
, swap2
, swap4
;
5719 return NULL
; /* not necessarily an error */
5721 if (width
<= 0 || height
<= 0 || depth
<= 0)
5722 return NULL
; /* generate error later */
5724 if (type
== GL_BITMAP
) {
5725 bytesPerRow
= (width
+ 7) >> 3;
5726 flipBytes
= unpack
->LsbFirst
;
5727 swap2
= swap4
= GL_FALSE
;
5731 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5732 GLint components
= _mesa_components_in_format(format
);
5735 if (_mesa_type_is_packed(type
))
5738 if (bytesPerPixel
<= 0 || components
<= 0)
5739 return NULL
; /* bad format or type. generate error later */
5740 bytesPerRow
= bytesPerPixel
* width
;
5741 bytesPerComp
= bytesPerPixel
/ components
;
5742 flipBytes
= GL_FALSE
;
5743 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5744 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5745 compsPerRow
= components
* width
;
5746 assert(compsPerRow
>= width
);
5751 = malloc(bytesPerRow
* height
* depth
);
5755 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5758 for (img
= 0; img
< depth
; img
++) {
5759 for (row
= 0; row
< height
; row
++) {
5760 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5761 width
, height
, format
, type
, img
, row
, 0);
5763 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5765 flipBytes
= GL_FALSE
;
5766 if (unpack
->LsbFirst
) {
5767 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5768 GLubyte dstMask
= 128;
5769 const GLubyte
*s
= src
;
5772 for (i
= 0; i
< width
; i
++) {
5776 if (srcMask
== 128) {
5781 srcMask
= srcMask
<< 1;
5789 dstMask
= dstMask
>> 1;
5794 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5795 GLubyte dstMask
= 128;
5796 const GLubyte
*s
= src
;
5799 for (i
= 0; i
< width
; i
++) {
5808 srcMask
= srcMask
>> 1;
5816 dstMask
= dstMask
>> 1;
5822 memcpy(dst
, src
, bytesPerRow
);
5825 /* byte flipping/swapping */
5827 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5830 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5833 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5845 * If we unpack colors from a luminance surface, we'll get pixel colors
5846 * such as (l, l, l, a).
5847 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5848 * function will compute L=R+G+B before packing. The net effect is we'll
5849 * accidentally store luminance values = 3*l.
5850 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5852 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5855 * Finally, we also need to do this when the actual surface format does
5856 * not match the logical surface format. For example, suppose the user
5857 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5858 * Again, we'll get pixel values like (l,l,l,a).
5861 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5865 switch (baseFormat
) {
5867 for (i
= 0; i
< n
; i
++) {
5868 rgba
[i
][RCOMP
] = 0.0F
;
5869 rgba
[i
][GCOMP
] = 0.0F
;
5870 rgba
[i
][BCOMP
] = 0.0F
;
5876 for (i
= 0; i
< n
; i
++) {
5877 rgba
[i
][GCOMP
] = 0.0F
;
5878 rgba
[i
][BCOMP
] = 0.0F
;
5879 rgba
[i
][ACOMP
] = 1.0F
;
5882 case GL_LUMINANCE_ALPHA
:
5883 for (i
= 0; i
< n
; i
++) {
5884 rgba
[i
][GCOMP
] = 0.0F
;
5885 rgba
[i
][BCOMP
] = 0.0F
;
5889 for (i
= 0; i
< n
; i
++) {
5890 rgba
[i
][ACOMP
] = 1.0F
;
5894 for (i
= 0; i
< n
; i
++) {
5895 rgba
[i
][BCOMP
] = 0.0F
;
5896 rgba
[i
][ACOMP
] = 1.0F
;
5900 for (i
= 0; i
< n
; i
++) {
5901 rgba
[i
][GCOMP
] = 0.0F
;
5902 rgba
[i
][BCOMP
] = 0.0F
;
5903 rgba
[i
][ACOMP
] = 1.0F
;
5915 * As above, but GLuint components.
5918 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5922 switch (baseFormat
) {
5924 for (i
= 0; i
< n
; i
++) {
5933 for (i
= 0; i
< n
; i
++) {
5939 case GL_LUMINANCE_ALPHA
:
5940 for (i
= 0; i
< n
; i
++) {
5946 for (i
= 0; i
< n
; i
++) {
5951 for (i
= 0; i
< n
; i
++) {
5957 for (i
= 0; i
< n
; i
++) {