2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34 * this global optimization.
37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
40 #if defined(_MSC_VER) && defined(_M_X64)
41 # pragma optimize( "g", off )
53 #include "pixeltransfer.h"
55 #include "glformats.h"
56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
61 * Flip the 8 bits in each byte of the given array.
64 * \param n number of bytes.
66 * \todo try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
74 flip_bytes( GLubyte
*p
, GLuint n
)
77 for (i
= 0; i
< n
; i
++) {
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
94 * Unpack a 32x32 pixel polygon stipple from user memory using the
95 * current pixel unpack settings.
98 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
99 const struct gl_pixelstore_attrib
*unpacking
)
101 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
103 /* Convert pattern from GLubytes to GLuints and handle big/little
108 for (i
= 0; i
< 32; i
++) {
109 dest
[i
] = (p
[0] << 24)
121 * Pack polygon stipple into user memory given current pixel packing
125 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
126 const struct gl_pixelstore_attrib
*packing
)
128 /* Convert pattern from GLuints to GLubytes to handle big/little
129 * endian differences.
133 for (i
= 0; i
< 32; i
++) {
134 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
135 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
136 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
137 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
140 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
146 * order with row alignment = 1 byte.
149 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
150 const struct gl_pixelstore_attrib
*packing
)
152 GLint bytes
, row
, width_in_bytes
;
153 GLubyte
*buffer
, *dst
;
158 /* Alloc dest storage */
159 bytes
= ((width
+ 7) / 8 * height
);
160 buffer
= (GLubyte
*) malloc( bytes
);
164 width_in_bytes
= CEILING( width
, 8 );
166 for (row
= 0; row
< height
; row
++) {
167 const GLubyte
*src
= (const GLubyte
*)
168 _mesa_image_address2d(packing
, pixels
, width
, height
,
169 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
175 if ((packing
->SkipPixels
& 7) == 0) {
176 memcpy( dst
, src
, width_in_bytes
);
177 if (packing
->LsbFirst
) {
178 flip_bytes( dst
, width_in_bytes
);
182 /* handling SkipPixels is a bit tricky (no pun intended!) */
184 if (packing
->LsbFirst
) {
185 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
186 GLubyte dstMask
= 128;
187 const GLubyte
*s
= src
;
190 for (i
= 0; i
< width
; i
++) {
194 if (srcMask
== 128) {
199 srcMask
= srcMask
<< 1;
207 dstMask
= dstMask
>> 1;
212 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
213 GLubyte dstMask
= 128;
214 const GLubyte
*s
= src
;
217 for (i
= 0; i
< width
; i
++) {
226 srcMask
= srcMask
>> 1;
234 dstMask
= dstMask
>> 1;
239 dst
+= width_in_bytes
;
250 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
251 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
253 GLint row
, width_in_bytes
;
259 width_in_bytes
= CEILING( width
, 8 );
261 for (row
= 0; row
< height
; row
++) {
262 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
263 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
267 if ((packing
->SkipPixels
& 7) == 0) {
268 memcpy( dst
, src
, width_in_bytes
);
269 if (packing
->LsbFirst
) {
270 flip_bytes( dst
, width_in_bytes
);
274 /* handling SkipPixels is a bit tricky (no pun intended!) */
276 if (packing
->LsbFirst
) {
277 GLubyte srcMask
= 128;
278 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
279 const GLubyte
*s
= src
;
282 for (i
= 0; i
< width
; i
++) {
291 srcMask
= srcMask
>> 1;
293 if (dstMask
== 128) {
299 dstMask
= dstMask
<< 1;
304 GLubyte srcMask
= 128;
305 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
306 const GLubyte
*s
= src
;
309 for (i
= 0; i
< width
; i
++) {
318 srcMask
= srcMask
>> 1;
326 dstMask
= dstMask
>> 1;
331 src
+= width_in_bytes
;
337 * Get indexes of color components for a basic color format, such as
338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
342 get_component_indexes(GLenum format
,
347 GLint
*luminanceIndex
,
348 GLint
*intensityIndex
)
354 *luminanceIndex
= -1;
355 *intensityIndex
= -1;
359 case GL_LUMINANCE_INTEGER_EXT
:
362 case GL_LUMINANCE_ALPHA
:
363 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
371 case GL_RED_INTEGER_EXT
:
375 case GL_GREEN_INTEGER_EXT
:
379 case GL_BLUE_INTEGER_EXT
:
383 case GL_ALPHA_INTEGER_EXT
:
392 case GL_RGB_INTEGER_EXT
:
398 case GL_BGR_INTEGER_EXT
:
404 case GL_RGBA_INTEGER_EXT
:
411 case GL_BGRA_INTEGER
:
429 assert(0 && "bad format in get_component_indexes()");
436 * For small integer types, return the min and max possible values.
437 * Used for clamping floats to unscaled integer types.
438 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
441 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
448 case GL_UNSIGNED_BYTE
:
456 case GL_UNSIGNED_SHORT
:
465 /* Customization of integer packing. We always treat src as uint, and can pack dst
466 * as any integer type/format combo.
468 #define SRC_TYPE GLuint
470 #define DST_TYPE GLuint
471 #define SRC_CONVERT(x) (x)
472 #define FN_NAME pack_uint_from_uint_rgba
473 #include "pack_tmp.h"
478 #define DST_TYPE GLushort
479 #define SRC_CONVERT(x) MIN2(x, 0xffff)
480 #define FN_NAME pack_ushort_from_uint_rgba
481 #include "pack_tmp.h"
486 #define DST_TYPE GLshort
487 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
488 #define FN_NAME pack_short_from_uint_rgba
489 #include "pack_tmp.h"
494 #define DST_TYPE GLubyte
495 #define SRC_CONVERT(x) MIN2(x, 0xff)
496 #define FN_NAME pack_ubyte_from_uint_rgba
497 #include "pack_tmp.h"
502 #define DST_TYPE GLbyte
503 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
504 #define FN_NAME pack_byte_from_uint_rgba
505 #include "pack_tmp.h"
511 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
512 GLenum dstFormat
, GLenum dstType
,
516 case GL_UNSIGNED_INT
:
517 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
520 /* No conversion necessary. */
521 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
523 case GL_UNSIGNED_SHORT
:
524 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
527 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
529 case GL_UNSIGNED_BYTE
:
530 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
533 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
543 * Used to pack an array [][4] of RGBA float colors as specified
544 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
545 * Historically, the RGBA values were in [0,1] and rescaled to fit
546 * into GLubytes, etc. But with new integer formats, the RGBA values
547 * may have any value and we don't always rescale when converting to
550 * Note: the rgba values will be modified by this function when any pixel
551 * transfer ops are enabled.
554 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
555 GLenum dstFormat
, GLenum dstType
,
557 const struct gl_pixelstore_attrib
*dstPacking
,
558 GLbitfield transferOps
)
561 const GLint comps
= _mesa_components_in_format(dstFormat
);
562 const GLboolean intDstFormat
= _mesa_is_enum_format_integer(dstFormat
);
565 if (dstFormat
== GL_LUMINANCE
||
566 dstFormat
== GL_LUMINANCE_ALPHA
||
567 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
568 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
569 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
571 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
579 /* EXT_texture_integer specifies no transfer ops on integer
580 * types in the resolved issues section. Just set them to 0
581 * for integer surfaces.
587 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
591 * Component clamping (besides clamping to [0,1] in
592 * _mesa_apply_rgba_transfer_ops()).
595 /* clamping to dest type's min/max values */
597 if (get_type_min_max(dstType
, &min
, &max
)) {
598 for (i
= 0; i
< n
; i
++) {
599 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
600 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
601 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
602 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
606 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
607 /* compute luminance values */
608 if (transferOps
& IMAGE_CLAMP_BIT
) {
609 for (i
= 0; i
< n
; i
++) {
610 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
611 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
615 for (i
= 0; i
< n
; i
++) {
616 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
622 * Pack/store the pixels. Ugh! Lots of cases!!!
625 case GL_UNSIGNED_BYTE
:
627 GLubyte
*dst
= (GLubyte
*) dstAddr
;
631 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
635 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
639 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
643 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
647 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
649 case GL_LUMINANCE_ALPHA
:
651 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
652 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
657 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
658 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
663 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
664 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
665 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
670 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
671 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
672 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
673 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
678 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
679 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
680 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
685 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
686 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
687 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
688 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
693 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
694 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
695 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
696 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
699 case GL_RED_INTEGER_EXT
:
701 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
704 case GL_GREEN_INTEGER_EXT
:
706 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
709 case GL_BLUE_INTEGER_EXT
:
711 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
714 case GL_ALPHA_INTEGER_EXT
:
716 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
721 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
722 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
725 case GL_RGB_INTEGER_EXT
:
727 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
728 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
729 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
732 case GL_RGBA_INTEGER_EXT
:
734 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
735 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
736 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
737 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
740 case GL_BGR_INTEGER_EXT
:
742 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
743 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
744 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
747 case GL_BGRA_INTEGER_EXT
:
749 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
750 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
751 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
752 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
755 case GL_LUMINANCE_INTEGER_EXT
:
757 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
760 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
763 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
765 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
773 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
774 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
778 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
784 GLbyte
*dst
= (GLbyte
*) dstAddr
;
788 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
792 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
796 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
800 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
804 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
806 case GL_LUMINANCE_ALPHA
:
808 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
809 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
814 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
815 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
820 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
821 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
822 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
827 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
828 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
829 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
830 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
835 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
836 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
837 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
842 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
843 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
844 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
845 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
850 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
851 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
852 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
853 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
856 case GL_RED_INTEGER_EXT
:
858 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
861 case GL_GREEN_INTEGER_EXT
:
863 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
866 case GL_BLUE_INTEGER_EXT
:
868 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
871 case GL_ALPHA_INTEGER_EXT
:
873 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
878 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
879 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
882 case GL_RGB_INTEGER_EXT
:
884 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
885 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
886 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
889 case GL_RGBA_INTEGER_EXT
:
891 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
892 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
893 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
894 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
897 case GL_BGR_INTEGER_EXT
:
899 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
900 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
901 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
904 case GL_BGRA_INTEGER_EXT
:
906 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
907 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
908 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
909 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
912 case GL_LUMINANCE_INTEGER_EXT
:
914 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
917 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
920 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
922 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
930 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
931 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
935 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
939 case GL_UNSIGNED_SHORT
:
941 GLushort
*dst
= (GLushort
*) dstAddr
;
945 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
949 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
953 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
957 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
961 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
963 case GL_LUMINANCE_ALPHA
:
965 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
966 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
972 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
977 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
979 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
984 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
986 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
987 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
992 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
993 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
994 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
999 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1000 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1001 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1002 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1007 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1008 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1009 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1010 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1013 case GL_RED_INTEGER_EXT
:
1015 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1018 case GL_GREEN_INTEGER_EXT
:
1020 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1023 case GL_BLUE_INTEGER_EXT
:
1025 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1028 case GL_ALPHA_INTEGER_EXT
:
1030 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1035 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1036 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1039 case GL_RGB_INTEGER_EXT
:
1041 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1042 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1043 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1046 case GL_RGBA_INTEGER_EXT
:
1048 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1049 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1050 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1051 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1054 case GL_BGR_INTEGER_EXT
:
1056 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1057 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1058 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1061 case GL_BGRA_INTEGER_EXT
:
1063 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1064 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1065 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1066 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1069 case GL_LUMINANCE_INTEGER_EXT
:
1071 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1074 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1077 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1079 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1087 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1088 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1092 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1098 GLshort
*dst
= (GLshort
*) dstAddr
;
1099 switch (dstFormat
) {
1102 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1106 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1110 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1114 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1118 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1120 case GL_LUMINANCE_ALPHA
:
1122 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1123 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1128 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1129 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1134 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1135 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1136 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1141 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1142 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1143 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1144 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1149 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1150 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1151 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1156 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1157 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1158 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1159 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1164 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1165 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1166 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1167 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1170 case GL_RED_INTEGER_EXT
:
1172 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1175 case GL_GREEN_INTEGER_EXT
:
1177 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1180 case GL_BLUE_INTEGER_EXT
:
1182 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1185 case GL_ALPHA_INTEGER_EXT
:
1187 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1192 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1193 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1196 case GL_RGB_INTEGER_EXT
:
1198 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1199 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1200 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1203 case GL_RGBA_INTEGER_EXT
:
1205 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1206 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1207 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1208 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1211 case GL_BGR_INTEGER_EXT
:
1213 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1214 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1215 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1218 case GL_BGRA_INTEGER_EXT
:
1220 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1221 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1222 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1223 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1226 case GL_LUMINANCE_INTEGER_EXT
:
1228 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1231 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1234 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1236 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1244 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1245 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1249 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1253 case GL_UNSIGNED_INT
:
1255 GLuint
*dst
= (GLuint
*) dstAddr
;
1256 switch (dstFormat
) {
1259 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1263 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1267 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1271 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1275 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1277 case GL_LUMINANCE_ALPHA
:
1279 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1280 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1285 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1286 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1291 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1292 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1293 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1298 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1299 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1300 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1301 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1306 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1307 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1308 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1313 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1314 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1315 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1316 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1321 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1322 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1323 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1324 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1327 case GL_RED_INTEGER_EXT
:
1329 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1332 case GL_GREEN_INTEGER_EXT
:
1334 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1337 case GL_BLUE_INTEGER_EXT
:
1339 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1342 case GL_ALPHA_INTEGER_EXT
:
1344 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1349 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1350 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1353 case GL_RGB_INTEGER_EXT
:
1355 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1356 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1357 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1360 case GL_RGBA_INTEGER_EXT
:
1362 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1363 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1364 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1365 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1368 case GL_BGR_INTEGER_EXT
:
1370 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1371 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1372 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1375 case GL_BGRA_INTEGER_EXT
:
1377 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1378 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1379 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1380 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1383 case GL_LUMINANCE_INTEGER_EXT
:
1385 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1388 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1391 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1393 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1401 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1402 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1406 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1412 GLint
*dst
= (GLint
*) dstAddr
;
1413 switch (dstFormat
) {
1416 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1420 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1424 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1428 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1432 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1434 case GL_LUMINANCE_ALPHA
:
1436 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1437 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1442 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1443 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1448 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1449 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1450 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1455 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1456 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1457 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1458 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1463 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1464 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1465 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1470 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1471 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1472 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1473 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1478 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1479 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1480 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1481 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1487 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1488 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1491 case GL_RED_INTEGER_EXT
:
1493 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1496 case GL_GREEN_INTEGER_EXT
:
1498 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1501 case GL_BLUE_INTEGER_EXT
:
1503 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1506 case GL_ALPHA_INTEGER_EXT
:
1508 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1513 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1514 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1517 case GL_RGB_INTEGER_EXT
:
1519 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1520 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1521 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1524 case GL_RGBA_INTEGER_EXT
:
1526 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1527 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1528 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1529 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1532 case GL_BGR_INTEGER_EXT
:
1534 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1535 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1536 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1539 case GL_BGRA_INTEGER_EXT
:
1541 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1542 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1543 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1544 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1547 case GL_LUMINANCE_INTEGER_EXT
:
1549 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1552 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1555 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1557 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1563 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1569 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1570 switch (dstFormat
) {
1573 dst
[i
] = rgba
[i
][RCOMP
];
1577 dst
[i
] = rgba
[i
][GCOMP
];
1581 dst
[i
] = rgba
[i
][BCOMP
];
1585 dst
[i
] = rgba
[i
][ACOMP
];
1589 dst
[i
] = luminance
[i
];
1591 case GL_LUMINANCE_ALPHA
:
1593 dst
[i
*2+0] = luminance
[i
];
1594 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1599 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1600 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1605 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1606 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1607 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1612 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1613 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1614 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1615 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1620 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1621 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1622 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1627 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1628 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1629 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1630 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1635 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1636 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1637 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1638 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1644 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1645 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1649 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1653 case GL_HALF_FLOAT_ARB
:
1655 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1656 switch (dstFormat
) {
1659 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1663 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1667 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1671 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1675 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1677 case GL_LUMINANCE_ALPHA
:
1679 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1680 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1685 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1686 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1691 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1692 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1693 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1698 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1699 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1700 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1701 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1706 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1707 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1708 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1713 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1714 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1715 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1716 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1721 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1722 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1723 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1724 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1730 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1731 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1735 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1739 case GL_UNSIGNED_BYTE_3_3_2
:
1740 if (dstFormat
== GL_RGB
) {
1741 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1743 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1744 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1745 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
1749 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1750 if (dstFormat
== GL_RGB
) {
1751 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1753 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
1754 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1755 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1759 case GL_UNSIGNED_SHORT_5_6_5
:
1760 if (dstFormat
== GL_RGB
) {
1761 GLushort
*dst
= (GLushort
*) dstAddr
;
1763 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1764 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1765 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
1769 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1770 if (dstFormat
== GL_RGB
) {
1771 GLushort
*dst
= (GLushort
*) dstAddr
;
1773 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1774 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1775 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1779 case GL_UNSIGNED_SHORT_4_4_4_4
:
1780 if (dstFormat
== GL_RGBA
) {
1781 GLushort
*dst
= (GLushort
*) dstAddr
;
1783 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1784 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1785 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1786 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1789 else if (dstFormat
== GL_BGRA
) {
1790 GLushort
*dst
= (GLushort
*) dstAddr
;
1792 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1793 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1794 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1795 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1798 else if (dstFormat
== GL_ABGR_EXT
) {
1799 GLushort
*dst
= (GLushort
*) dstAddr
;
1801 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1802 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1803 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1804 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
1808 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1809 if (dstFormat
== GL_RGBA
) {
1810 GLushort
*dst
= (GLushort
*) dstAddr
;
1812 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
1813 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1814 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1815 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1818 else if (dstFormat
== GL_BGRA
) {
1819 GLushort
*dst
= (GLushort
*) dstAddr
;
1821 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
1822 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1823 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1824 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1827 else if (dstFormat
== GL_ABGR_EXT
) {
1828 GLushort
*dst
= (GLushort
*) dstAddr
;
1830 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
1831 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1832 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1833 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1837 case GL_UNSIGNED_SHORT_5_5_5_1
:
1838 if (dstFormat
== GL_RGBA
) {
1839 GLushort
*dst
= (GLushort
*) dstAddr
;
1841 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1842 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1843 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1844 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1847 else if (dstFormat
== GL_BGRA
) {
1848 GLushort
*dst
= (GLushort
*) dstAddr
;
1850 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1851 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1852 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1853 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1856 else if (dstFormat
== GL_ABGR_EXT
) {
1857 GLushort
*dst
= (GLushort
*) dstAddr
;
1859 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1860 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1861 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1862 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
1866 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1867 if (dstFormat
== GL_RGBA
) {
1868 GLushort
*dst
= (GLushort
*) dstAddr
;
1870 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1871 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1872 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1873 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1876 else if (dstFormat
== GL_BGRA
) {
1877 GLushort
*dst
= (GLushort
*) dstAddr
;
1879 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
1880 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1881 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1882 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1885 else if (dstFormat
== GL_ABGR_EXT
) {
1886 GLushort
*dst
= (GLushort
*) dstAddr
;
1888 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
1889 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1890 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1891 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1895 case GL_UNSIGNED_INT_8_8_8_8
:
1896 if (dstFormat
== GL_RGBA
) {
1897 GLuint
*dst
= (GLuint
*) dstAddr
;
1899 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
1900 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1901 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
1902 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1905 else if (dstFormat
== GL_BGRA
) {
1906 GLuint
*dst
= (GLuint
*) dstAddr
;
1908 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
1909 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1910 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
1911 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
1914 else if (dstFormat
== GL_ABGR_EXT
) {
1915 GLuint
*dst
= (GLuint
*) dstAddr
;
1917 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
1918 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
1919 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
1920 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
1924 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1925 if (dstFormat
== GL_RGBA
) {
1926 GLuint
*dst
= (GLuint
*) dstAddr
;
1928 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
1929 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1930 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1931 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1934 else if (dstFormat
== GL_BGRA
) {
1935 GLuint
*dst
= (GLuint
*) dstAddr
;
1937 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
1938 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1939 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1940 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1943 else if (dstFormat
== GL_ABGR_EXT
) {
1944 GLuint
*dst
= (GLuint
*) dstAddr
;
1946 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
1947 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1948 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1949 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1953 case GL_UNSIGNED_INT_10_10_10_2
:
1954 if (dstFormat
== GL_RGBA
) {
1955 GLuint
*dst
= (GLuint
*) dstAddr
;
1957 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1958 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1959 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1960 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1963 else if (dstFormat
== GL_BGRA
) {
1964 GLuint
*dst
= (GLuint
*) dstAddr
;
1966 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1967 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1968 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1969 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
1972 else if (dstFormat
== GL_ABGR_EXT
) {
1973 GLuint
*dst
= (GLuint
*) dstAddr
;
1975 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1976 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1977 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1978 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
1982 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1983 if (dstFormat
== GL_RGBA
) {
1984 GLuint
*dst
= (GLuint
*) dstAddr
;
1986 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
1987 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1988 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1989 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1992 else if (dstFormat
== GL_BGRA
) {
1993 GLuint
*dst
= (GLuint
*) dstAddr
;
1995 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
1996 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1997 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1998 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2001 else if (dstFormat
== GL_ABGR_EXT
) {
2002 GLuint
*dst
= (GLuint
*) dstAddr
;
2004 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2005 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2006 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2007 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2011 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2013 GLuint
*dst
= (GLuint
*) dstAddr
;
2014 for (i
= 0; i
< n
; i
++) {
2015 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2019 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2021 GLuint
*dst
= (GLuint
*) dstAddr
;
2022 for (i
= 0; i
< n
; i
++) {
2023 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2028 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2033 if (dstPacking
->SwapBytes
) {
2034 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2035 if (swapSize
== 2) {
2036 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2038 else if (swapSize
== 4) {
2039 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2048 #define SWAP2BYTE(VALUE) \
2050 GLubyte *bytes = (GLubyte *) &(VALUE); \
2051 GLubyte tmp = bytes[0]; \
2052 bytes[0] = bytes[1]; \
2056 #define SWAP4BYTE(VALUE) \
2058 GLubyte *bytes = (GLubyte *) &(VALUE); \
2059 GLubyte tmp = bytes[0]; \
2060 bytes[0] = bytes[3]; \
2063 bytes[1] = bytes[2]; \
2069 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2070 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2071 const struct gl_pixelstore_attrib
*unpack
)
2073 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2075 ASSERT(srcType
== GL_BITMAP
||
2076 srcType
== GL_UNSIGNED_BYTE
||
2077 srcType
== GL_BYTE
||
2078 srcType
== GL_UNSIGNED_SHORT
||
2079 srcType
== GL_SHORT
||
2080 srcType
== GL_UNSIGNED_INT
||
2081 srcType
== GL_INT
||
2082 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2083 srcType
== GL_HALF_FLOAT_ARB
||
2084 srcType
== GL_FLOAT
||
2085 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2090 GLubyte
*ubsrc
= (GLubyte
*) src
;
2091 if (unpack
->LsbFirst
) {
2092 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2094 for (i
= 0; i
< n
; i
++) {
2095 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2106 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2108 for (i
= 0; i
< n
; i
++) {
2109 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2121 case GL_UNSIGNED_BYTE
:
2124 const GLubyte
*s
= (const GLubyte
*) src
;
2125 for (i
= 0; i
< n
; i
++)
2132 const GLbyte
*s
= (const GLbyte
*) src
;
2133 for (i
= 0; i
< n
; i
++)
2137 case GL_UNSIGNED_SHORT
:
2140 const GLushort
*s
= (const GLushort
*) src
;
2141 if (unpack
->SwapBytes
) {
2142 for (i
= 0; i
< n
; i
++) {
2143 GLushort value
= s
[i
];
2149 for (i
= 0; i
< n
; i
++)
2157 const GLshort
*s
= (const GLshort
*) src
;
2158 if (unpack
->SwapBytes
) {
2159 for (i
= 0; i
< n
; i
++) {
2160 GLshort value
= s
[i
];
2166 for (i
= 0; i
< n
; i
++)
2171 case GL_UNSIGNED_INT
:
2174 const GLuint
*s
= (const GLuint
*) src
;
2175 if (unpack
->SwapBytes
) {
2176 for (i
= 0; i
< n
; i
++) {
2177 GLuint value
= s
[i
];
2183 for (i
= 0; i
< n
; i
++)
2191 const GLint
*s
= (const GLint
*) src
;
2192 if (unpack
->SwapBytes
) {
2193 for (i
= 0; i
< n
; i
++) {
2200 for (i
= 0; i
< n
; i
++)
2208 const GLfloat
*s
= (const GLfloat
*) src
;
2209 if (unpack
->SwapBytes
) {
2210 for (i
= 0; i
< n
; i
++) {
2211 GLfloat value
= s
[i
];
2213 indexes
[i
] = (GLuint
) value
;
2217 for (i
= 0; i
< n
; i
++)
2218 indexes
[i
] = (GLuint
) s
[i
];
2222 case GL_HALF_FLOAT_ARB
:
2225 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2226 if (unpack
->SwapBytes
) {
2227 for (i
= 0; i
< n
; i
++) {
2228 GLhalfARB value
= s
[i
];
2230 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2234 for (i
= 0; i
< n
; i
++)
2235 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2239 case GL_UNSIGNED_INT_24_8_EXT
:
2242 const GLuint
*s
= (const GLuint
*) src
;
2243 if (unpack
->SwapBytes
) {
2244 for (i
= 0; i
< n
; i
++) {
2245 GLuint value
= s
[i
];
2247 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2251 for (i
= 0; i
< n
; i
++)
2252 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2256 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2259 const GLuint
*s
= (const GLuint
*) src
;
2260 if (unpack
->SwapBytes
) {
2261 for (i
= 0; i
< n
; i
++) {
2262 GLuint value
= s
[i
*2+1];
2264 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2268 for (i
= 0; i
< n
; i
++)
2269 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2275 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2282 * Return source/dest RGBA indexes for unpacking pixels.
2285 get_component_mapping(GLenum format
,
2297 case GL_RED_INTEGER_EXT
:
2299 *gSrc
= *bSrc
= *aSrc
= -1;
2302 case GL_GREEN_INTEGER_EXT
:
2304 *rSrc
= *bSrc
= *aSrc
= -1;
2307 case GL_BLUE_INTEGER_EXT
:
2309 *rSrc
= *gSrc
= *aSrc
= -1;
2312 case GL_ALPHA_INTEGER_EXT
:
2313 *rSrc
= *gSrc
= *bSrc
= -1;
2317 case GL_LUMINANCE_INTEGER_EXT
:
2318 *rSrc
= *gSrc
= *bSrc
= 0;
2321 case GL_LUMINANCE_ALPHA
:
2322 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2323 *rSrc
= *gSrc
= *bSrc
= 0;
2327 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2341 case GL_RGB_INTEGER
:
2352 case GL_BGR_INTEGER
:
2363 case GL_RGBA_INTEGER
:
2374 case GL_BGRA_INTEGER
:
2402 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2403 _mesa_lookup_enum_by_nr(format
));
2411 * This function extracts floating point RGBA values from arbitrary
2412 * image data. srcFormat and srcType are the format and type parameters
2413 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2415 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2416 * implements the "Conversion to floating point", "Conversion to RGB",
2417 * and "Final Expansion to RGBA" operations.
2419 * Args: n - number of pixels
2420 * rgba - output colors
2421 * srcFormat - format of incoming data
2422 * srcType - data type of incoming data
2423 * src - source data pointer
2424 * swapBytes - perform byteswapping of incoming data?
2427 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2428 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2429 GLboolean swapBytes
)
2431 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2433 GLint rDst
, bDst
, gDst
, aDst
;
2434 GLboolean intFormat
;
2435 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2437 ASSERT(srcFormat
== GL_RED
||
2438 srcFormat
== GL_GREEN
||
2439 srcFormat
== GL_BLUE
||
2440 srcFormat
== GL_ALPHA
||
2441 srcFormat
== GL_LUMINANCE
||
2442 srcFormat
== GL_LUMINANCE_ALPHA
||
2443 srcFormat
== GL_INTENSITY
||
2444 srcFormat
== GL_RG
||
2445 srcFormat
== GL_RGB
||
2446 srcFormat
== GL_BGR
||
2447 srcFormat
== GL_RGBA
||
2448 srcFormat
== GL_BGRA
||
2449 srcFormat
== GL_ABGR_EXT
||
2450 srcFormat
== GL_DU8DV8_ATI
||
2451 srcFormat
== GL_DUDV_ATI
||
2452 srcFormat
== GL_RED_INTEGER_EXT
||
2453 srcFormat
== GL_GREEN_INTEGER_EXT
||
2454 srcFormat
== GL_BLUE_INTEGER_EXT
||
2455 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2456 srcFormat
== GL_RG_INTEGER
||
2457 srcFormat
== GL_RGB_INTEGER_EXT
||
2458 srcFormat
== GL_RGBA_INTEGER_EXT
||
2459 srcFormat
== GL_BGR_INTEGER_EXT
||
2460 srcFormat
== GL_BGRA_INTEGER_EXT
||
2461 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2462 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2464 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2465 srcType
== GL_BYTE
||
2466 srcType
== GL_UNSIGNED_SHORT
||
2467 srcType
== GL_SHORT
||
2468 srcType
== GL_UNSIGNED_INT
||
2469 srcType
== GL_INT
||
2470 srcType
== GL_HALF_FLOAT_ARB
||
2471 srcType
== GL_FLOAT
||
2472 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2473 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2474 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2475 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2476 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2477 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2478 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2479 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2480 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2481 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2482 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2483 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2484 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2485 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2487 get_component_mapping(srcFormat
,
2488 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2489 &rDst
, &gDst
, &bDst
, &aDst
);
2491 stride
= _mesa_components_in_format(srcFormat
);
2493 intFormat
= _mesa_is_enum_format_integer(srcFormat
);
2495 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2496 if ((SRC_INDEX) < 0) { \
2499 for (i = 0; i < n; i++) { \
2500 rgba[i][DST_INDEX] = DEFAULT_INT; \
2504 for (i = 0; i < n; i++) { \
2505 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2509 else if (swapBytes) { \
2510 const TYPE *s = (const TYPE *) src; \
2512 for (i = 0; i < n; i++) { \
2513 TYPE value = s[SRC_INDEX]; \
2514 if (sizeof(TYPE) == 2) { \
2517 else if (sizeof(TYPE) == 4) { \
2521 rgba[i][DST_INDEX] = (GLfloat) value; \
2523 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2528 const TYPE *s = (const TYPE *) src; \
2531 for (i = 0; i < n; i++) { \
2532 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2537 for (i = 0; i < n; i++) { \
2538 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2545 case GL_UNSIGNED_BYTE
:
2546 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2547 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2548 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2549 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2552 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2553 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2554 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2555 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2557 case GL_UNSIGNED_SHORT
:
2558 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2559 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2560 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2561 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2564 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2565 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2566 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2567 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2569 case GL_UNSIGNED_INT
:
2570 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2571 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2572 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2573 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2576 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2577 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2578 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2579 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2582 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2583 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2584 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2585 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2587 case GL_HALF_FLOAT_ARB
:
2588 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2589 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2590 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2591 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2593 case GL_UNSIGNED_BYTE_3_3_2
:
2595 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2602 for (i
= 0; i
< n
; i
++) {
2603 GLubyte p
= ubsrc
[i
];
2604 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2605 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2606 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2607 rgba
[i
][aDst
] = 1.0F
;
2611 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2613 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2620 for (i
= 0; i
< n
; i
++) {
2621 GLubyte p
= ubsrc
[i
];
2622 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2623 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2624 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2625 rgba
[i
][aDst
] = 1.0F
;
2629 case GL_UNSIGNED_SHORT_5_6_5
:
2636 const GLushort
*ussrc
= (const GLushort
*) src
;
2638 for (i
= 0; i
< n
; i
++) {
2639 GLushort p
= ussrc
[i
];
2641 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2642 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2643 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2644 rgba
[i
][aDst
] = 1.0F
;
2648 const GLushort
*ussrc
= (const GLushort
*) src
;
2650 for (i
= 0; i
< n
; i
++) {
2651 GLushort p
= ussrc
[i
];
2652 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2653 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2654 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2655 rgba
[i
][aDst
] = 1.0F
;
2659 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2666 const GLushort
*ussrc
= (const GLushort
*) src
;
2668 for (i
= 0; i
< n
; i
++) {
2669 GLushort p
= ussrc
[i
];
2671 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2672 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2673 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2674 rgba
[i
][aDst
] = 1.0F
;
2678 const GLushort
*ussrc
= (const GLushort
*) src
;
2680 for (i
= 0; i
< n
; i
++) {
2681 GLushort p
= ussrc
[i
];
2682 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2683 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2684 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2685 rgba
[i
][aDst
] = 1.0F
;
2689 case GL_UNSIGNED_SHORT_4_4_4_4
:
2691 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2694 const GLushort
*ussrc
= (const GLushort
*) src
;
2696 for (i
= 0; i
< n
; i
++) {
2697 GLushort p
= ussrc
[i
];
2699 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2700 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2701 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2702 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2706 const GLushort
*ussrc
= (const GLushort
*) src
;
2708 for (i
= 0; i
< n
; i
++) {
2709 GLushort p
= ussrc
[i
];
2710 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2711 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2712 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2713 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2717 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2719 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2722 const GLushort
*ussrc
= (const GLushort
*) src
;
2724 for (i
= 0; i
< n
; i
++) {
2725 GLushort p
= ussrc
[i
];
2727 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2728 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2729 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2730 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2734 const GLushort
*ussrc
= (const GLushort
*) src
;
2736 for (i
= 0; i
< n
; i
++) {
2737 GLushort p
= ussrc
[i
];
2738 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2739 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2740 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2741 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2745 case GL_UNSIGNED_SHORT_5_5_5_1
:
2747 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2750 const GLushort
*ussrc
= (const GLushort
*) src
;
2752 for (i
= 0; i
< n
; i
++) {
2753 GLushort p
= ussrc
[i
];
2755 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2756 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2757 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2758 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2762 const GLushort
*ussrc
= (const GLushort
*) src
;
2764 for (i
= 0; i
< n
; i
++) {
2765 GLushort p
= ussrc
[i
];
2766 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2767 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2768 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2769 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2773 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2775 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2778 const GLushort
*ussrc
= (const GLushort
*) src
;
2780 for (i
= 0; i
< n
; i
++) {
2781 GLushort p
= ussrc
[i
];
2783 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2784 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2785 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2786 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2790 const GLushort
*ussrc
= (const GLushort
*) src
;
2792 for (i
= 0; i
< n
; i
++) {
2793 GLushort p
= ussrc
[i
];
2794 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2795 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2796 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2797 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2801 case GL_UNSIGNED_INT_8_8_8_8
:
2803 const GLuint
*uisrc
= (const GLuint
*) src
;
2806 for (i
= 0; i
< n
; i
++) {
2807 GLuint p
= uisrc
[i
];
2808 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2809 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2810 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2811 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2815 for (i
= 0; i
< n
; i
++) {
2816 GLuint p
= uisrc
[i
];
2817 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2818 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2819 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2820 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2825 const GLuint
*uisrc
= (const GLuint
*) src
;
2828 for (i
= 0; i
< n
; i
++) {
2829 GLuint p
= uisrc
[i
];
2830 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2831 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2832 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2833 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2837 for (i
= 0; i
< n
; i
++) {
2838 GLuint p
= uisrc
[i
];
2839 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2840 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2841 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2842 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2847 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2849 const GLuint
*uisrc
= (const GLuint
*) src
;
2852 for (i
= 0; i
< n
; i
++) {
2853 GLuint p
= uisrc
[i
];
2854 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2855 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2856 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2857 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2861 for (i
= 0; i
< n
; i
++) {
2862 GLuint p
= uisrc
[i
];
2863 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2864 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2865 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2866 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2871 const GLuint
*uisrc
= (const GLuint
*) src
;
2874 for (i
= 0; i
< n
; i
++) {
2875 GLuint p
= uisrc
[i
];
2876 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2877 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2878 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2879 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2883 for (i
= 0; i
< n
; i
++) {
2884 GLuint p
= uisrc
[i
];
2885 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2886 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2887 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2888 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2893 case GL_UNSIGNED_INT_10_10_10_2
:
2895 rs
= 1.0F
/ 1023.0F
;
2896 gs
= 1.0F
/ 1023.0F
;
2897 bs
= 1.0F
/ 1023.0F
;
2901 const GLuint
*uisrc
= (const GLuint
*) src
;
2903 for (i
= 0; i
< n
; i
++) {
2904 GLuint p
= uisrc
[i
];
2906 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2907 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2908 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2909 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2913 const GLuint
*uisrc
= (const GLuint
*) src
;
2915 for (i
= 0; i
< n
; i
++) {
2916 GLuint p
= uisrc
[i
];
2917 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2918 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2919 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2920 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2924 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2926 rs
= 1.0F
/ 1023.0F
;
2927 gs
= 1.0F
/ 1023.0F
;
2928 bs
= 1.0F
/ 1023.0F
;
2932 const GLuint
*uisrc
= (const GLuint
*) src
;
2934 for (i
= 0; i
< n
; i
++) {
2935 GLuint p
= uisrc
[i
];
2937 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2938 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2939 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2940 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2944 const GLuint
*uisrc
= (const GLuint
*) src
;
2946 for (i
= 0; i
< n
; i
++) {
2947 GLuint p
= uisrc
[i
];
2948 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2949 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2950 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2951 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2955 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2957 const GLuint
*uisrc
= (const GLuint
*) src
;
2960 for (i
= 0; i
< n
; i
++) {
2961 GLuint p
= uisrc
[i
];
2963 rgb9e5_to_float3(p
, f
);
2964 rgba
[i
][rDst
] = f
[0];
2965 rgba
[i
][gDst
] = f
[1];
2966 rgba
[i
][bDst
] = f
[2];
2967 rgba
[i
][aDst
] = 1.0F
;
2971 const GLuint
*uisrc
= (const GLuint
*) src
;
2974 for (i
= 0; i
< n
; i
++) {
2975 rgb9e5_to_float3(uisrc
[i
], f
);
2976 rgba
[i
][rDst
] = f
[0];
2977 rgba
[i
][gDst
] = f
[1];
2978 rgba
[i
][bDst
] = f
[2];
2979 rgba
[i
][aDst
] = 1.0F
;
2983 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2985 const GLuint
*uisrc
= (const GLuint
*) src
;
2988 for (i
= 0; i
< n
; i
++) {
2989 GLuint p
= uisrc
[i
];
2991 r11g11b10f_to_float3(p
, f
);
2992 rgba
[i
][rDst
] = f
[0];
2993 rgba
[i
][gDst
] = f
[1];
2994 rgba
[i
][bDst
] = f
[2];
2995 rgba
[i
][aDst
] = 1.0F
;
2999 const GLuint
*uisrc
= (const GLuint
*) src
;
3002 for (i
= 0; i
< n
; i
++) {
3003 r11g11b10f_to_float3(uisrc
[i
], f
);
3004 rgba
[i
][rDst
] = f
[0];
3005 rgba
[i
][gDst
] = f
[1];
3006 rgba
[i
][bDst
] = f
[2];
3007 rgba
[i
][aDst
] = 1.0F
;
3012 _mesa_problem(NULL
, "bad srcType in extract float data");
3019 static inline GLuint
3020 clamp_float_to_uint(GLfloat f
)
3022 return f
< 0.0F
? 0 : F_TO_I(f
);
3026 static inline GLuint
3027 clamp_half_to_uint(GLhalfARB h
)
3029 GLfloat f
= _mesa_half_to_float(h
);
3030 return f
< 0.0F
? 0 : F_TO_I(f
);
3035 * \sa extract_float_rgba()
3038 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3039 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3040 GLboolean swapBytes
)
3042 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3044 GLint rDst
, bDst
, gDst
, aDst
;
3046 ASSERT(srcFormat
== GL_RED
||
3047 srcFormat
== GL_GREEN
||
3048 srcFormat
== GL_BLUE
||
3049 srcFormat
== GL_ALPHA
||
3050 srcFormat
== GL_LUMINANCE
||
3051 srcFormat
== GL_LUMINANCE_ALPHA
||
3052 srcFormat
== GL_INTENSITY
||
3053 srcFormat
== GL_RG
||
3054 srcFormat
== GL_RGB
||
3055 srcFormat
== GL_BGR
||
3056 srcFormat
== GL_RGBA
||
3057 srcFormat
== GL_BGRA
||
3058 srcFormat
== GL_ABGR_EXT
||
3059 srcFormat
== GL_DU8DV8_ATI
||
3060 srcFormat
== GL_DUDV_ATI
||
3061 srcFormat
== GL_RED_INTEGER_EXT
||
3062 srcFormat
== GL_RG_INTEGER
||
3063 srcFormat
== GL_GREEN_INTEGER_EXT
||
3064 srcFormat
== GL_BLUE_INTEGER_EXT
||
3065 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3066 srcFormat
== GL_RGB_INTEGER_EXT
||
3067 srcFormat
== GL_RGBA_INTEGER_EXT
||
3068 srcFormat
== GL_BGR_INTEGER_EXT
||
3069 srcFormat
== GL_BGRA_INTEGER_EXT
||
3070 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3071 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3073 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3074 srcType
== GL_BYTE
||
3075 srcType
== GL_UNSIGNED_SHORT
||
3076 srcType
== GL_SHORT
||
3077 srcType
== GL_UNSIGNED_INT
||
3078 srcType
== GL_INT
||
3079 srcType
== GL_HALF_FLOAT_ARB
||
3080 srcType
== GL_FLOAT
||
3081 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3082 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3083 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3084 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3085 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3086 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3087 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3088 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3089 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3090 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3091 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3092 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3093 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3094 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3096 get_component_mapping(srcFormat
,
3097 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3098 &rDst
, &gDst
, &bDst
, &aDst
);
3100 stride
= _mesa_components_in_format(srcFormat
);
3102 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3103 if ((SRC_INDEX) < 0) { \
3105 for (i = 0; i < n; i++) { \
3106 rgba[i][DST_INDEX] = DEFAULT; \
3109 else if (swapBytes) { \
3110 const TYPE *s = (const TYPE *) src; \
3112 for (i = 0; i < n; i++) { \
3113 TYPE value = s[SRC_INDEX]; \
3114 if (sizeof(TYPE) == 2) { \
3117 else if (sizeof(TYPE) == 4) { \
3120 rgba[i][DST_INDEX] = CONVERSION(value); \
3125 const TYPE *s = (const TYPE *) src; \
3127 for (i = 0; i < n; i++) { \
3128 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3134 case GL_UNSIGNED_BYTE
:
3135 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3136 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3137 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3138 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3141 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3142 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3143 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3144 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3146 case GL_UNSIGNED_SHORT
:
3147 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3148 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3149 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3150 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3153 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3154 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3155 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3156 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3158 case GL_UNSIGNED_INT
:
3159 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3160 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3161 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3162 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3165 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3166 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3167 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3168 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3171 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3172 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3173 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3174 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3176 case GL_HALF_FLOAT_ARB
:
3177 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3178 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3179 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3180 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3182 case GL_UNSIGNED_BYTE_3_3_2
:
3184 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3186 for (i
= 0; i
< n
; i
++) {
3187 GLubyte p
= ubsrc
[i
];
3188 rgba
[i
][rDst
] = ((p
>> 5) );
3189 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3190 rgba
[i
][bDst
] = ((p
) & 0x3);
3195 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3197 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3199 for (i
= 0; i
< n
; i
++) {
3200 GLubyte p
= ubsrc
[i
];
3201 rgba
[i
][rDst
] = ((p
) & 0x7);
3202 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3203 rgba
[i
][bDst
] = ((p
>> 6) );
3208 case GL_UNSIGNED_SHORT_5_6_5
:
3210 const GLushort
*ussrc
= (const GLushort
*) src
;
3212 for (i
= 0; i
< n
; i
++) {
3213 GLushort p
= ussrc
[i
];
3215 rgba
[i
][rDst
] = ((p
>> 11) );
3216 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3217 rgba
[i
][bDst
] = ((p
) & 0x1f);
3222 const GLushort
*ussrc
= (const GLushort
*) src
;
3224 for (i
= 0; i
< n
; i
++) {
3225 GLushort p
= ussrc
[i
];
3226 rgba
[i
][rDst
] = ((p
>> 11) );
3227 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3228 rgba
[i
][bDst
] = ((p
) & 0x1f);
3233 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3235 const GLushort
*ussrc
= (const GLushort
*) src
;
3237 for (i
= 0; i
< n
; i
++) {
3238 GLushort p
= ussrc
[i
];
3240 rgba
[i
][rDst
] = ((p
) & 0x1f);
3241 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3242 rgba
[i
][bDst
] = ((p
>> 11) );
3247 const GLushort
*ussrc
= (const GLushort
*) src
;
3249 for (i
= 0; i
< n
; i
++) {
3250 GLushort p
= ussrc
[i
];
3251 rgba
[i
][rDst
] = ((p
) & 0x1f);
3252 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3253 rgba
[i
][bDst
] = ((p
>> 11) );
3258 case GL_UNSIGNED_SHORT_4_4_4_4
:
3260 const GLushort
*ussrc
= (const GLushort
*) src
;
3262 for (i
= 0; i
< n
; i
++) {
3263 GLushort p
= ussrc
[i
];
3265 rgba
[i
][rDst
] = ((p
>> 12) );
3266 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3267 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3268 rgba
[i
][aDst
] = ((p
) & 0xf);
3272 const GLushort
*ussrc
= (const GLushort
*) src
;
3274 for (i
= 0; i
< n
; i
++) {
3275 GLushort p
= ussrc
[i
];
3276 rgba
[i
][rDst
] = ((p
>> 12) );
3277 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3278 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3279 rgba
[i
][aDst
] = ((p
) & 0xf);
3283 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3285 const GLushort
*ussrc
= (const GLushort
*) src
;
3287 for (i
= 0; i
< n
; i
++) {
3288 GLushort p
= ussrc
[i
];
3290 rgba
[i
][rDst
] = ((p
) & 0xf);
3291 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3292 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3293 rgba
[i
][aDst
] = ((p
>> 12) );
3297 const GLushort
*ussrc
= (const GLushort
*) src
;
3299 for (i
= 0; i
< n
; i
++) {
3300 GLushort p
= ussrc
[i
];
3301 rgba
[i
][rDst
] = ((p
) & 0xf);
3302 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3303 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3304 rgba
[i
][aDst
] = ((p
>> 12) );
3308 case GL_UNSIGNED_SHORT_5_5_5_1
:
3310 const GLushort
*ussrc
= (const GLushort
*) src
;
3312 for (i
= 0; i
< n
; i
++) {
3313 GLushort p
= ussrc
[i
];
3315 rgba
[i
][rDst
] = ((p
>> 11) );
3316 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3317 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3318 rgba
[i
][aDst
] = ((p
) & 0x1 );
3322 const GLushort
*ussrc
= (const GLushort
*) src
;
3324 for (i
= 0; i
< n
; i
++) {
3325 GLushort p
= ussrc
[i
];
3326 rgba
[i
][rDst
] = ((p
>> 11) );
3327 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3328 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3329 rgba
[i
][aDst
] = ((p
) & 0x1 );
3333 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3335 const GLushort
*ussrc
= (const GLushort
*) src
;
3337 for (i
= 0; i
< n
; i
++) {
3338 GLushort p
= ussrc
[i
];
3340 rgba
[i
][rDst
] = ((p
) & 0x1f);
3341 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3342 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3343 rgba
[i
][aDst
] = ((p
>> 15) );
3347 const GLushort
*ussrc
= (const GLushort
*) src
;
3349 for (i
= 0; i
< n
; i
++) {
3350 GLushort p
= ussrc
[i
];
3351 rgba
[i
][rDst
] = ((p
) & 0x1f);
3352 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3353 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3354 rgba
[i
][aDst
] = ((p
>> 15) );
3358 case GL_UNSIGNED_INT_8_8_8_8
:
3360 const GLuint
*uisrc
= (const GLuint
*) src
;
3362 for (i
= 0; i
< n
; i
++) {
3363 GLuint p
= uisrc
[i
];
3364 rgba
[i
][rDst
] = ((p
) & 0xff);
3365 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3366 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3367 rgba
[i
][aDst
] = ((p
>> 24) );
3371 const GLuint
*uisrc
= (const GLuint
*) src
;
3373 for (i
= 0; i
< n
; i
++) {
3374 GLuint p
= uisrc
[i
];
3375 rgba
[i
][rDst
] = ((p
>> 24) );
3376 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3377 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3378 rgba
[i
][aDst
] = ((p
) & 0xff);
3382 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3384 const GLuint
*uisrc
= (const GLuint
*) src
;
3386 for (i
= 0; i
< n
; i
++) {
3387 GLuint p
= uisrc
[i
];
3388 rgba
[i
][rDst
] = ((p
>> 24) );
3389 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3390 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3391 rgba
[i
][aDst
] = ((p
) & 0xff);
3395 const GLuint
*uisrc
= (const GLuint
*) src
;
3397 for (i
= 0; i
< n
; i
++) {
3398 GLuint p
= uisrc
[i
];
3399 rgba
[i
][rDst
] = ((p
) & 0xff);
3400 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3401 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3402 rgba
[i
][aDst
] = ((p
>> 24) );
3406 case GL_UNSIGNED_INT_10_10_10_2
:
3408 const GLuint
*uisrc
= (const GLuint
*) src
;
3410 for (i
= 0; i
< n
; i
++) {
3411 GLuint p
= uisrc
[i
];
3413 rgba
[i
][rDst
] = ((p
>> 22) );
3414 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3415 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3416 rgba
[i
][aDst
] = ((p
) & 0x3 );
3420 const GLuint
*uisrc
= (const GLuint
*) src
;
3422 for (i
= 0; i
< n
; i
++) {
3423 GLuint p
= uisrc
[i
];
3424 rgba
[i
][rDst
] = ((p
>> 22) );
3425 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3426 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3427 rgba
[i
][aDst
] = ((p
) & 0x3 );
3431 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3433 const GLuint
*uisrc
= (const GLuint
*) src
;
3435 for (i
= 0; i
< n
; i
++) {
3436 GLuint p
= uisrc
[i
];
3438 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3439 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3440 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3441 rgba
[i
][aDst
] = ((p
>> 30) );
3445 const GLuint
*uisrc
= (const GLuint
*) src
;
3447 for (i
= 0; i
< n
; i
++) {
3448 GLuint p
= uisrc
[i
];
3449 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3450 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3451 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3452 rgba
[i
][aDst
] = ((p
>> 30) );
3456 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3458 const GLuint
*uisrc
= (const GLuint
*) src
;
3461 for (i
= 0; i
< n
; i
++) {
3462 GLuint p
= uisrc
[i
];
3464 rgb9e5_to_float3(p
, f
);
3465 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3466 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3467 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3472 const GLuint
*uisrc
= (const GLuint
*) src
;
3475 for (i
= 0; i
< n
; i
++) {
3476 GLuint p
= uisrc
[i
];
3477 rgb9e5_to_float3(p
, f
);
3478 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3479 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3480 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3485 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3487 const GLuint
*uisrc
= (const GLuint
*) src
;
3490 for (i
= 0; i
< n
; i
++) {
3491 GLuint p
= uisrc
[i
];
3493 r11g11b10f_to_float3(p
, f
);
3494 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3495 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3496 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3501 const GLuint
*uisrc
= (const GLuint
*) src
;
3504 for (i
= 0; i
< n
; i
++) {
3505 GLuint p
= uisrc
[i
];
3506 r11g11b10f_to_float3(p
, f
);
3507 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3508 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3509 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3515 _mesa_problem(NULL
, "bad srcType in extract uint data");
3524 * Unpack a row of color image data from a client buffer according to
3525 * the pixel unpacking parameters.
3526 * Return GLubyte values in the specified dest image format.
3527 * This is used by glDrawPixels and glTexImage?D().
3528 * \param ctx - the context
3529 * n - number of pixels in the span
3530 * dstFormat - format of destination color array
3531 * dest - the destination color array
3532 * srcFormat - source image format
3533 * srcType - source image data type
3534 * source - source image pointer
3535 * srcPacking - pixel unpacking parameters
3536 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3538 * XXX perhaps expand this to process whole images someday.
3541 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3542 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3543 GLenum srcFormat
, GLenum srcType
,
3544 const GLvoid
*source
,
3545 const struct gl_pixelstore_attrib
*srcPacking
,
3546 GLbitfield transferOps
)
3548 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3549 ASSERT(dstFormat
== GL_ALPHA
||
3550 dstFormat
== GL_LUMINANCE
||
3551 dstFormat
== GL_LUMINANCE_ALPHA
||
3552 dstFormat
== GL_INTENSITY
||
3553 dstFormat
== GL_RED
||
3554 dstFormat
== GL_RG
||
3555 dstFormat
== GL_RGB
||
3556 dstFormat
== GL_RGBA
);
3558 ASSERT(srcFormat
== GL_RED
||
3559 srcFormat
== GL_GREEN
||
3560 srcFormat
== GL_BLUE
||
3561 srcFormat
== GL_ALPHA
||
3562 srcFormat
== GL_LUMINANCE
||
3563 srcFormat
== GL_LUMINANCE_ALPHA
||
3564 srcFormat
== GL_INTENSITY
||
3565 srcFormat
== GL_RG
||
3566 srcFormat
== GL_RGB
||
3567 srcFormat
== GL_BGR
||
3568 srcFormat
== GL_RGBA
||
3569 srcFormat
== GL_BGRA
||
3570 srcFormat
== GL_ABGR_EXT
||
3571 srcFormat
== GL_COLOR_INDEX
);
3573 ASSERT(srcType
== GL_BITMAP
||
3574 srcType
== GL_UNSIGNED_BYTE
||
3575 srcType
== GL_BYTE
||
3576 srcType
== GL_UNSIGNED_SHORT
||
3577 srcType
== GL_SHORT
||
3578 srcType
== GL_UNSIGNED_INT
||
3579 srcType
== GL_INT
||
3580 srcType
== GL_HALF_FLOAT_ARB
||
3581 srcType
== GL_FLOAT
||
3582 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3583 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3584 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3585 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3586 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3587 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3588 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3589 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3590 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3591 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3592 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3593 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3594 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3595 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3597 /* EXT_texture_integer specifies no transfer ops on integer
3598 * types in the resolved issues section. Just set them to 0
3599 * for integer surfaces.
3604 /* Try simple cases first */
3605 if (transferOps
== 0) {
3606 if (srcType
== GL_UNSIGNED_BYTE
) {
3607 if (dstFormat
== GL_RGBA
) {
3608 if (srcFormat
== GL_RGBA
) {
3609 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3612 else if (srcFormat
== GL_RGB
) {
3614 const GLubyte
*src
= (const GLubyte
*) source
;
3615 GLubyte
*dst
= dest
;
3616 for (i
= 0; i
< n
; i
++) {
3627 else if (dstFormat
== GL_RGB
) {
3628 if (srcFormat
== GL_RGB
) {
3629 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3632 else if (srcFormat
== GL_RGBA
) {
3634 const GLubyte
*src
= (const GLubyte
*) source
;
3635 GLubyte
*dst
= dest
;
3636 for (i
= 0; i
< n
; i
++) {
3646 else if (dstFormat
== srcFormat
) {
3647 GLint comps
= _mesa_components_in_format(srcFormat
);
3649 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3656 /* general solution begins here */
3658 GLint dstComponents
;
3659 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3660 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3663 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3667 dstComponents
= _mesa_components_in_format( dstFormat
);
3668 /* source & dest image formats should have been error checked by now */
3669 assert(dstComponents
> 0);
3672 * Extract image data and convert to RGBA floats
3674 if (srcFormat
== GL_COLOR_INDEX
) {
3675 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3678 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3683 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3686 /* Convert indexes to RGBA */
3687 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3688 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3690 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3692 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3693 * with color indexes.
3695 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3700 /* non-color index data */
3701 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3702 srcPacking
->SwapBytes
);
3705 /* Need to clamp if returning GLubytes */
3706 transferOps
|= IMAGE_CLAMP_BIT
;
3709 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3712 get_component_indexes(dstFormat
,
3713 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3715 /* Now return the GLubyte data in the requested dstFormat */
3717 GLubyte
*dst
= dest
;
3719 for (i
= 0; i
< n
; i
++) {
3720 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3721 dst
+= dstComponents
;
3726 GLubyte
*dst
= dest
;
3728 for (i
= 0; i
< n
; i
++) {
3729 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3730 dst
+= dstComponents
;
3735 GLubyte
*dst
= dest
;
3737 for (i
= 0; i
< n
; i
++) {
3738 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3739 dst
+= dstComponents
;
3744 GLubyte
*dst
= dest
;
3746 for (i
= 0; i
< n
; i
++) {
3747 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3748 dst
+= dstComponents
;
3753 GLubyte
*dst
= dest
;
3756 assert(dstComponents
== 1);
3757 for (i
= 0; i
< n
; i
++) {
3758 /* Intensity comes from red channel */
3759 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3764 GLubyte
*dst
= dest
;
3767 for (i
= 0; i
< n
; i
++) {
3768 /* Luminance comes from red channel */
3769 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3770 dst
+= dstComponents
;
3780 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3781 * instead of GLubyte.
3784 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3785 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3786 GLenum srcFormat
, GLenum srcType
,
3787 const GLvoid
*source
,
3788 const struct gl_pixelstore_attrib
*srcPacking
,
3789 GLbitfield transferOps
)
3791 ASSERT(dstFormat
== GL_ALPHA
||
3792 dstFormat
== GL_LUMINANCE
||
3793 dstFormat
== GL_LUMINANCE_ALPHA
||
3794 dstFormat
== GL_INTENSITY
||
3795 dstFormat
== GL_RED
||
3796 dstFormat
== GL_RG
||
3797 dstFormat
== GL_RGB
||
3798 dstFormat
== GL_RGBA
);
3800 ASSERT(srcFormat
== GL_RED
||
3801 srcFormat
== GL_GREEN
||
3802 srcFormat
== GL_BLUE
||
3803 srcFormat
== GL_ALPHA
||
3804 srcFormat
== GL_LUMINANCE
||
3805 srcFormat
== GL_LUMINANCE_ALPHA
||
3806 srcFormat
== GL_INTENSITY
||
3807 srcFormat
== GL_RG
||
3808 srcFormat
== GL_RGB
||
3809 srcFormat
== GL_BGR
||
3810 srcFormat
== GL_RGBA
||
3811 srcFormat
== GL_BGRA
||
3812 srcFormat
== GL_ABGR_EXT
||
3813 srcFormat
== GL_RED_INTEGER_EXT
||
3814 srcFormat
== GL_GREEN_INTEGER_EXT
||
3815 srcFormat
== GL_BLUE_INTEGER_EXT
||
3816 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3817 srcFormat
== GL_RG_INTEGER
||
3818 srcFormat
== GL_RGB_INTEGER_EXT
||
3819 srcFormat
== GL_RGBA_INTEGER_EXT
||
3820 srcFormat
== GL_BGR_INTEGER_EXT
||
3821 srcFormat
== GL_BGRA_INTEGER_EXT
||
3822 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3823 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3824 srcFormat
== GL_COLOR_INDEX
);
3826 ASSERT(srcType
== GL_BITMAP
||
3827 srcType
== GL_UNSIGNED_BYTE
||
3828 srcType
== GL_BYTE
||
3829 srcType
== GL_UNSIGNED_SHORT
||
3830 srcType
== GL_SHORT
||
3831 srcType
== GL_UNSIGNED_INT
||
3832 srcType
== GL_INT
||
3833 srcType
== GL_HALF_FLOAT_ARB
||
3834 srcType
== GL_FLOAT
||
3835 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3836 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3837 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3838 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3839 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3840 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3841 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3842 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3843 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3844 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3845 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3846 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3847 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3848 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3850 /* general solution, no special cases, yet */
3852 GLint dstComponents
;
3853 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3854 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3855 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3858 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3862 dstComponents
= _mesa_components_in_format( dstFormat
);
3863 /* source & dest image formats should have been error checked by now */
3864 assert(dstComponents
> 0);
3866 /* EXT_texture_integer specifies no transfer ops on integer
3867 * types in the resolved issues section. Just set them to 0
3868 * for integer surfaces.
3874 * Extract image data and convert to RGBA floats
3876 if (srcFormat
== GL_COLOR_INDEX
) {
3877 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3880 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3885 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3888 /* Convert indexes to RGBA */
3889 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3890 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3892 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3894 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3895 * with color indexes.
3897 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3902 /* non-color index data */
3903 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3904 srcPacking
->SwapBytes
);
3908 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3911 get_component_indexes(dstFormat
,
3912 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3914 /* Now pack results in the requested dstFormat */
3916 GLfloat
*dst
= dest
;
3918 for (i
= 0; i
< n
; i
++) {
3919 dst
[rDst
] = rgba
[i
][RCOMP
];
3920 dst
+= dstComponents
;
3925 GLfloat
*dst
= dest
;
3927 for (i
= 0; i
< n
; i
++) {
3928 dst
[gDst
] = rgba
[i
][GCOMP
];
3929 dst
+= dstComponents
;
3934 GLfloat
*dst
= dest
;
3936 for (i
= 0; i
< n
; i
++) {
3937 dst
[bDst
] = rgba
[i
][BCOMP
];
3938 dst
+= dstComponents
;
3943 GLfloat
*dst
= dest
;
3945 for (i
= 0; i
< n
; i
++) {
3946 dst
[aDst
] = rgba
[i
][ACOMP
];
3947 dst
+= dstComponents
;
3952 GLfloat
*dst
= dest
;
3955 assert(dstComponents
== 1);
3956 for (i
= 0; i
< n
; i
++) {
3957 /* Intensity comes from red channel */
3958 dst
[i
] = rgba
[i
][RCOMP
];
3963 GLfloat
*dst
= dest
;
3966 for (i
= 0; i
< n
; i
++) {
3967 /* Luminance comes from red channel */
3968 dst
[0] = rgba
[i
][RCOMP
];
3969 dst
+= dstComponents
;
3979 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3980 * instead of GLubyte.
3981 * No pixel transfer ops are applied.
3984 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3985 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3986 GLenum srcFormat
, GLenum srcType
,
3987 const GLvoid
*source
,
3988 const struct gl_pixelstore_attrib
*srcPacking
)
3990 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3993 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3997 ASSERT(dstFormat
== GL_ALPHA
||
3998 dstFormat
== GL_LUMINANCE
||
3999 dstFormat
== GL_LUMINANCE_ALPHA
||
4000 dstFormat
== GL_INTENSITY
||
4001 dstFormat
== GL_RED
||
4002 dstFormat
== GL_RG
||
4003 dstFormat
== GL_RGB
||
4004 dstFormat
== GL_RGBA
);
4006 ASSERT(srcFormat
== GL_RED
||
4007 srcFormat
== GL_GREEN
||
4008 srcFormat
== GL_BLUE
||
4009 srcFormat
== GL_ALPHA
||
4010 srcFormat
== GL_LUMINANCE
||
4011 srcFormat
== GL_LUMINANCE_ALPHA
||
4012 srcFormat
== GL_INTENSITY
||
4013 srcFormat
== GL_RG
||
4014 srcFormat
== GL_RGB
||
4015 srcFormat
== GL_BGR
||
4016 srcFormat
== GL_RGBA
||
4017 srcFormat
== GL_BGRA
||
4018 srcFormat
== GL_ABGR_EXT
||
4019 srcFormat
== GL_RED_INTEGER_EXT
||
4020 srcFormat
== GL_GREEN_INTEGER_EXT
||
4021 srcFormat
== GL_BLUE_INTEGER_EXT
||
4022 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4023 srcFormat
== GL_RG_INTEGER
||
4024 srcFormat
== GL_RGB_INTEGER_EXT
||
4025 srcFormat
== GL_RGBA_INTEGER_EXT
||
4026 srcFormat
== GL_BGR_INTEGER_EXT
||
4027 srcFormat
== GL_BGRA_INTEGER_EXT
||
4028 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4029 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4031 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4032 srcType
== GL_BYTE
||
4033 srcType
== GL_UNSIGNED_SHORT
||
4034 srcType
== GL_SHORT
||
4035 srcType
== GL_UNSIGNED_INT
||
4036 srcType
== GL_INT
||
4037 srcType
== GL_HALF_FLOAT_ARB
||
4038 srcType
== GL_FLOAT
||
4039 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4040 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4041 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4042 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4043 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4044 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4045 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4046 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4047 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4048 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4049 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4050 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4051 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4052 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4055 /* Extract image data as uint[4] pixels */
4056 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4057 srcPacking
->SwapBytes
);
4059 if (dstFormat
== GL_RGBA
) {
4061 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4065 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4066 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4068 assert(dstComponents
> 0);
4070 get_component_indexes(dstFormat
,
4071 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4073 /* Now pack values in the requested dest format */
4077 for (i
= 0; i
< n
; i
++) {
4078 dst
[rDst
] = rgba
[i
][RCOMP
];
4079 dst
+= dstComponents
;
4086 for (i
= 0; i
< n
; i
++) {
4087 dst
[gDst
] = rgba
[i
][GCOMP
];
4088 dst
+= dstComponents
;
4095 for (i
= 0; i
< n
; i
++) {
4096 dst
[bDst
] = rgba
[i
][BCOMP
];
4097 dst
+= dstComponents
;
4104 for (i
= 0; i
< n
; i
++) {
4105 dst
[aDst
] = rgba
[i
][ACOMP
];
4106 dst
+= dstComponents
;
4114 assert(dstComponents
== 1);
4115 for (i
= 0; i
< n
; i
++) {
4116 /* Intensity comes from red channel */
4117 dst
[i
] = rgba
[i
][RCOMP
];
4125 for (i
= 0; i
< n
; i
++) {
4126 /* Luminance comes from red channel */
4127 dst
[0] = rgba
[i
][RCOMP
];
4128 dst
+= dstComponents
;
4139 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4140 * directly return GLbyte data, no transfer ops apply.
4143 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4144 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4145 GLenum srcFormat
, GLenum srcType
,
4146 const GLvoid
*source
,
4147 const struct gl_pixelstore_attrib
*srcPacking
,
4148 GLbitfield transferOps
)
4150 ASSERT(dstFormat
== GL_DUDV_ATI
);
4151 ASSERT(srcFormat
== GL_DUDV_ATI
||
4152 srcFormat
== GL_DU8DV8_ATI
);
4154 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4155 srcType
== GL_BYTE
||
4156 srcType
== GL_UNSIGNED_SHORT
||
4157 srcType
== GL_SHORT
||
4158 srcType
== GL_UNSIGNED_INT
||
4159 srcType
== GL_INT
||
4160 srcType
== GL_HALF_FLOAT_ARB
||
4161 srcType
== GL_FLOAT
);
4163 /* general solution */
4165 GLint dstComponents
;
4168 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4171 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4175 dstComponents
= _mesa_components_in_format( dstFormat
);
4176 /* source & dest image formats should have been error checked by now */
4177 assert(dstComponents
> 0);
4180 * Extract image data and convert to RGBA floats
4182 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4183 srcPacking
->SwapBytes
);
4186 /* Now determine which color channels we need to produce.
4187 * And determine the dest index (offset) within each color tuple.
4190 /* Now pack results in the requested dstFormat */
4191 for (i
= 0; i
< n
; i
++) {
4192 /* not sure - need clamp[-1,1] here? */
4193 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4194 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4195 dst
+= dstComponents
;
4203 * Unpack a row of color index data from a client buffer according to
4204 * the pixel unpacking parameters.
4205 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4207 * Args: ctx - the context
4208 * n - number of pixels
4209 * dstType - destination data type
4210 * dest - destination array
4211 * srcType - source pixel type
4212 * source - source data pointer
4213 * srcPacking - pixel unpacking parameters
4214 * transferOps - the pixel transfer operations to apply
4217 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4218 GLenum dstType
, GLvoid
*dest
,
4219 GLenum srcType
, const GLvoid
*source
,
4220 const struct gl_pixelstore_attrib
*srcPacking
,
4221 GLbitfield transferOps
)
4223 ASSERT(srcType
== GL_BITMAP
||
4224 srcType
== GL_UNSIGNED_BYTE
||
4225 srcType
== GL_BYTE
||
4226 srcType
== GL_UNSIGNED_SHORT
||
4227 srcType
== GL_SHORT
||
4228 srcType
== GL_UNSIGNED_INT
||
4229 srcType
== GL_INT
||
4230 srcType
== GL_HALF_FLOAT_ARB
||
4231 srcType
== GL_FLOAT
);
4233 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4234 dstType
== GL_UNSIGNED_SHORT
||
4235 dstType
== GL_UNSIGNED_INT
);
4238 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4241 * Try simple cases first
4243 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4244 && dstType
== GL_UNSIGNED_BYTE
) {
4245 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4247 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4248 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4249 memcpy(dest
, source
, n
* sizeof(GLuint
));
4255 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4258 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4262 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4266 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4268 /* convert to dest type */
4270 case GL_UNSIGNED_BYTE
:
4272 GLubyte
*dst
= (GLubyte
*) dest
;
4274 for (i
= 0; i
< n
; i
++) {
4275 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4279 case GL_UNSIGNED_SHORT
:
4281 GLuint
*dst
= (GLuint
*) dest
;
4283 for (i
= 0; i
< n
; i
++) {
4284 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4288 case GL_UNSIGNED_INT
:
4289 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4292 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4301 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4302 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4303 const struct gl_pixelstore_attrib
*dstPacking
,
4304 GLbitfield transferOps
)
4306 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4309 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4313 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4315 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4316 /* make a copy of input */
4317 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4318 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4323 case GL_UNSIGNED_BYTE
:
4325 GLubyte
*dst
= (GLubyte
*) dest
;
4327 for (i
= 0; i
< n
; i
++) {
4328 *dst
++ = (GLubyte
) source
[i
];
4334 GLbyte
*dst
= (GLbyte
*) dest
;
4336 for (i
= 0; i
< n
; i
++) {
4337 dst
[i
] = (GLbyte
) source
[i
];
4341 case GL_UNSIGNED_SHORT
:
4343 GLushort
*dst
= (GLushort
*) dest
;
4345 for (i
= 0; i
< n
; i
++) {
4346 dst
[i
] = (GLushort
) source
[i
];
4348 if (dstPacking
->SwapBytes
) {
4349 _mesa_swap2( (GLushort
*) dst
, n
);
4355 GLshort
*dst
= (GLshort
*) dest
;
4357 for (i
= 0; i
< n
; i
++) {
4358 dst
[i
] = (GLshort
) source
[i
];
4360 if (dstPacking
->SwapBytes
) {
4361 _mesa_swap2( (GLushort
*) dst
, n
);
4365 case GL_UNSIGNED_INT
:
4367 GLuint
*dst
= (GLuint
*) dest
;
4369 for (i
= 0; i
< n
; i
++) {
4370 dst
[i
] = (GLuint
) source
[i
];
4372 if (dstPacking
->SwapBytes
) {
4373 _mesa_swap4( (GLuint
*) dst
, n
);
4379 GLint
*dst
= (GLint
*) dest
;
4381 for (i
= 0; i
< n
; i
++) {
4382 dst
[i
] = (GLint
) source
[i
];
4384 if (dstPacking
->SwapBytes
) {
4385 _mesa_swap4( (GLuint
*) dst
, n
);
4391 GLfloat
*dst
= (GLfloat
*) dest
;
4393 for (i
= 0; i
< n
; i
++) {
4394 dst
[i
] = (GLfloat
) source
[i
];
4396 if (dstPacking
->SwapBytes
) {
4397 _mesa_swap4( (GLuint
*) dst
, n
);
4401 case GL_HALF_FLOAT_ARB
:
4403 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4405 for (i
= 0; i
< n
; i
++) {
4406 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4408 if (dstPacking
->SwapBytes
) {
4409 _mesa_swap2( (GLushort
*) dst
, n
);
4414 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4422 * Unpack a row of stencil data from a client buffer according to
4423 * the pixel unpacking parameters.
4424 * This is (or will be) used by glDrawPixels
4426 * Args: ctx - the context
4427 * n - number of pixels
4428 * dstType - destination data type
4429 * dest - destination array
4430 * srcType - source pixel type
4431 * source - source data pointer
4432 * srcPacking - pixel unpacking parameters
4433 * transferOps - apply offset/bias/lookup ops?
4436 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4437 GLenum dstType
, GLvoid
*dest
,
4438 GLenum srcType
, const GLvoid
*source
,
4439 const struct gl_pixelstore_attrib
*srcPacking
,
4440 GLbitfield transferOps
)
4442 ASSERT(srcType
== GL_BITMAP
||
4443 srcType
== GL_UNSIGNED_BYTE
||
4444 srcType
== GL_BYTE
||
4445 srcType
== GL_UNSIGNED_SHORT
||
4446 srcType
== GL_SHORT
||
4447 srcType
== GL_UNSIGNED_INT
||
4448 srcType
== GL_INT
||
4449 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4450 srcType
== GL_HALF_FLOAT_ARB
||
4451 srcType
== GL_FLOAT
||
4452 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4454 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4455 dstType
== GL_UNSIGNED_SHORT
||
4456 dstType
== GL_UNSIGNED_INT
||
4457 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4459 /* only shift and offset apply to stencil */
4460 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4463 * Try simple cases first
4465 if (transferOps
== 0 &&
4466 !ctx
->Pixel
.MapStencilFlag
&&
4467 srcType
== GL_UNSIGNED_BYTE
&&
4468 dstType
== GL_UNSIGNED_BYTE
) {
4469 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4471 else if (transferOps
== 0 &&
4472 !ctx
->Pixel
.MapStencilFlag
&&
4473 srcType
== GL_UNSIGNED_INT
&&
4474 dstType
== GL_UNSIGNED_INT
&&
4475 !srcPacking
->SwapBytes
) {
4476 memcpy(dest
, source
, n
* sizeof(GLuint
));
4482 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4485 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4489 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4492 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4493 /* shift and offset indexes */
4494 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4497 if (ctx
->Pixel
.MapStencilFlag
) {
4498 /* Apply stencil lookup table */
4499 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4501 for (i
= 0; i
< n
; i
++) {
4502 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4506 /* convert to dest type */
4508 case GL_UNSIGNED_BYTE
:
4510 GLubyte
*dst
= (GLubyte
*) dest
;
4512 for (i
= 0; i
< n
; i
++) {
4513 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4517 case GL_UNSIGNED_SHORT
:
4519 GLuint
*dst
= (GLuint
*) dest
;
4521 for (i
= 0; i
< n
; i
++) {
4522 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4526 case GL_UNSIGNED_INT
:
4527 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4529 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4531 GLuint
*dst
= (GLuint
*) dest
;
4533 for (i
= 0; i
< n
; i
++) {
4534 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4539 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4548 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4549 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4550 const struct gl_pixelstore_attrib
*dstPacking
)
4552 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4555 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4559 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4560 ctx
->Pixel
.MapStencilFlag
) {
4561 /* make a copy of input */
4562 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4563 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4568 case GL_UNSIGNED_BYTE
:
4569 memcpy(dest
, source
, n
);
4573 GLbyte
*dst
= (GLbyte
*) dest
;
4576 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4580 case GL_UNSIGNED_SHORT
:
4582 GLushort
*dst
= (GLushort
*) dest
;
4585 dst
[i
] = (GLushort
) source
[i
];
4587 if (dstPacking
->SwapBytes
) {
4588 _mesa_swap2( (GLushort
*) dst
, n
);
4594 GLshort
*dst
= (GLshort
*) dest
;
4597 dst
[i
] = (GLshort
) source
[i
];
4599 if (dstPacking
->SwapBytes
) {
4600 _mesa_swap2( (GLushort
*) dst
, n
);
4604 case GL_UNSIGNED_INT
:
4606 GLuint
*dst
= (GLuint
*) dest
;
4609 dst
[i
] = (GLuint
) source
[i
];
4611 if (dstPacking
->SwapBytes
) {
4612 _mesa_swap4( (GLuint
*) dst
, n
);
4618 GLint
*dst
= (GLint
*) dest
;
4621 dst
[i
] = (GLint
) source
[i
];
4623 if (dstPacking
->SwapBytes
) {
4624 _mesa_swap4( (GLuint
*) dst
, n
);
4630 GLfloat
*dst
= (GLfloat
*) dest
;
4633 dst
[i
] = (GLfloat
) source
[i
];
4635 if (dstPacking
->SwapBytes
) {
4636 _mesa_swap4( (GLuint
*) dst
, n
);
4640 case GL_HALF_FLOAT_ARB
:
4642 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4645 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4647 if (dstPacking
->SwapBytes
) {
4648 _mesa_swap2( (GLushort
*) dst
, n
);
4653 if (dstPacking
->LsbFirst
) {
4654 GLubyte
*dst
= (GLubyte
*) dest
;
4657 for (i
= 0; i
< n
; i
++) {
4660 *dst
|= ((source
[i
] != 0) << shift
);
4669 GLubyte
*dst
= (GLubyte
*) dest
;
4672 for (i
= 0; i
< n
; i
++) {
4675 *dst
|= ((source
[i
] != 0) << shift
);
4685 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4691 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4694 const GLTYPE *src = (const GLTYPE *)source; \
4695 for (i = 0; i < n; i++) { \
4696 GLTYPE value = src[i]; \
4697 if (srcPacking->SwapBytes) { \
4698 if (sizeof(GLTYPE) == 2) { \
4700 } else if (sizeof(GLTYPE) == 4) { \
4704 depthValues[i] = GLTYPE2FLOAT(value); \
4710 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4711 * or GLfloat values.
4712 * The glPixelTransfer (scale/bias) params will be applied.
4714 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4715 * \param depthMax max value for returned GLushort or GLuint values
4716 * (ignored for GLfloat).
4719 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4720 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4721 GLenum srcType
, const GLvoid
*source
,
4722 const struct gl_pixelstore_attrib
*srcPacking
)
4724 GLfloat
*depthTemp
= NULL
, *depthValues
;
4725 GLboolean needClamp
= GL_FALSE
;
4727 /* Look for special cases first.
4728 * Not only are these faster, they're less prone to numeric conversion
4729 * problems. Otherwise, converting from an int type to a float then
4730 * back to an int type can introduce errors that will show up as
4731 * artifacts in things like depth peeling which uses glCopyTexImage.
4733 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4734 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4735 const GLuint
*src
= (const GLuint
*) source
;
4736 GLushort
*dst
= (GLushort
*) dest
;
4738 for (i
= 0; i
< n
; i
++) {
4739 dst
[i
] = src
[i
] >> 16;
4743 if (srcType
== GL_UNSIGNED_SHORT
4744 && dstType
== GL_UNSIGNED_INT
4745 && depthMax
== 0xffffffff) {
4746 const GLushort
*src
= (const GLushort
*) source
;
4747 GLuint
*dst
= (GLuint
*) dest
;
4749 for (i
= 0; i
< n
; i
++) {
4750 dst
[i
] = src
[i
] | (src
[i
] << 16);
4754 if (srcType
== GL_UNSIGNED_INT_24_8
4755 && dstType
== GL_UNSIGNED_INT
4756 && depthMax
== 0xffffff) {
4757 const GLuint
*src
= (const GLuint
*) source
;
4758 GLuint
*dst
= (GLuint
*) dest
;
4760 for (i
= 0; i
< n
; i
++) {
4761 dst
[i
] = src
[i
] >> 8;
4765 /* XXX may want to add additional cases here someday */
4768 /* general case path follows */
4770 if (dstType
== GL_FLOAT
) {
4771 depthValues
= (GLfloat
*) dest
;
4774 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4776 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4780 depthValues
= depthTemp
;
4783 /* Convert incoming values to GLfloat. Some conversions will require
4788 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4789 needClamp
= GL_TRUE
;
4791 case GL_UNSIGNED_BYTE
:
4792 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4795 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4796 needClamp
= GL_TRUE
;
4798 case GL_UNSIGNED_SHORT
:
4799 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4802 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4803 needClamp
= GL_TRUE
;
4805 case GL_UNSIGNED_INT
:
4806 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4808 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4809 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4810 depthMax
== 0xffffff &&
4811 ctx
->Pixel
.DepthScale
== 1.0 &&
4812 ctx
->Pixel
.DepthBias
== 0.0) {
4813 const GLuint
*src
= (const GLuint
*) source
;
4814 GLuint
*zValues
= (GLuint
*) dest
;
4816 for (i
= 0; i
< n
; i
++) {
4817 GLuint value
= src
[i
];
4818 if (srcPacking
->SwapBytes
) {
4821 zValues
[i
] = value
& 0xffffff00;
4827 const GLuint
*src
= (const GLuint
*) source
;
4828 const GLfloat scale
= 1.0f
/ 0xffffff;
4830 for (i
= 0; i
< n
; i
++) {
4831 GLuint value
= src
[i
];
4832 if (srcPacking
->SwapBytes
) {
4835 depthValues
[i
] = (value
>> 8) * scale
;
4839 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4842 const GLfloat
*src
= (const GLfloat
*)source
;
4843 for (i
= 0; i
< n
; i
++) {
4844 GLfloat value
= src
[i
* 2];
4845 if (srcPacking
->SwapBytes
) {
4848 depthValues
[i
] = value
;
4850 needClamp
= GL_TRUE
;
4854 DEPTH_VALUES(GLfloat
, 1*);
4855 needClamp
= GL_TRUE
;
4857 case GL_HALF_FLOAT_ARB
:
4860 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4861 for (i
= 0; i
< n
; i
++) {
4862 GLhalfARB value
= src
[i
];
4863 if (srcPacking
->SwapBytes
) {
4866 depthValues
[i
] = _mesa_half_to_float(value
);
4868 needClamp
= GL_TRUE
;
4872 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4877 /* apply depth scale and bias */
4879 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4880 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4881 if (scale
!= 1.0 || bias
!= 0.0) {
4883 for (i
= 0; i
< n
; i
++) {
4884 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4886 needClamp
= GL_TRUE
;
4890 /* clamp to [0, 1] */
4893 for (i
= 0; i
< n
; i
++) {
4894 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4899 * Convert values to dstType
4901 if (dstType
== GL_UNSIGNED_INT
) {
4902 GLuint
*zValues
= (GLuint
*) dest
;
4904 if (depthMax
<= 0xffffff) {
4905 /* no overflow worries */
4906 for (i
= 0; i
< n
; i
++) {
4907 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4911 /* need to use double precision to prevent overflow problems */
4912 for (i
= 0; i
< n
; i
++) {
4913 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4914 if (z
>= (GLdouble
) 0xffffffff)
4915 zValues
[i
] = 0xffffffff;
4917 zValues
[i
] = (GLuint
) z
;
4921 else if (dstType
== GL_UNSIGNED_SHORT
) {
4922 GLushort
*zValues
= (GLushort
*) dest
;
4924 ASSERT(depthMax
<= 0xffff);
4925 for (i
= 0; i
< n
; i
++) {
4926 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4929 else if (dstType
== GL_FLOAT
) {
4930 /* Nothing to do. depthValues is pointing to dest. */
4932 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4933 GLfloat
*zValues
= (GLfloat
*) dest
;
4935 for (i
= 0; i
< n
; i
++) {
4936 zValues
[i
*2] = depthValues
[i
];
4948 * Pack an array of depth values. The values are floats in [0,1].
4951 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4952 GLenum dstType
, const GLfloat
*depthSpan
,
4953 const struct gl_pixelstore_attrib
*dstPacking
)
4955 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4957 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4961 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4962 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4963 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4964 depthSpan
= depthCopy
;
4968 case GL_UNSIGNED_BYTE
:
4970 GLubyte
*dst
= (GLubyte
*) dest
;
4972 for (i
= 0; i
< n
; i
++) {
4973 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4979 GLbyte
*dst
= (GLbyte
*) dest
;
4981 for (i
= 0; i
< n
; i
++) {
4982 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4986 case GL_UNSIGNED_SHORT
:
4988 GLushort
*dst
= (GLushort
*) dest
;
4990 for (i
= 0; i
< n
; i
++) {
4991 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4993 if (dstPacking
->SwapBytes
) {
4994 _mesa_swap2( (GLushort
*) dst
, n
);
5000 GLshort
*dst
= (GLshort
*) dest
;
5002 for (i
= 0; i
< n
; i
++) {
5003 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5005 if (dstPacking
->SwapBytes
) {
5006 _mesa_swap2( (GLushort
*) dst
, n
);
5010 case GL_UNSIGNED_INT
:
5012 GLuint
*dst
= (GLuint
*) dest
;
5014 for (i
= 0; i
< n
; i
++) {
5015 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5017 if (dstPacking
->SwapBytes
) {
5018 _mesa_swap4( (GLuint
*) dst
, n
);
5024 GLint
*dst
= (GLint
*) dest
;
5026 for (i
= 0; i
< n
; i
++) {
5027 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5029 if (dstPacking
->SwapBytes
) {
5030 _mesa_swap4( (GLuint
*) dst
, n
);
5036 GLfloat
*dst
= (GLfloat
*) dest
;
5038 for (i
= 0; i
< n
; i
++) {
5039 dst
[i
] = depthSpan
[i
];
5041 if (dstPacking
->SwapBytes
) {
5042 _mesa_swap4( (GLuint
*) dst
, n
);
5046 case GL_HALF_FLOAT_ARB
:
5048 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5050 for (i
= 0; i
< n
; i
++) {
5051 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5053 if (dstPacking
->SwapBytes
) {
5054 _mesa_swap2( (GLushort
*) dst
, n
);
5059 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5068 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5071 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5072 GLenum dstType
, GLuint
*dest
,
5073 const GLfloat
*depthVals
,
5074 const GLubyte
*stencilVals
,
5075 const struct gl_pixelstore_attrib
*dstPacking
)
5077 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5078 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5081 if (!depthCopy
|| !stencilCopy
) {
5082 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5088 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5089 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5090 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5091 depthVals
= depthCopy
;
5094 if (ctx
->Pixel
.IndexShift
||
5095 ctx
->Pixel
.IndexOffset
||
5096 ctx
->Pixel
.MapStencilFlag
) {
5097 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5098 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5099 stencilVals
= stencilCopy
;
5103 case GL_UNSIGNED_INT_24_8
:
5104 for (i
= 0; i
< n
; i
++) {
5105 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5106 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5109 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5110 for (i
= 0; i
< n
; i
++) {
5111 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5112 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5117 if (dstPacking
->SwapBytes
) {
5118 _mesa_swap4(dest
, n
);
5129 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5130 * Return all image data in a contiguous block. This is used when we
5131 * compile glDrawPixels, glTexImage, etc into a display list. We
5132 * need a copy of the data in a standard format.
5135 _mesa_unpack_image( GLuint dimensions
,
5136 GLsizei width
, GLsizei height
, GLsizei depth
,
5137 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5138 const struct gl_pixelstore_attrib
*unpack
)
5140 GLint bytesPerRow
, compsPerRow
;
5141 GLboolean flipBytes
, swap2
, swap4
;
5144 return NULL
; /* not necessarily an error */
5146 if (width
<= 0 || height
<= 0 || depth
<= 0)
5147 return NULL
; /* generate error later */
5149 if (type
== GL_BITMAP
) {
5150 bytesPerRow
= (width
+ 7) >> 3;
5151 flipBytes
= unpack
->LsbFirst
;
5152 swap2
= swap4
= GL_FALSE
;
5156 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5157 GLint components
= _mesa_components_in_format(format
);
5160 if (_mesa_type_is_packed(type
))
5163 if (bytesPerPixel
<= 0 || components
<= 0)
5164 return NULL
; /* bad format or type. generate error later */
5165 bytesPerRow
= bytesPerPixel
* width
;
5166 bytesPerComp
= bytesPerPixel
/ components
;
5167 flipBytes
= GL_FALSE
;
5168 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5169 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5170 compsPerRow
= components
* width
;
5171 assert(compsPerRow
>= width
);
5176 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5180 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5183 for (img
= 0; img
< depth
; img
++) {
5184 for (row
= 0; row
< height
; row
++) {
5185 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5186 width
, height
, format
, type
, img
, row
, 0);
5188 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5190 flipBytes
= GL_FALSE
;
5191 if (unpack
->LsbFirst
) {
5192 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5193 GLubyte dstMask
= 128;
5194 const GLubyte
*s
= src
;
5197 for (i
= 0; i
< width
; i
++) {
5201 if (srcMask
== 128) {
5206 srcMask
= srcMask
<< 1;
5214 dstMask
= dstMask
>> 1;
5219 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5220 GLubyte dstMask
= 128;
5221 const GLubyte
*s
= src
;
5224 for (i
= 0; i
< width
; i
++) {
5233 srcMask
= srcMask
>> 1;
5241 dstMask
= dstMask
>> 1;
5247 memcpy(dst
, src
, bytesPerRow
);
5250 /* byte flipping/swapping */
5252 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5255 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5258 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5270 * If we unpack colors from a luminance surface, we'll get pixel colors
5271 * such as (l, l, l, a).
5272 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5273 * function will compute L=R+G+B before packing. The net effect is we'll
5274 * accidentally store luminance values = 3*l.
5275 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5277 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5280 * Finally, we also need to do this when the actual surface format does
5281 * not match the logical surface format. For example, suppose the user
5282 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5283 * Again, we'll get pixel values like (l,l,l,a).
5286 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5290 switch (baseFormat
) {
5292 for (i
= 0; i
< n
; i
++) {
5293 rgba
[i
][RCOMP
] = 0.0F
;
5294 rgba
[i
][GCOMP
] = 0.0F
;
5295 rgba
[i
][BCOMP
] = 0.0F
;
5301 for (i
= 0; i
< n
; i
++) {
5302 rgba
[i
][GCOMP
] = 0.0F
;
5303 rgba
[i
][BCOMP
] = 0.0F
;
5304 rgba
[i
][ACOMP
] = 1.0F
;
5307 case GL_LUMINANCE_ALPHA
:
5308 for (i
= 0; i
< n
; i
++) {
5309 rgba
[i
][GCOMP
] = 0.0F
;
5310 rgba
[i
][BCOMP
] = 0.0F
;
5321 * As above, but GLuint components.
5324 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5328 switch (baseFormat
) {
5330 for (i
= 0; i
< n
; i
++) {
5339 for (i
= 0; i
< n
; i
++) {
5345 case GL_LUMINANCE_ALPHA
:
5346 for (i
= 0; i
< n
; i
++) {