2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
33 * XXX: MSVC takes forever to compile this module for x86_64 unless we disable
34 * this global optimization.
37 * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
38 * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
40 #if defined(_MSC_VER) && defined(_M_X64)
41 # pragma optimize( "g", off )
53 #include "pixeltransfer.h"
55 #include "glformats.h"
56 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
57 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
61 * Flip the 8 bits in each byte of the given array.
64 * \param n number of bytes.
66 * \todo try this trick to flip bytes someday:
68 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
69 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
70 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
74 flip_bytes( GLubyte
*p
, GLuint n
)
77 for (i
= 0; i
< n
; i
++) {
78 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
79 a
= ((b
& 0x01) << 7) |
94 * Unpack a 32x32 pixel polygon stipple from user memory using the
95 * current pixel unpack settings.
98 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
99 const struct gl_pixelstore_attrib
*unpacking
)
101 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
103 /* Convert pattern from GLubytes to GLuints and handle big/little
108 for (i
= 0; i
< 32; i
++) {
109 dest
[i
] = (p
[0] << 24)
121 * Pack polygon stipple into user memory given current pixel packing
125 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
126 const struct gl_pixelstore_attrib
*packing
)
128 /* Convert pattern from GLuints to GLubytes to handle big/little
129 * endian differences.
133 for (i
= 0; i
< 32; i
++) {
134 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
135 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
136 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
137 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
140 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
145 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
146 * order with row alignment = 1 byte.
149 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
150 const struct gl_pixelstore_attrib
*packing
)
152 GLint bytes
, row
, width_in_bytes
;
153 GLubyte
*buffer
, *dst
;
158 /* Alloc dest storage */
159 bytes
= ((width
+ 7) / 8 * height
);
160 buffer
= (GLubyte
*) malloc( bytes
);
164 width_in_bytes
= CEILING( width
, 8 );
166 for (row
= 0; row
< height
; row
++) {
167 const GLubyte
*src
= (const GLubyte
*)
168 _mesa_image_address2d(packing
, pixels
, width
, height
,
169 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
175 if ((packing
->SkipPixels
& 7) == 0) {
176 memcpy( dst
, src
, width_in_bytes
);
177 if (packing
->LsbFirst
) {
178 flip_bytes( dst
, width_in_bytes
);
182 /* handling SkipPixels is a bit tricky (no pun intended!) */
184 if (packing
->LsbFirst
) {
185 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
186 GLubyte dstMask
= 128;
187 const GLubyte
*s
= src
;
190 for (i
= 0; i
< width
; i
++) {
194 if (srcMask
== 128) {
199 srcMask
= srcMask
<< 1;
207 dstMask
= dstMask
>> 1;
212 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
213 GLubyte dstMask
= 128;
214 const GLubyte
*s
= src
;
217 for (i
= 0; i
< width
; i
++) {
226 srcMask
= srcMask
>> 1;
234 dstMask
= dstMask
>> 1;
239 dst
+= width_in_bytes
;
250 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
251 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
253 GLint row
, width_in_bytes
;
259 width_in_bytes
= CEILING( width
, 8 );
261 for (row
= 0; row
< height
; row
++) {
262 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
263 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
267 if ((packing
->SkipPixels
& 7) == 0) {
268 memcpy( dst
, src
, width_in_bytes
);
269 if (packing
->LsbFirst
) {
270 flip_bytes( dst
, width_in_bytes
);
274 /* handling SkipPixels is a bit tricky (no pun intended!) */
276 if (packing
->LsbFirst
) {
277 GLubyte srcMask
= 128;
278 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
279 const GLubyte
*s
= src
;
282 for (i
= 0; i
< width
; i
++) {
291 srcMask
= srcMask
>> 1;
293 if (dstMask
== 128) {
299 dstMask
= dstMask
<< 1;
304 GLubyte srcMask
= 128;
305 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
306 const GLubyte
*s
= src
;
309 for (i
= 0; i
< width
; i
++) {
318 srcMask
= srcMask
>> 1;
326 dstMask
= dstMask
>> 1;
331 src
+= width_in_bytes
;
337 * Get indexes of color components for a basic color format, such as
338 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
342 get_component_indexes(GLenum format
,
347 GLint
*luminanceIndex
,
348 GLint
*intensityIndex
)
354 *luminanceIndex
= -1;
355 *intensityIndex
= -1;
359 case GL_LUMINANCE_INTEGER_EXT
:
362 case GL_LUMINANCE_ALPHA
:
363 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
371 case GL_RED_INTEGER_EXT
:
375 case GL_GREEN_INTEGER_EXT
:
379 case GL_BLUE_INTEGER_EXT
:
383 case GL_ALPHA_INTEGER_EXT
:
392 case GL_RGB_INTEGER_EXT
:
398 case GL_BGR_INTEGER_EXT
:
404 case GL_RGBA_INTEGER_EXT
:
411 case GL_BGRA_INTEGER
:
429 assert(0 && "bad format in get_component_indexes()");
436 * For small integer types, return the min and max possible values.
437 * Used for clamping floats to unscaled integer types.
438 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
441 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
448 case GL_UNSIGNED_BYTE
:
456 case GL_UNSIGNED_SHORT
:
465 /* Customization of unsigned integer packing.
467 #define SRC_TYPE GLuint
469 #define DST_TYPE GLuint
470 #define SRC_CONVERT(x) (x)
471 #define FN_NAME pack_uint_from_uint_rgba
472 #include "pack_tmp.h"
477 #define DST_TYPE GLint
478 #define SRC_CONVERT(x) MIN2(x, 0x7fffffff)
479 #define FN_NAME pack_int_from_uint_rgba
480 #include "pack_tmp.h"
485 #define DST_TYPE GLushort
486 #define SRC_CONVERT(x) MIN2(x, 0xffff)
487 #define FN_NAME pack_ushort_from_uint_rgba
488 #include "pack_tmp.h"
493 #define DST_TYPE GLshort
494 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
495 #define FN_NAME pack_short_from_uint_rgba
496 #include "pack_tmp.h"
501 #define DST_TYPE GLubyte
502 #define SRC_CONVERT(x) MIN2(x, 0xff)
503 #define FN_NAME pack_ubyte_from_uint_rgba
504 #include "pack_tmp.h"
509 #define DST_TYPE GLbyte
510 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
511 #define FN_NAME pack_byte_from_uint_rgba
512 #include "pack_tmp.h"
520 _mesa_pack_rgba_span_from_uints(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
521 GLenum dstFormat
, GLenum dstType
,
525 case GL_UNSIGNED_INT
:
526 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
529 pack_int_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
531 case GL_UNSIGNED_SHORT
:
532 pack_ushort_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
535 pack_short_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
537 case GL_UNSIGNED_BYTE
:
538 pack_ubyte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
541 pack_byte_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
546 "Unsupported type (%s) for format (%s)",
547 _mesa_lookup_enum_by_nr(dstType
),
548 _mesa_lookup_enum_by_nr(dstFormat
));
554 /* Customization of signed integer packing.
556 #define SRC_TYPE GLint
558 #define DST_TYPE GLuint
559 #define SRC_CONVERT(x) MAX2(x, 0)
560 #define FN_NAME pack_uint_from_int_rgba
561 #include "pack_tmp.h"
566 #define DST_TYPE GLushort
567 #define SRC_CONVERT(x) MAX2(x, 0)
568 #define FN_NAME pack_ushort_from_int_rgba
569 #include "pack_tmp.h"
574 #define DST_TYPE GLshort
575 #define SRC_CONVERT(x) CLAMP(x, -0x8000, 0x7fff)
576 #define FN_NAME pack_short_from_int_rgba
577 #include "pack_tmp.h"
582 #define DST_TYPE GLubyte
583 #define SRC_CONVERT(x) MAX2(x, 0)
584 #define FN_NAME pack_ubyte_from_int_rgba
585 #include "pack_tmp.h"
590 #define DST_TYPE GLbyte
591 #define SRC_CONVERT(x) CLAMP(x, -0x80, 0x7f)
592 #define FN_NAME pack_byte_from_int_rgba
593 #include "pack_tmp.h"
601 _mesa_pack_rgba_span_from_ints(struct gl_context
*ctx
, GLuint n
, GLint rgba
[][4],
602 GLenum dstFormat
, GLenum dstType
,
607 case GL_UNSIGNED_INT
:
608 pack_uint_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
611 /* No conversion necessary. */
612 pack_uint_from_uint_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
614 case GL_UNSIGNED_SHORT
:
615 pack_ushort_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
618 pack_short_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
620 case GL_UNSIGNED_BYTE
:
621 pack_ubyte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
624 pack_byte_from_int_rgba(ctx
, dstAddr
, dstFormat
, rgba
, n
);
629 "Unsupported type (%s) for format (%s)",
630 _mesa_lookup_enum_by_nr(dstType
),
631 _mesa_lookup_enum_by_nr(dstFormat
));
638 * Used to pack an array [][4] of RGBA float colors as specified
639 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
640 * Historically, the RGBA values were in [0,1] and rescaled to fit
641 * into GLubytes, etc. But with new integer formats, the RGBA values
642 * may have any value and we don't always rescale when converting to
645 * Note: the rgba values will be modified by this function when any pixel
646 * transfer ops are enabled.
649 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
650 GLenum dstFormat
, GLenum dstType
,
652 const struct gl_pixelstore_attrib
*dstPacking
,
653 GLbitfield transferOps
)
656 const GLint comps
= _mesa_components_in_format(dstFormat
);
657 const GLboolean intDstFormat
= _mesa_is_enum_format_integer(dstFormat
);
660 if (dstFormat
== GL_LUMINANCE
||
661 dstFormat
== GL_LUMINANCE_ALPHA
||
662 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
663 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
664 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
666 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
674 /* EXT_texture_integer specifies no transfer ops on integer
675 * types in the resolved issues section. Just set them to 0
676 * for integer surfaces.
682 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
686 * Component clamping (besides clamping to [0,1] in
687 * _mesa_apply_rgba_transfer_ops()).
690 /* clamping to dest type's min/max values */
692 if (get_type_min_max(dstType
, &min
, &max
)) {
693 for (i
= 0; i
< n
; i
++) {
694 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
695 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
696 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
697 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
701 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
702 /* compute luminance values */
703 if (transferOps
& IMAGE_CLAMP_BIT
) {
704 for (i
= 0; i
< n
; i
++) {
705 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
706 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
710 for (i
= 0; i
< n
; i
++) {
711 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
717 * Pack/store the pixels. Ugh! Lots of cases!!!
720 case GL_UNSIGNED_BYTE
:
722 GLubyte
*dst
= (GLubyte
*) dstAddr
;
726 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
730 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
734 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
738 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
742 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
744 case GL_LUMINANCE_ALPHA
:
746 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
747 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
752 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
753 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
758 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
759 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
760 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
765 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
766 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
767 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
768 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
773 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
774 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
775 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
780 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
781 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
782 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
783 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
788 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
789 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
790 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
791 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
794 case GL_RED_INTEGER_EXT
:
796 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
799 case GL_GREEN_INTEGER_EXT
:
801 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
804 case GL_BLUE_INTEGER_EXT
:
806 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
809 case GL_ALPHA_INTEGER_EXT
:
811 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
816 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
817 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
820 case GL_RGB_INTEGER_EXT
:
822 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
823 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
824 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
827 case GL_RGBA_INTEGER_EXT
:
829 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
830 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
831 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
832 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
835 case GL_BGR_INTEGER_EXT
:
837 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
838 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
839 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
842 case GL_BGRA_INTEGER_EXT
:
844 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
845 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
846 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
847 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
850 case GL_LUMINANCE_INTEGER_EXT
:
852 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
855 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
858 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
860 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
868 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
869 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
873 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
879 GLbyte
*dst
= (GLbyte
*) dstAddr
;
883 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
887 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
891 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
895 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
899 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
901 case GL_LUMINANCE_ALPHA
:
903 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
904 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
909 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
910 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
915 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
916 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
917 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
922 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
923 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
924 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
925 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
930 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
931 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
932 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
937 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
938 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
939 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
940 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
945 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
946 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
947 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
948 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
951 case GL_RED_INTEGER_EXT
:
953 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
956 case GL_GREEN_INTEGER_EXT
:
958 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
961 case GL_BLUE_INTEGER_EXT
:
963 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
966 case GL_ALPHA_INTEGER_EXT
:
968 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
973 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
974 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
977 case GL_RGB_INTEGER_EXT
:
979 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
980 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
981 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
984 case GL_RGBA_INTEGER_EXT
:
986 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
987 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
988 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
989 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
992 case GL_BGR_INTEGER_EXT
:
994 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
995 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
996 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
999 case GL_BGRA_INTEGER_EXT
:
1001 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
1002 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
1003 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
1004 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
1007 case GL_LUMINANCE_INTEGER_EXT
:
1009 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
1012 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
1015 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1017 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
1025 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
1026 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
1030 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1034 case GL_UNSIGNED_SHORT
:
1036 GLushort
*dst
= (GLushort
*) dstAddr
;
1037 switch (dstFormat
) {
1040 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
1044 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
1048 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
1052 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
1056 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
1058 case GL_LUMINANCE_ALPHA
:
1060 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
1061 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
1066 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
1067 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
1072 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
1073 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1074 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
1079 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
1080 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1081 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
1082 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1087 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
1088 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
1089 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
1094 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
1095 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
1096 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
1097 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
1102 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
1103 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
1104 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
1105 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
1108 case GL_RED_INTEGER_EXT
:
1110 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1113 case GL_GREEN_INTEGER_EXT
:
1115 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1118 case GL_BLUE_INTEGER_EXT
:
1120 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1123 case GL_ALPHA_INTEGER_EXT
:
1125 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1130 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1131 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1134 case GL_RGB_INTEGER_EXT
:
1136 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1137 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1138 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1141 case GL_RGBA_INTEGER_EXT
:
1143 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1144 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1145 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1146 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1149 case GL_BGR_INTEGER_EXT
:
1151 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1152 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1153 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1156 case GL_BGRA_INTEGER_EXT
:
1158 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1159 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1160 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1161 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1164 case GL_LUMINANCE_INTEGER_EXT
:
1166 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1169 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1172 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1174 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1182 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1183 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1187 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1193 GLshort
*dst
= (GLshort
*) dstAddr
;
1194 switch (dstFormat
) {
1197 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1201 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1205 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1209 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1213 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1215 case GL_LUMINANCE_ALPHA
:
1217 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1218 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1223 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1224 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1229 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1230 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1231 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1236 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1237 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1238 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1239 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1244 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1245 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1246 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1251 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1252 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1253 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1254 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1259 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1260 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1261 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1262 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1265 case GL_RED_INTEGER_EXT
:
1267 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1270 case GL_GREEN_INTEGER_EXT
:
1272 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1275 case GL_BLUE_INTEGER_EXT
:
1277 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1280 case GL_ALPHA_INTEGER_EXT
:
1282 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1287 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1288 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1291 case GL_RGB_INTEGER_EXT
:
1293 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1294 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1295 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1298 case GL_RGBA_INTEGER_EXT
:
1300 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1301 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1302 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1303 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1306 case GL_BGR_INTEGER_EXT
:
1308 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1309 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1310 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1313 case GL_BGRA_INTEGER_EXT
:
1315 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1316 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1317 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1318 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1321 case GL_LUMINANCE_INTEGER_EXT
:
1323 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1326 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1329 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1331 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1339 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1340 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1344 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1348 case GL_UNSIGNED_INT
:
1350 GLuint
*dst
= (GLuint
*) dstAddr
;
1351 switch (dstFormat
) {
1354 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1358 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1362 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1366 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1370 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1372 case GL_LUMINANCE_ALPHA
:
1374 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1375 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1380 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1381 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1386 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1387 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1388 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1393 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1394 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1395 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1396 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1401 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1402 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1403 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1408 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1409 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1410 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1411 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1416 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1417 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1418 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1419 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1422 case GL_RED_INTEGER_EXT
:
1424 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1427 case GL_GREEN_INTEGER_EXT
:
1429 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1432 case GL_BLUE_INTEGER_EXT
:
1434 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1437 case GL_ALPHA_INTEGER_EXT
:
1439 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1444 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1445 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1448 case GL_RGB_INTEGER_EXT
:
1450 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1451 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1452 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1455 case GL_RGBA_INTEGER_EXT
:
1457 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1458 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1459 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1460 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1463 case GL_BGR_INTEGER_EXT
:
1465 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1466 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1467 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1470 case GL_BGRA_INTEGER_EXT
:
1472 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1473 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1474 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1475 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1478 case GL_LUMINANCE_INTEGER_EXT
:
1480 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1483 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1486 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1488 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1496 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1497 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1501 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1507 GLint
*dst
= (GLint
*) dstAddr
;
1508 switch (dstFormat
) {
1511 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1515 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1519 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1523 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1527 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1529 case GL_LUMINANCE_ALPHA
:
1531 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1532 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1537 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1538 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1543 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1544 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1545 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1550 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1551 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1552 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1553 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1558 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1559 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1560 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1565 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1566 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1567 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1568 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1573 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1574 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1575 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1576 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1582 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1583 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1586 case GL_RED_INTEGER_EXT
:
1588 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1591 case GL_GREEN_INTEGER_EXT
:
1593 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1596 case GL_BLUE_INTEGER_EXT
:
1598 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1601 case GL_ALPHA_INTEGER_EXT
:
1603 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1608 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1609 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1612 case GL_RGB_INTEGER_EXT
:
1614 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1615 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1616 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1619 case GL_RGBA_INTEGER_EXT
:
1621 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1622 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1623 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1624 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1627 case GL_BGR_INTEGER_EXT
:
1629 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1630 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1631 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1634 case GL_BGRA_INTEGER_EXT
:
1636 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1637 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1638 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1639 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1642 case GL_LUMINANCE_INTEGER_EXT
:
1644 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1647 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1650 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1652 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1658 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1664 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1665 switch (dstFormat
) {
1668 dst
[i
] = rgba
[i
][RCOMP
];
1672 dst
[i
] = rgba
[i
][GCOMP
];
1676 dst
[i
] = rgba
[i
][BCOMP
];
1680 dst
[i
] = rgba
[i
][ACOMP
];
1684 dst
[i
] = luminance
[i
];
1686 case GL_LUMINANCE_ALPHA
:
1688 dst
[i
*2+0] = luminance
[i
];
1689 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1694 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1695 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1700 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1701 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1702 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1707 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1708 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1709 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1710 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1715 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1716 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1717 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1722 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1723 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1724 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1725 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1730 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1731 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1732 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1733 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1739 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1740 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1744 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1748 case GL_HALF_FLOAT_ARB
:
1750 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1751 switch (dstFormat
) {
1754 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1758 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1762 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1766 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1770 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1772 case GL_LUMINANCE_ALPHA
:
1774 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1775 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1780 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1781 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1786 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1787 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1788 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1793 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1794 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1795 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1796 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1801 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1802 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1803 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1808 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1809 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1810 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1811 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1816 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1817 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1818 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1819 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1825 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1826 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1830 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1834 case GL_UNSIGNED_BYTE_3_3_2
:
1835 if (dstFormat
== GL_RGB
) {
1836 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1838 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1839 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1840 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) );
1844 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1845 if (dstFormat
== GL_RGB
) {
1846 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1848 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 7.0F
) )
1849 | (F_TO_I(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1850 | (F_TO_I(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1854 case GL_UNSIGNED_SHORT_5_6_5
:
1855 if (dstFormat
== GL_RGB
) {
1856 GLushort
*dst
= (GLushort
*) dstAddr
;
1858 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1859 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1860 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) );
1864 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1865 if (dstFormat
== GL_RGB
) {
1866 GLushort
*dst
= (GLushort
*) dstAddr
;
1868 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1869 | (F_TO_I(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1870 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1874 case GL_UNSIGNED_SHORT_4_4_4_4
:
1875 if (dstFormat
== GL_RGBA
) {
1876 GLushort
*dst
= (GLushort
*) dstAddr
;
1878 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1879 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1880 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1881 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1884 else if (dstFormat
== GL_BGRA
) {
1885 GLushort
*dst
= (GLushort
*) dstAddr
;
1887 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1888 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1889 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1890 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) );
1893 else if (dstFormat
== GL_ABGR_EXT
) {
1894 GLushort
*dst
= (GLushort
*) dstAddr
;
1896 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1897 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1898 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1899 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) );
1903 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1904 if (dstFormat
== GL_RGBA
) {
1905 GLushort
*dst
= (GLushort
*) dstAddr
;
1907 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) )
1908 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1909 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1910 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1913 else if (dstFormat
== GL_BGRA
) {
1914 GLushort
*dst
= (GLushort
*) dstAddr
;
1916 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) )
1917 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1918 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1919 | (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1922 else if (dstFormat
== GL_ABGR_EXT
) {
1923 GLushort
*dst
= (GLushort
*) dstAddr
;
1925 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 15.0F
) )
1926 | (F_TO_I(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1927 | (F_TO_I(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1928 | (F_TO_I(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1932 case GL_UNSIGNED_SHORT_5_5_5_1
:
1933 if (dstFormat
== GL_RGBA
) {
1934 GLushort
*dst
= (GLushort
*) dstAddr
;
1936 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1937 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1938 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1939 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1942 else if (dstFormat
== GL_BGRA
) {
1943 GLushort
*dst
= (GLushort
*) dstAddr
;
1945 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1946 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1947 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1948 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) );
1951 else if (dstFormat
== GL_ABGR_EXT
) {
1952 GLushort
*dst
= (GLushort
*) dstAddr
;
1954 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1955 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1956 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1957 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) );
1961 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1962 if (dstFormat
== GL_RGBA
) {
1963 GLushort
*dst
= (GLushort
*) dstAddr
;
1965 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) )
1966 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1967 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1968 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1971 else if (dstFormat
== GL_BGRA
) {
1972 GLushort
*dst
= (GLushort
*) dstAddr
;
1974 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) )
1975 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1976 | (F_TO_I(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1977 | (F_TO_I(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1980 else if (dstFormat
== GL_ABGR_EXT
) {
1981 GLushort
*dst
= (GLushort
*) dstAddr
;
1983 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 31.0F
) )
1984 | (F_TO_I(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1985 | (F_TO_I(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1986 | (F_TO_I(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1990 case GL_UNSIGNED_INT_8_8_8_8
:
1991 if (dstFormat
== GL_RGBA
) {
1992 GLuint
*dst
= (GLuint
*) dstAddr
;
1994 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 24)
1995 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
1996 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 8)
1997 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2000 else if (dstFormat
== GL_BGRA
) {
2001 GLuint
*dst
= (GLuint
*) dstAddr
;
2003 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 24)
2004 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 16)
2005 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) << 8)
2006 | (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) );
2009 else if (dstFormat
== GL_ABGR_EXT
) {
2010 GLuint
*dst
= (GLuint
*) dstAddr
;
2012 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.F
) << 24)
2013 | (F_TO_I(rgba
[i
][BCOMP
] * 255.F
) << 16)
2014 | (F_TO_I(rgba
[i
][GCOMP
] * 255.F
) << 8)
2015 | (F_TO_I(rgba
[i
][RCOMP
] * 255.F
) );
2019 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2020 if (dstFormat
== GL_RGBA
) {
2021 GLuint
*dst
= (GLuint
*) dstAddr
;
2023 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) )
2024 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2025 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 16)
2026 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2029 else if (dstFormat
== GL_BGRA
) {
2030 GLuint
*dst
= (GLuint
*) dstAddr
;
2032 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) )
2033 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 8)
2034 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 16)
2035 | (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) << 24);
2038 else if (dstFormat
== GL_ABGR_EXT
) {
2039 GLuint
*dst
= (GLuint
*) dstAddr
;
2041 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 255.0F
) )
2042 | (F_TO_I(rgba
[i
][BCOMP
] * 255.0F
) << 8)
2043 | (F_TO_I(rgba
[i
][GCOMP
] * 255.0F
) << 16)
2044 | (F_TO_I(rgba
[i
][RCOMP
] * 255.0F
) << 24);
2048 case GL_UNSIGNED_INT_10_10_10_2
:
2049 if (dstFormat
== GL_RGBA
) {
2050 GLuint
*dst
= (GLuint
*) dstAddr
;
2052 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
2053 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2054 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
2055 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2058 else if (dstFormat
== GL_BGRA
) {
2059 GLuint
*dst
= (GLuint
*) dstAddr
;
2061 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
2062 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
2063 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
2064 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) );
2067 else if (dstFormat
== GL_ABGR_EXT
) {
2068 GLuint
*dst
= (GLuint
*) dstAddr
;
2070 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
2071 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
2072 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
2073 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) );
2077 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2078 if (dstFormat
== GL_RGBA
) {
2079 GLuint
*dst
= (GLuint
*) dstAddr
;
2081 dst
[i
] = (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) )
2082 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2083 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
2084 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2087 else if (dstFormat
== GL_BGRA
) {
2088 GLuint
*dst
= (GLuint
*) dstAddr
;
2090 dst
[i
] = (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) )
2091 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
2092 | (F_TO_I(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
2093 | (F_TO_I(rgba
[i
][ACOMP
] * 3.0F
) << 30);
2096 else if (dstFormat
== GL_ABGR_EXT
) {
2097 GLuint
*dst
= (GLuint
*) dstAddr
;
2099 dst
[i
] = (F_TO_I(rgba
[i
][ACOMP
] * 1023.0F
) )
2100 | (F_TO_I(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
2101 | (F_TO_I(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
2102 | (F_TO_I(rgba
[i
][RCOMP
] * 3.0F
) << 30);
2106 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2108 GLuint
*dst
= (GLuint
*) dstAddr
;
2109 for (i
= 0; i
< n
; i
++) {
2110 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2114 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2116 GLuint
*dst
= (GLuint
*) dstAddr
;
2117 for (i
= 0; i
< n
; i
++) {
2118 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2123 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2128 if (dstPacking
->SwapBytes
) {
2129 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2130 if (swapSize
== 2) {
2131 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2133 else if (swapSize
== 4) {
2134 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2143 #define SWAP2BYTE(VALUE) \
2145 GLubyte *bytes = (GLubyte *) &(VALUE); \
2146 GLubyte tmp = bytes[0]; \
2147 bytes[0] = bytes[1]; \
2151 #define SWAP4BYTE(VALUE) \
2153 GLubyte *bytes = (GLubyte *) &(VALUE); \
2154 GLubyte tmp = bytes[0]; \
2155 bytes[0] = bytes[3]; \
2158 bytes[1] = bytes[2]; \
2164 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2165 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2166 const struct gl_pixelstore_attrib
*unpack
)
2168 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2170 ASSERT(srcType
== GL_BITMAP
||
2171 srcType
== GL_UNSIGNED_BYTE
||
2172 srcType
== GL_BYTE
||
2173 srcType
== GL_UNSIGNED_SHORT
||
2174 srcType
== GL_SHORT
||
2175 srcType
== GL_UNSIGNED_INT
||
2176 srcType
== GL_INT
||
2177 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2178 srcType
== GL_HALF_FLOAT_ARB
||
2179 srcType
== GL_FLOAT
||
2180 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2185 GLubyte
*ubsrc
= (GLubyte
*) src
;
2186 if (unpack
->LsbFirst
) {
2187 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2189 for (i
= 0; i
< n
; i
++) {
2190 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2201 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2203 for (i
= 0; i
< n
; i
++) {
2204 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2216 case GL_UNSIGNED_BYTE
:
2219 const GLubyte
*s
= (const GLubyte
*) src
;
2220 for (i
= 0; i
< n
; i
++)
2227 const GLbyte
*s
= (const GLbyte
*) src
;
2228 for (i
= 0; i
< n
; i
++)
2232 case GL_UNSIGNED_SHORT
:
2235 const GLushort
*s
= (const GLushort
*) src
;
2236 if (unpack
->SwapBytes
) {
2237 for (i
= 0; i
< n
; i
++) {
2238 GLushort value
= s
[i
];
2244 for (i
= 0; i
< n
; i
++)
2252 const GLshort
*s
= (const GLshort
*) src
;
2253 if (unpack
->SwapBytes
) {
2254 for (i
= 0; i
< n
; i
++) {
2255 GLshort value
= s
[i
];
2261 for (i
= 0; i
< n
; i
++)
2266 case GL_UNSIGNED_INT
:
2269 const GLuint
*s
= (const GLuint
*) src
;
2270 if (unpack
->SwapBytes
) {
2271 for (i
= 0; i
< n
; i
++) {
2272 GLuint value
= s
[i
];
2278 for (i
= 0; i
< n
; i
++)
2286 const GLint
*s
= (const GLint
*) src
;
2287 if (unpack
->SwapBytes
) {
2288 for (i
= 0; i
< n
; i
++) {
2295 for (i
= 0; i
< n
; i
++)
2303 const GLfloat
*s
= (const GLfloat
*) src
;
2304 if (unpack
->SwapBytes
) {
2305 for (i
= 0; i
< n
; i
++) {
2306 GLfloat value
= s
[i
];
2308 indexes
[i
] = (GLuint
) value
;
2312 for (i
= 0; i
< n
; i
++)
2313 indexes
[i
] = (GLuint
) s
[i
];
2317 case GL_HALF_FLOAT_ARB
:
2320 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2321 if (unpack
->SwapBytes
) {
2322 for (i
= 0; i
< n
; i
++) {
2323 GLhalfARB value
= s
[i
];
2325 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2329 for (i
= 0; i
< n
; i
++)
2330 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2334 case GL_UNSIGNED_INT_24_8_EXT
:
2337 const GLuint
*s
= (const GLuint
*) src
;
2338 if (unpack
->SwapBytes
) {
2339 for (i
= 0; i
< n
; i
++) {
2340 GLuint value
= s
[i
];
2342 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2346 for (i
= 0; i
< n
; i
++)
2347 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2351 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2354 const GLuint
*s
= (const GLuint
*) src
;
2355 if (unpack
->SwapBytes
) {
2356 for (i
= 0; i
< n
; i
++) {
2357 GLuint value
= s
[i
*2+1];
2359 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2363 for (i
= 0; i
< n
; i
++)
2364 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2370 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2377 * Return source/dest RGBA indexes for unpacking pixels.
2380 get_component_mapping(GLenum format
,
2392 case GL_RED_INTEGER_EXT
:
2394 *gSrc
= *bSrc
= *aSrc
= -1;
2397 case GL_GREEN_INTEGER_EXT
:
2399 *rSrc
= *bSrc
= *aSrc
= -1;
2402 case GL_BLUE_INTEGER_EXT
:
2404 *rSrc
= *gSrc
= *aSrc
= -1;
2407 case GL_ALPHA_INTEGER_EXT
:
2408 *rSrc
= *gSrc
= *bSrc
= -1;
2412 case GL_LUMINANCE_INTEGER_EXT
:
2413 *rSrc
= *gSrc
= *bSrc
= 0;
2416 case GL_LUMINANCE_ALPHA
:
2417 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2418 *rSrc
= *gSrc
= *bSrc
= 0;
2422 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2436 case GL_RGB_INTEGER
:
2447 case GL_BGR_INTEGER
:
2458 case GL_RGBA_INTEGER
:
2469 case GL_BGRA_INTEGER
:
2497 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2498 _mesa_lookup_enum_by_nr(format
));
2506 * This function extracts floating point RGBA values from arbitrary
2507 * image data. srcFormat and srcType are the format and type parameters
2508 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2510 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2511 * implements the "Conversion to floating point", "Conversion to RGB",
2512 * and "Final Expansion to RGBA" operations.
2514 * Args: n - number of pixels
2515 * rgba - output colors
2516 * srcFormat - format of incoming data
2517 * srcType - data type of incoming data
2518 * src - source data pointer
2519 * swapBytes - perform byteswapping of incoming data?
2522 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2523 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2524 GLboolean swapBytes
)
2526 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2528 GLint rDst
, bDst
, gDst
, aDst
;
2529 GLboolean intFormat
;
2530 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2532 ASSERT(srcFormat
== GL_RED
||
2533 srcFormat
== GL_GREEN
||
2534 srcFormat
== GL_BLUE
||
2535 srcFormat
== GL_ALPHA
||
2536 srcFormat
== GL_LUMINANCE
||
2537 srcFormat
== GL_LUMINANCE_ALPHA
||
2538 srcFormat
== GL_INTENSITY
||
2539 srcFormat
== GL_RG
||
2540 srcFormat
== GL_RGB
||
2541 srcFormat
== GL_BGR
||
2542 srcFormat
== GL_RGBA
||
2543 srcFormat
== GL_BGRA
||
2544 srcFormat
== GL_ABGR_EXT
||
2545 srcFormat
== GL_DU8DV8_ATI
||
2546 srcFormat
== GL_DUDV_ATI
||
2547 srcFormat
== GL_RED_INTEGER_EXT
||
2548 srcFormat
== GL_GREEN_INTEGER_EXT
||
2549 srcFormat
== GL_BLUE_INTEGER_EXT
||
2550 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2551 srcFormat
== GL_RG_INTEGER
||
2552 srcFormat
== GL_RGB_INTEGER_EXT
||
2553 srcFormat
== GL_RGBA_INTEGER_EXT
||
2554 srcFormat
== GL_BGR_INTEGER_EXT
||
2555 srcFormat
== GL_BGRA_INTEGER_EXT
||
2556 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2557 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2559 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2560 srcType
== GL_BYTE
||
2561 srcType
== GL_UNSIGNED_SHORT
||
2562 srcType
== GL_SHORT
||
2563 srcType
== GL_UNSIGNED_INT
||
2564 srcType
== GL_INT
||
2565 srcType
== GL_HALF_FLOAT_ARB
||
2566 srcType
== GL_FLOAT
||
2567 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2568 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2569 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2570 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2571 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2572 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2573 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2574 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2575 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2576 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2577 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2578 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2579 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2580 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2582 get_component_mapping(srcFormat
,
2583 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2584 &rDst
, &gDst
, &bDst
, &aDst
);
2586 stride
= _mesa_components_in_format(srcFormat
);
2588 intFormat
= _mesa_is_enum_format_integer(srcFormat
);
2590 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2591 if ((SRC_INDEX) < 0) { \
2594 for (i = 0; i < n; i++) { \
2595 rgba[i][DST_INDEX] = DEFAULT_INT; \
2599 for (i = 0; i < n; i++) { \
2600 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2604 else if (swapBytes) { \
2605 const TYPE *s = (const TYPE *) src; \
2607 for (i = 0; i < n; i++) { \
2608 TYPE value = s[SRC_INDEX]; \
2609 if (sizeof(TYPE) == 2) { \
2612 else if (sizeof(TYPE) == 4) { \
2616 rgba[i][DST_INDEX] = (GLfloat) value; \
2618 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2623 const TYPE *s = (const TYPE *) src; \
2626 for (i = 0; i < n; i++) { \
2627 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2632 for (i = 0; i < n; i++) { \
2633 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2640 case GL_UNSIGNED_BYTE
:
2641 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2642 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2643 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2644 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2647 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2648 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2649 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2650 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2652 case GL_UNSIGNED_SHORT
:
2653 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2654 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2655 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2656 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2659 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2660 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2661 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2662 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2664 case GL_UNSIGNED_INT
:
2665 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2666 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2667 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2668 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2671 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2672 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2673 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2674 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2677 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2678 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2679 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2680 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2682 case GL_HALF_FLOAT_ARB
:
2683 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2684 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2685 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2686 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2688 case GL_UNSIGNED_BYTE_3_3_2
:
2690 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2697 for (i
= 0; i
< n
; i
++) {
2698 GLubyte p
= ubsrc
[i
];
2699 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2700 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2701 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2702 rgba
[i
][aDst
] = 1.0F
;
2706 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2708 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2715 for (i
= 0; i
< n
; i
++) {
2716 GLubyte p
= ubsrc
[i
];
2717 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2718 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2719 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2720 rgba
[i
][aDst
] = 1.0F
;
2724 case GL_UNSIGNED_SHORT_5_6_5
:
2731 const GLushort
*ussrc
= (const GLushort
*) src
;
2733 for (i
= 0; i
< n
; i
++) {
2734 GLushort p
= ussrc
[i
];
2736 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2737 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2738 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2739 rgba
[i
][aDst
] = 1.0F
;
2743 const GLushort
*ussrc
= (const GLushort
*) src
;
2745 for (i
= 0; i
< n
; i
++) {
2746 GLushort p
= ussrc
[i
];
2747 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2748 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2749 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2750 rgba
[i
][aDst
] = 1.0F
;
2754 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2761 const GLushort
*ussrc
= (const GLushort
*) src
;
2763 for (i
= 0; i
< n
; i
++) {
2764 GLushort p
= ussrc
[i
];
2766 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2767 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2768 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2769 rgba
[i
][aDst
] = 1.0F
;
2773 const GLushort
*ussrc
= (const GLushort
*) src
;
2775 for (i
= 0; i
< n
; i
++) {
2776 GLushort p
= ussrc
[i
];
2777 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2778 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2779 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2780 rgba
[i
][aDst
] = 1.0F
;
2784 case GL_UNSIGNED_SHORT_4_4_4_4
:
2786 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2789 const GLushort
*ussrc
= (const GLushort
*) src
;
2791 for (i
= 0; i
< n
; i
++) {
2792 GLushort p
= ussrc
[i
];
2794 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2795 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2796 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2797 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2801 const GLushort
*ussrc
= (const GLushort
*) src
;
2803 for (i
= 0; i
< n
; i
++) {
2804 GLushort p
= ussrc
[i
];
2805 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2806 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2807 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2808 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2812 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2814 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2817 const GLushort
*ussrc
= (const GLushort
*) src
;
2819 for (i
= 0; i
< n
; i
++) {
2820 GLushort p
= ussrc
[i
];
2822 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2823 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2824 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2825 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2829 const GLushort
*ussrc
= (const GLushort
*) src
;
2831 for (i
= 0; i
< n
; i
++) {
2832 GLushort p
= ussrc
[i
];
2833 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2834 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2835 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2836 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2840 case GL_UNSIGNED_SHORT_5_5_5_1
:
2842 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2845 const GLushort
*ussrc
= (const GLushort
*) src
;
2847 for (i
= 0; i
< n
; i
++) {
2848 GLushort p
= ussrc
[i
];
2850 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2851 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2852 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2853 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2857 const GLushort
*ussrc
= (const GLushort
*) src
;
2859 for (i
= 0; i
< n
; i
++) {
2860 GLushort p
= ussrc
[i
];
2861 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2862 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2863 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2864 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2868 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2870 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2873 const GLushort
*ussrc
= (const GLushort
*) src
;
2875 for (i
= 0; i
< n
; i
++) {
2876 GLushort p
= ussrc
[i
];
2878 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2879 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2880 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2881 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2885 const GLushort
*ussrc
= (const GLushort
*) src
;
2887 for (i
= 0; i
< n
; i
++) {
2888 GLushort p
= ussrc
[i
];
2889 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2890 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2891 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2892 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2896 case GL_UNSIGNED_INT_8_8_8_8
:
2898 const GLuint
*uisrc
= (const GLuint
*) src
;
2901 for (i
= 0; i
< n
; i
++) {
2902 GLuint p
= uisrc
[i
];
2903 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2904 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2905 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2906 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2910 for (i
= 0; i
< n
; i
++) {
2911 GLuint p
= uisrc
[i
];
2912 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2913 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2914 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2915 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2920 const GLuint
*uisrc
= (const GLuint
*) src
;
2923 for (i
= 0; i
< n
; i
++) {
2924 GLuint p
= uisrc
[i
];
2925 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2926 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2927 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2928 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2932 for (i
= 0; i
< n
; i
++) {
2933 GLuint p
= uisrc
[i
];
2934 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2935 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2936 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2937 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2942 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2944 const GLuint
*uisrc
= (const GLuint
*) src
;
2947 for (i
= 0; i
< n
; i
++) {
2948 GLuint p
= uisrc
[i
];
2949 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2950 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2951 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2952 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2956 for (i
= 0; i
< n
; i
++) {
2957 GLuint p
= uisrc
[i
];
2958 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2959 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2960 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2961 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2966 const GLuint
*uisrc
= (const GLuint
*) src
;
2969 for (i
= 0; i
< n
; i
++) {
2970 GLuint p
= uisrc
[i
];
2971 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2972 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2973 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2974 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2978 for (i
= 0; i
< n
; i
++) {
2979 GLuint p
= uisrc
[i
];
2980 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2981 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2982 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2983 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2988 case GL_UNSIGNED_INT_10_10_10_2
:
2990 rs
= 1.0F
/ 1023.0F
;
2991 gs
= 1.0F
/ 1023.0F
;
2992 bs
= 1.0F
/ 1023.0F
;
2996 const GLuint
*uisrc
= (const GLuint
*) src
;
2998 for (i
= 0; i
< n
; i
++) {
2999 GLuint p
= uisrc
[i
];
3001 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3002 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3003 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3004 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3008 const GLuint
*uisrc
= (const GLuint
*) src
;
3010 for (i
= 0; i
< n
; i
++) {
3011 GLuint p
= uisrc
[i
];
3012 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
3013 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
3014 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
3015 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
3019 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3021 rs
= 1.0F
/ 1023.0F
;
3022 gs
= 1.0F
/ 1023.0F
;
3023 bs
= 1.0F
/ 1023.0F
;
3027 const GLuint
*uisrc
= (const GLuint
*) src
;
3029 for (i
= 0; i
< n
; i
++) {
3030 GLuint p
= uisrc
[i
];
3032 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3033 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3034 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3035 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
3039 const GLuint
*uisrc
= (const GLuint
*) src
;
3041 for (i
= 0; i
< n
; i
++) {
3042 GLuint p
= uisrc
[i
];
3043 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
3044 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
3045 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
3046 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
3050 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3052 const GLuint
*uisrc
= (const GLuint
*) src
;
3055 for (i
= 0; i
< n
; i
++) {
3056 GLuint p
= uisrc
[i
];
3058 rgb9e5_to_float3(p
, f
);
3059 rgba
[i
][rDst
] = f
[0];
3060 rgba
[i
][gDst
] = f
[1];
3061 rgba
[i
][bDst
] = f
[2];
3062 rgba
[i
][aDst
] = 1.0F
;
3066 const GLuint
*uisrc
= (const GLuint
*) src
;
3069 for (i
= 0; i
< n
; i
++) {
3070 rgb9e5_to_float3(uisrc
[i
], f
);
3071 rgba
[i
][rDst
] = f
[0];
3072 rgba
[i
][gDst
] = f
[1];
3073 rgba
[i
][bDst
] = f
[2];
3074 rgba
[i
][aDst
] = 1.0F
;
3078 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3080 const GLuint
*uisrc
= (const GLuint
*) src
;
3083 for (i
= 0; i
< n
; i
++) {
3084 GLuint p
= uisrc
[i
];
3086 r11g11b10f_to_float3(p
, f
);
3087 rgba
[i
][rDst
] = f
[0];
3088 rgba
[i
][gDst
] = f
[1];
3089 rgba
[i
][bDst
] = f
[2];
3090 rgba
[i
][aDst
] = 1.0F
;
3094 const GLuint
*uisrc
= (const GLuint
*) src
;
3097 for (i
= 0; i
< n
; i
++) {
3098 r11g11b10f_to_float3(uisrc
[i
], f
);
3099 rgba
[i
][rDst
] = f
[0];
3100 rgba
[i
][gDst
] = f
[1];
3101 rgba
[i
][bDst
] = f
[2];
3102 rgba
[i
][aDst
] = 1.0F
;
3107 _mesa_problem(NULL
, "bad srcType in extract float data");
3114 static inline GLuint
3115 clamp_float_to_uint(GLfloat f
)
3117 return f
< 0.0F
? 0 : F_TO_I(f
);
3121 static inline GLuint
3122 clamp_half_to_uint(GLhalfARB h
)
3124 GLfloat f
= _mesa_half_to_float(h
);
3125 return f
< 0.0F
? 0 : F_TO_I(f
);
3130 * \sa extract_float_rgba()
3133 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3134 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3135 GLboolean swapBytes
)
3137 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3139 GLint rDst
, bDst
, gDst
, aDst
;
3141 ASSERT(srcFormat
== GL_RED
||
3142 srcFormat
== GL_GREEN
||
3143 srcFormat
== GL_BLUE
||
3144 srcFormat
== GL_ALPHA
||
3145 srcFormat
== GL_LUMINANCE
||
3146 srcFormat
== GL_LUMINANCE_ALPHA
||
3147 srcFormat
== GL_INTENSITY
||
3148 srcFormat
== GL_RG
||
3149 srcFormat
== GL_RGB
||
3150 srcFormat
== GL_BGR
||
3151 srcFormat
== GL_RGBA
||
3152 srcFormat
== GL_BGRA
||
3153 srcFormat
== GL_ABGR_EXT
||
3154 srcFormat
== GL_DU8DV8_ATI
||
3155 srcFormat
== GL_DUDV_ATI
||
3156 srcFormat
== GL_RED_INTEGER_EXT
||
3157 srcFormat
== GL_RG_INTEGER
||
3158 srcFormat
== GL_GREEN_INTEGER_EXT
||
3159 srcFormat
== GL_BLUE_INTEGER_EXT
||
3160 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3161 srcFormat
== GL_RGB_INTEGER_EXT
||
3162 srcFormat
== GL_RGBA_INTEGER_EXT
||
3163 srcFormat
== GL_BGR_INTEGER_EXT
||
3164 srcFormat
== GL_BGRA_INTEGER_EXT
||
3165 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3166 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3168 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3169 srcType
== GL_BYTE
||
3170 srcType
== GL_UNSIGNED_SHORT
||
3171 srcType
== GL_SHORT
||
3172 srcType
== GL_UNSIGNED_INT
||
3173 srcType
== GL_INT
||
3174 srcType
== GL_HALF_FLOAT_ARB
||
3175 srcType
== GL_FLOAT
||
3176 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3177 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3178 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3179 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3180 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3181 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3182 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3183 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3184 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3185 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3186 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3187 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3188 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3189 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3191 get_component_mapping(srcFormat
,
3192 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3193 &rDst
, &gDst
, &bDst
, &aDst
);
3195 stride
= _mesa_components_in_format(srcFormat
);
3197 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3198 if ((SRC_INDEX) < 0) { \
3200 for (i = 0; i < n; i++) { \
3201 rgba[i][DST_INDEX] = DEFAULT; \
3204 else if (swapBytes) { \
3205 const TYPE *s = (const TYPE *) src; \
3207 for (i = 0; i < n; i++) { \
3208 TYPE value = s[SRC_INDEX]; \
3209 if (sizeof(TYPE) == 2) { \
3212 else if (sizeof(TYPE) == 4) { \
3215 rgba[i][DST_INDEX] = CONVERSION(value); \
3220 const TYPE *s = (const TYPE *) src; \
3222 for (i = 0; i < n; i++) { \
3223 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3229 case GL_UNSIGNED_BYTE
:
3230 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3231 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3232 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3233 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3236 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3237 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3238 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3239 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3241 case GL_UNSIGNED_SHORT
:
3242 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3243 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3244 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3245 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3248 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3249 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3250 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3251 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3253 case GL_UNSIGNED_INT
:
3254 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3255 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3256 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3257 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3260 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3261 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3262 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3263 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3266 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3267 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3268 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3269 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3271 case GL_HALF_FLOAT_ARB
:
3272 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3273 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3274 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3275 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3277 case GL_UNSIGNED_BYTE_3_3_2
:
3279 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3281 for (i
= 0; i
< n
; i
++) {
3282 GLubyte p
= ubsrc
[i
];
3283 rgba
[i
][rDst
] = ((p
>> 5) );
3284 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3285 rgba
[i
][bDst
] = ((p
) & 0x3);
3290 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3292 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3294 for (i
= 0; i
< n
; i
++) {
3295 GLubyte p
= ubsrc
[i
];
3296 rgba
[i
][rDst
] = ((p
) & 0x7);
3297 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3298 rgba
[i
][bDst
] = ((p
>> 6) );
3303 case GL_UNSIGNED_SHORT_5_6_5
:
3305 const GLushort
*ussrc
= (const GLushort
*) src
;
3307 for (i
= 0; i
< n
; i
++) {
3308 GLushort p
= ussrc
[i
];
3310 rgba
[i
][rDst
] = ((p
>> 11) );
3311 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3312 rgba
[i
][bDst
] = ((p
) & 0x1f);
3317 const GLushort
*ussrc
= (const GLushort
*) src
;
3319 for (i
= 0; i
< n
; i
++) {
3320 GLushort p
= ussrc
[i
];
3321 rgba
[i
][rDst
] = ((p
>> 11) );
3322 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3323 rgba
[i
][bDst
] = ((p
) & 0x1f);
3328 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3330 const GLushort
*ussrc
= (const GLushort
*) src
;
3332 for (i
= 0; i
< n
; i
++) {
3333 GLushort p
= ussrc
[i
];
3335 rgba
[i
][rDst
] = ((p
) & 0x1f);
3336 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3337 rgba
[i
][bDst
] = ((p
>> 11) );
3342 const GLushort
*ussrc
= (const GLushort
*) src
;
3344 for (i
= 0; i
< n
; i
++) {
3345 GLushort p
= ussrc
[i
];
3346 rgba
[i
][rDst
] = ((p
) & 0x1f);
3347 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3348 rgba
[i
][bDst
] = ((p
>> 11) );
3353 case GL_UNSIGNED_SHORT_4_4_4_4
:
3355 const GLushort
*ussrc
= (const GLushort
*) src
;
3357 for (i
= 0; i
< n
; i
++) {
3358 GLushort p
= ussrc
[i
];
3360 rgba
[i
][rDst
] = ((p
>> 12) );
3361 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3362 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3363 rgba
[i
][aDst
] = ((p
) & 0xf);
3367 const GLushort
*ussrc
= (const GLushort
*) src
;
3369 for (i
= 0; i
< n
; i
++) {
3370 GLushort p
= ussrc
[i
];
3371 rgba
[i
][rDst
] = ((p
>> 12) );
3372 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3373 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3374 rgba
[i
][aDst
] = ((p
) & 0xf);
3378 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3380 const GLushort
*ussrc
= (const GLushort
*) src
;
3382 for (i
= 0; i
< n
; i
++) {
3383 GLushort p
= ussrc
[i
];
3385 rgba
[i
][rDst
] = ((p
) & 0xf);
3386 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3387 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3388 rgba
[i
][aDst
] = ((p
>> 12) );
3392 const GLushort
*ussrc
= (const GLushort
*) src
;
3394 for (i
= 0; i
< n
; i
++) {
3395 GLushort p
= ussrc
[i
];
3396 rgba
[i
][rDst
] = ((p
) & 0xf);
3397 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3398 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3399 rgba
[i
][aDst
] = ((p
>> 12) );
3403 case GL_UNSIGNED_SHORT_5_5_5_1
:
3405 const GLushort
*ussrc
= (const GLushort
*) src
;
3407 for (i
= 0; i
< n
; i
++) {
3408 GLushort p
= ussrc
[i
];
3410 rgba
[i
][rDst
] = ((p
>> 11) );
3411 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3412 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3413 rgba
[i
][aDst
] = ((p
) & 0x1 );
3417 const GLushort
*ussrc
= (const GLushort
*) src
;
3419 for (i
= 0; i
< n
; i
++) {
3420 GLushort p
= ussrc
[i
];
3421 rgba
[i
][rDst
] = ((p
>> 11) );
3422 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3423 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3424 rgba
[i
][aDst
] = ((p
) & 0x1 );
3428 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3430 const GLushort
*ussrc
= (const GLushort
*) src
;
3432 for (i
= 0; i
< n
; i
++) {
3433 GLushort p
= ussrc
[i
];
3435 rgba
[i
][rDst
] = ((p
) & 0x1f);
3436 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3437 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3438 rgba
[i
][aDst
] = ((p
>> 15) );
3442 const GLushort
*ussrc
= (const GLushort
*) src
;
3444 for (i
= 0; i
< n
; i
++) {
3445 GLushort p
= ussrc
[i
];
3446 rgba
[i
][rDst
] = ((p
) & 0x1f);
3447 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3448 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3449 rgba
[i
][aDst
] = ((p
>> 15) );
3453 case GL_UNSIGNED_INT_8_8_8_8
:
3455 const GLuint
*uisrc
= (const GLuint
*) src
;
3457 for (i
= 0; i
< n
; i
++) {
3458 GLuint p
= uisrc
[i
];
3459 rgba
[i
][rDst
] = ((p
) & 0xff);
3460 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3461 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3462 rgba
[i
][aDst
] = ((p
>> 24) );
3466 const GLuint
*uisrc
= (const GLuint
*) src
;
3468 for (i
= 0; i
< n
; i
++) {
3469 GLuint p
= uisrc
[i
];
3470 rgba
[i
][rDst
] = ((p
>> 24) );
3471 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3472 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3473 rgba
[i
][aDst
] = ((p
) & 0xff);
3477 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3479 const GLuint
*uisrc
= (const GLuint
*) src
;
3481 for (i
= 0; i
< n
; i
++) {
3482 GLuint p
= uisrc
[i
];
3483 rgba
[i
][rDst
] = ((p
>> 24) );
3484 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3485 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3486 rgba
[i
][aDst
] = ((p
) & 0xff);
3490 const GLuint
*uisrc
= (const GLuint
*) src
;
3492 for (i
= 0; i
< n
; i
++) {
3493 GLuint p
= uisrc
[i
];
3494 rgba
[i
][rDst
] = ((p
) & 0xff);
3495 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3496 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3497 rgba
[i
][aDst
] = ((p
>> 24) );
3501 case GL_UNSIGNED_INT_10_10_10_2
:
3503 const GLuint
*uisrc
= (const GLuint
*) src
;
3505 for (i
= 0; i
< n
; i
++) {
3506 GLuint p
= uisrc
[i
];
3508 rgba
[i
][rDst
] = ((p
>> 22) );
3509 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3510 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3511 rgba
[i
][aDst
] = ((p
) & 0x3 );
3515 const GLuint
*uisrc
= (const GLuint
*) src
;
3517 for (i
= 0; i
< n
; i
++) {
3518 GLuint p
= uisrc
[i
];
3519 rgba
[i
][rDst
] = ((p
>> 22) );
3520 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3521 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3522 rgba
[i
][aDst
] = ((p
) & 0x3 );
3526 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3528 const GLuint
*uisrc
= (const GLuint
*) src
;
3530 for (i
= 0; i
< n
; i
++) {
3531 GLuint p
= uisrc
[i
];
3533 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3534 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3535 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3536 rgba
[i
][aDst
] = ((p
>> 30) );
3540 const GLuint
*uisrc
= (const GLuint
*) src
;
3542 for (i
= 0; i
< n
; i
++) {
3543 GLuint p
= uisrc
[i
];
3544 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3545 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3546 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3547 rgba
[i
][aDst
] = ((p
>> 30) );
3551 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3553 const GLuint
*uisrc
= (const GLuint
*) src
;
3556 for (i
= 0; i
< n
; i
++) {
3557 GLuint p
= uisrc
[i
];
3559 rgb9e5_to_float3(p
, f
);
3560 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3561 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3562 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3567 const GLuint
*uisrc
= (const GLuint
*) src
;
3570 for (i
= 0; i
< n
; i
++) {
3571 GLuint p
= uisrc
[i
];
3572 rgb9e5_to_float3(p
, f
);
3573 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3574 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3575 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3580 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3582 const GLuint
*uisrc
= (const GLuint
*) src
;
3585 for (i
= 0; i
< n
; i
++) {
3586 GLuint p
= uisrc
[i
];
3588 r11g11b10f_to_float3(p
, f
);
3589 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3590 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3591 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3596 const GLuint
*uisrc
= (const GLuint
*) src
;
3599 for (i
= 0; i
< n
; i
++) {
3600 GLuint p
= uisrc
[i
];
3601 r11g11b10f_to_float3(p
, f
);
3602 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3603 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3604 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3610 _mesa_problem(NULL
, "bad srcType in extract uint data");
3619 * Unpack a row of color image data from a client buffer according to
3620 * the pixel unpacking parameters.
3621 * Return GLubyte values in the specified dest image format.
3622 * This is used by glDrawPixels and glTexImage?D().
3623 * \param ctx - the context
3624 * n - number of pixels in the span
3625 * dstFormat - format of destination color array
3626 * dest - the destination color array
3627 * srcFormat - source image format
3628 * srcType - source image data type
3629 * source - source image pointer
3630 * srcPacking - pixel unpacking parameters
3631 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3633 * XXX perhaps expand this to process whole images someday.
3636 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3637 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3638 GLenum srcFormat
, GLenum srcType
,
3639 const GLvoid
*source
,
3640 const struct gl_pixelstore_attrib
*srcPacking
,
3641 GLbitfield transferOps
)
3643 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3644 ASSERT(dstFormat
== GL_ALPHA
||
3645 dstFormat
== GL_LUMINANCE
||
3646 dstFormat
== GL_LUMINANCE_ALPHA
||
3647 dstFormat
== GL_INTENSITY
||
3648 dstFormat
== GL_RED
||
3649 dstFormat
== GL_RG
||
3650 dstFormat
== GL_RGB
||
3651 dstFormat
== GL_RGBA
);
3653 ASSERT(srcFormat
== GL_RED
||
3654 srcFormat
== GL_GREEN
||
3655 srcFormat
== GL_BLUE
||
3656 srcFormat
== GL_ALPHA
||
3657 srcFormat
== GL_LUMINANCE
||
3658 srcFormat
== GL_LUMINANCE_ALPHA
||
3659 srcFormat
== GL_INTENSITY
||
3660 srcFormat
== GL_RG
||
3661 srcFormat
== GL_RGB
||
3662 srcFormat
== GL_BGR
||
3663 srcFormat
== GL_RGBA
||
3664 srcFormat
== GL_BGRA
||
3665 srcFormat
== GL_ABGR_EXT
||
3666 srcFormat
== GL_COLOR_INDEX
);
3668 ASSERT(srcType
== GL_BITMAP
||
3669 srcType
== GL_UNSIGNED_BYTE
||
3670 srcType
== GL_BYTE
||
3671 srcType
== GL_UNSIGNED_SHORT
||
3672 srcType
== GL_SHORT
||
3673 srcType
== GL_UNSIGNED_INT
||
3674 srcType
== GL_INT
||
3675 srcType
== GL_HALF_FLOAT_ARB
||
3676 srcType
== GL_FLOAT
||
3677 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3678 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3679 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3680 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3681 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3682 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3683 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3684 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3685 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3686 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3687 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3688 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3689 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3690 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3692 /* EXT_texture_integer specifies no transfer ops on integer
3693 * types in the resolved issues section. Just set them to 0
3694 * for integer surfaces.
3699 /* Try simple cases first */
3700 if (transferOps
== 0) {
3701 if (srcType
== GL_UNSIGNED_BYTE
) {
3702 if (dstFormat
== GL_RGBA
) {
3703 if (srcFormat
== GL_RGBA
) {
3704 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3707 else if (srcFormat
== GL_RGB
) {
3709 const GLubyte
*src
= (const GLubyte
*) source
;
3710 GLubyte
*dst
= dest
;
3711 for (i
= 0; i
< n
; i
++) {
3722 else if (dstFormat
== GL_RGB
) {
3723 if (srcFormat
== GL_RGB
) {
3724 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3727 else if (srcFormat
== GL_RGBA
) {
3729 const GLubyte
*src
= (const GLubyte
*) source
;
3730 GLubyte
*dst
= dest
;
3731 for (i
= 0; i
< n
; i
++) {
3741 else if (dstFormat
== srcFormat
) {
3742 GLint comps
= _mesa_components_in_format(srcFormat
);
3744 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3751 /* general solution begins here */
3753 GLint dstComponents
;
3754 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3755 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3758 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3762 dstComponents
= _mesa_components_in_format( dstFormat
);
3763 /* source & dest image formats should have been error checked by now */
3764 assert(dstComponents
> 0);
3767 * Extract image data and convert to RGBA floats
3769 if (srcFormat
== GL_COLOR_INDEX
) {
3770 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3773 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3778 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3781 /* Convert indexes to RGBA */
3782 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3783 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3785 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3787 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3788 * with color indexes.
3790 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3795 /* non-color index data */
3796 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3797 srcPacking
->SwapBytes
);
3800 /* Need to clamp if returning GLubytes */
3801 transferOps
|= IMAGE_CLAMP_BIT
;
3804 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3807 get_component_indexes(dstFormat
,
3808 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3810 /* Now return the GLubyte data in the requested dstFormat */
3812 GLubyte
*dst
= dest
;
3814 for (i
= 0; i
< n
; i
++) {
3815 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3816 dst
+= dstComponents
;
3821 GLubyte
*dst
= dest
;
3823 for (i
= 0; i
< n
; i
++) {
3824 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3825 dst
+= dstComponents
;
3830 GLubyte
*dst
= dest
;
3832 for (i
= 0; i
< n
; i
++) {
3833 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3834 dst
+= dstComponents
;
3839 GLubyte
*dst
= dest
;
3841 for (i
= 0; i
< n
; i
++) {
3842 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3843 dst
+= dstComponents
;
3848 GLubyte
*dst
= dest
;
3851 assert(dstComponents
== 1);
3852 for (i
= 0; i
< n
; i
++) {
3853 /* Intensity comes from red channel */
3854 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3859 GLubyte
*dst
= dest
;
3862 for (i
= 0; i
< n
; i
++) {
3863 /* Luminance comes from red channel */
3864 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3865 dst
+= dstComponents
;
3875 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3876 * instead of GLubyte.
3879 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3880 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3881 GLenum srcFormat
, GLenum srcType
,
3882 const GLvoid
*source
,
3883 const struct gl_pixelstore_attrib
*srcPacking
,
3884 GLbitfield transferOps
)
3886 ASSERT(dstFormat
== GL_ALPHA
||
3887 dstFormat
== GL_LUMINANCE
||
3888 dstFormat
== GL_LUMINANCE_ALPHA
||
3889 dstFormat
== GL_INTENSITY
||
3890 dstFormat
== GL_RED
||
3891 dstFormat
== GL_RG
||
3892 dstFormat
== GL_RGB
||
3893 dstFormat
== GL_RGBA
);
3895 ASSERT(srcFormat
== GL_RED
||
3896 srcFormat
== GL_GREEN
||
3897 srcFormat
== GL_BLUE
||
3898 srcFormat
== GL_ALPHA
||
3899 srcFormat
== GL_LUMINANCE
||
3900 srcFormat
== GL_LUMINANCE_ALPHA
||
3901 srcFormat
== GL_INTENSITY
||
3902 srcFormat
== GL_RG
||
3903 srcFormat
== GL_RGB
||
3904 srcFormat
== GL_BGR
||
3905 srcFormat
== GL_RGBA
||
3906 srcFormat
== GL_BGRA
||
3907 srcFormat
== GL_ABGR_EXT
||
3908 srcFormat
== GL_RED_INTEGER_EXT
||
3909 srcFormat
== GL_GREEN_INTEGER_EXT
||
3910 srcFormat
== GL_BLUE_INTEGER_EXT
||
3911 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3912 srcFormat
== GL_RG_INTEGER
||
3913 srcFormat
== GL_RGB_INTEGER_EXT
||
3914 srcFormat
== GL_RGBA_INTEGER_EXT
||
3915 srcFormat
== GL_BGR_INTEGER_EXT
||
3916 srcFormat
== GL_BGRA_INTEGER_EXT
||
3917 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3918 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3919 srcFormat
== GL_COLOR_INDEX
);
3921 ASSERT(srcType
== GL_BITMAP
||
3922 srcType
== GL_UNSIGNED_BYTE
||
3923 srcType
== GL_BYTE
||
3924 srcType
== GL_UNSIGNED_SHORT
||
3925 srcType
== GL_SHORT
||
3926 srcType
== GL_UNSIGNED_INT
||
3927 srcType
== GL_INT
||
3928 srcType
== GL_HALF_FLOAT_ARB
||
3929 srcType
== GL_FLOAT
||
3930 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3931 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3932 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3933 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3934 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3935 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3936 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3937 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3938 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3939 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3940 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3941 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3942 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3943 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3945 /* general solution, no special cases, yet */
3947 GLint dstComponents
;
3948 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3949 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3950 GLboolean intFormat
= _mesa_is_enum_format_integer(srcFormat
);
3953 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3957 dstComponents
= _mesa_components_in_format( dstFormat
);
3958 /* source & dest image formats should have been error checked by now */
3959 assert(dstComponents
> 0);
3961 /* EXT_texture_integer specifies no transfer ops on integer
3962 * types in the resolved issues section. Just set them to 0
3963 * for integer surfaces.
3969 * Extract image data and convert to RGBA floats
3971 if (srcFormat
== GL_COLOR_INDEX
) {
3972 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3975 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3980 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3983 /* Convert indexes to RGBA */
3984 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3985 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3987 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3989 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3990 * with color indexes.
3992 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3997 /* non-color index data */
3998 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3999 srcPacking
->SwapBytes
);
4003 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
4006 get_component_indexes(dstFormat
,
4007 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4009 /* Now pack results in the requested dstFormat */
4011 GLfloat
*dst
= dest
;
4013 for (i
= 0; i
< n
; i
++) {
4014 dst
[rDst
] = rgba
[i
][RCOMP
];
4015 dst
+= dstComponents
;
4020 GLfloat
*dst
= dest
;
4022 for (i
= 0; i
< n
; i
++) {
4023 dst
[gDst
] = rgba
[i
][GCOMP
];
4024 dst
+= dstComponents
;
4029 GLfloat
*dst
= dest
;
4031 for (i
= 0; i
< n
; i
++) {
4032 dst
[bDst
] = rgba
[i
][BCOMP
];
4033 dst
+= dstComponents
;
4038 GLfloat
*dst
= dest
;
4040 for (i
= 0; i
< n
; i
++) {
4041 dst
[aDst
] = rgba
[i
][ACOMP
];
4042 dst
+= dstComponents
;
4047 GLfloat
*dst
= dest
;
4050 assert(dstComponents
== 1);
4051 for (i
= 0; i
< n
; i
++) {
4052 /* Intensity comes from red channel */
4053 dst
[i
] = rgba
[i
][RCOMP
];
4058 GLfloat
*dst
= dest
;
4061 for (i
= 0; i
< n
; i
++) {
4062 /* Luminance comes from red channel */
4063 dst
[0] = rgba
[i
][RCOMP
];
4064 dst
+= dstComponents
;
4074 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4075 * instead of GLubyte.
4076 * No pixel transfer ops are applied.
4079 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4080 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4081 GLenum srcFormat
, GLenum srcType
,
4082 const GLvoid
*source
,
4083 const struct gl_pixelstore_attrib
*srcPacking
)
4085 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
4088 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4092 ASSERT(dstFormat
== GL_ALPHA
||
4093 dstFormat
== GL_LUMINANCE
||
4094 dstFormat
== GL_LUMINANCE_ALPHA
||
4095 dstFormat
== GL_INTENSITY
||
4096 dstFormat
== GL_RED
||
4097 dstFormat
== GL_RG
||
4098 dstFormat
== GL_RGB
||
4099 dstFormat
== GL_RGBA
);
4101 ASSERT(srcFormat
== GL_RED
||
4102 srcFormat
== GL_GREEN
||
4103 srcFormat
== GL_BLUE
||
4104 srcFormat
== GL_ALPHA
||
4105 srcFormat
== GL_LUMINANCE
||
4106 srcFormat
== GL_LUMINANCE_ALPHA
||
4107 srcFormat
== GL_INTENSITY
||
4108 srcFormat
== GL_RG
||
4109 srcFormat
== GL_RGB
||
4110 srcFormat
== GL_BGR
||
4111 srcFormat
== GL_RGBA
||
4112 srcFormat
== GL_BGRA
||
4113 srcFormat
== GL_ABGR_EXT
||
4114 srcFormat
== GL_RED_INTEGER_EXT
||
4115 srcFormat
== GL_GREEN_INTEGER_EXT
||
4116 srcFormat
== GL_BLUE_INTEGER_EXT
||
4117 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4118 srcFormat
== GL_RG_INTEGER
||
4119 srcFormat
== GL_RGB_INTEGER_EXT
||
4120 srcFormat
== GL_RGBA_INTEGER_EXT
||
4121 srcFormat
== GL_BGR_INTEGER_EXT
||
4122 srcFormat
== GL_BGRA_INTEGER_EXT
||
4123 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4124 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4126 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4127 srcType
== GL_BYTE
||
4128 srcType
== GL_UNSIGNED_SHORT
||
4129 srcType
== GL_SHORT
||
4130 srcType
== GL_UNSIGNED_INT
||
4131 srcType
== GL_INT
||
4132 srcType
== GL_HALF_FLOAT_ARB
||
4133 srcType
== GL_FLOAT
||
4134 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4135 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4136 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4137 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4138 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4139 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4140 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4141 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4142 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4143 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4144 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4145 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4146 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4147 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4150 /* Extract image data as uint[4] pixels */
4151 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4152 srcPacking
->SwapBytes
);
4154 if (dstFormat
== GL_RGBA
) {
4156 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4160 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4161 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4163 assert(dstComponents
> 0);
4165 get_component_indexes(dstFormat
,
4166 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4168 /* Now pack values in the requested dest format */
4172 for (i
= 0; i
< n
; i
++) {
4173 dst
[rDst
] = rgba
[i
][RCOMP
];
4174 dst
+= dstComponents
;
4181 for (i
= 0; i
< n
; i
++) {
4182 dst
[gDst
] = rgba
[i
][GCOMP
];
4183 dst
+= dstComponents
;
4190 for (i
= 0; i
< n
; i
++) {
4191 dst
[bDst
] = rgba
[i
][BCOMP
];
4192 dst
+= dstComponents
;
4199 for (i
= 0; i
< n
; i
++) {
4200 dst
[aDst
] = rgba
[i
][ACOMP
];
4201 dst
+= dstComponents
;
4209 assert(dstComponents
== 1);
4210 for (i
= 0; i
< n
; i
++) {
4211 /* Intensity comes from red channel */
4212 dst
[i
] = rgba
[i
][RCOMP
];
4220 for (i
= 0; i
< n
; i
++) {
4221 /* Luminance comes from red channel */
4222 dst
[0] = rgba
[i
][RCOMP
];
4223 dst
+= dstComponents
;
4234 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4235 * directly return GLbyte data, no transfer ops apply.
4238 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4239 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4240 GLenum srcFormat
, GLenum srcType
,
4241 const GLvoid
*source
,
4242 const struct gl_pixelstore_attrib
*srcPacking
,
4243 GLbitfield transferOps
)
4245 ASSERT(dstFormat
== GL_DUDV_ATI
);
4246 ASSERT(srcFormat
== GL_DUDV_ATI
||
4247 srcFormat
== GL_DU8DV8_ATI
);
4249 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4250 srcType
== GL_BYTE
||
4251 srcType
== GL_UNSIGNED_SHORT
||
4252 srcType
== GL_SHORT
||
4253 srcType
== GL_UNSIGNED_INT
||
4254 srcType
== GL_INT
||
4255 srcType
== GL_HALF_FLOAT_ARB
||
4256 srcType
== GL_FLOAT
);
4258 /* general solution */
4260 GLint dstComponents
;
4263 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4266 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4270 dstComponents
= _mesa_components_in_format( dstFormat
);
4271 /* source & dest image formats should have been error checked by now */
4272 assert(dstComponents
> 0);
4275 * Extract image data and convert to RGBA floats
4277 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4278 srcPacking
->SwapBytes
);
4281 /* Now determine which color channels we need to produce.
4282 * And determine the dest index (offset) within each color tuple.
4285 /* Now pack results in the requested dstFormat */
4286 for (i
= 0; i
< n
; i
++) {
4287 /* not sure - need clamp[-1,1] here? */
4288 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4289 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4290 dst
+= dstComponents
;
4298 * Unpack a row of color index data from a client buffer according to
4299 * the pixel unpacking parameters.
4300 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4302 * Args: ctx - the context
4303 * n - number of pixels
4304 * dstType - destination data type
4305 * dest - destination array
4306 * srcType - source pixel type
4307 * source - source data pointer
4308 * srcPacking - pixel unpacking parameters
4309 * transferOps - the pixel transfer operations to apply
4312 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4313 GLenum dstType
, GLvoid
*dest
,
4314 GLenum srcType
, const GLvoid
*source
,
4315 const struct gl_pixelstore_attrib
*srcPacking
,
4316 GLbitfield transferOps
)
4318 ASSERT(srcType
== GL_BITMAP
||
4319 srcType
== GL_UNSIGNED_BYTE
||
4320 srcType
== GL_BYTE
||
4321 srcType
== GL_UNSIGNED_SHORT
||
4322 srcType
== GL_SHORT
||
4323 srcType
== GL_UNSIGNED_INT
||
4324 srcType
== GL_INT
||
4325 srcType
== GL_HALF_FLOAT_ARB
||
4326 srcType
== GL_FLOAT
);
4328 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4329 dstType
== GL_UNSIGNED_SHORT
||
4330 dstType
== GL_UNSIGNED_INT
);
4333 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4336 * Try simple cases first
4338 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4339 && dstType
== GL_UNSIGNED_BYTE
) {
4340 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4342 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4343 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4344 memcpy(dest
, source
, n
* sizeof(GLuint
));
4350 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4353 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4357 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4361 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4363 /* convert to dest type */
4365 case GL_UNSIGNED_BYTE
:
4367 GLubyte
*dst
= (GLubyte
*) dest
;
4369 for (i
= 0; i
< n
; i
++) {
4370 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4374 case GL_UNSIGNED_SHORT
:
4376 GLuint
*dst
= (GLuint
*) dest
;
4378 for (i
= 0; i
< n
; i
++) {
4379 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4383 case GL_UNSIGNED_INT
:
4384 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4387 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4396 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4397 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4398 const struct gl_pixelstore_attrib
*dstPacking
,
4399 GLbitfield transferOps
)
4401 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4404 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4408 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4410 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4411 /* make a copy of input */
4412 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4413 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4418 case GL_UNSIGNED_BYTE
:
4420 GLubyte
*dst
= (GLubyte
*) dest
;
4422 for (i
= 0; i
< n
; i
++) {
4423 *dst
++ = (GLubyte
) source
[i
];
4429 GLbyte
*dst
= (GLbyte
*) dest
;
4431 for (i
= 0; i
< n
; i
++) {
4432 dst
[i
] = (GLbyte
) source
[i
];
4436 case GL_UNSIGNED_SHORT
:
4438 GLushort
*dst
= (GLushort
*) dest
;
4440 for (i
= 0; i
< n
; i
++) {
4441 dst
[i
] = (GLushort
) source
[i
];
4443 if (dstPacking
->SwapBytes
) {
4444 _mesa_swap2( (GLushort
*) dst
, n
);
4450 GLshort
*dst
= (GLshort
*) dest
;
4452 for (i
= 0; i
< n
; i
++) {
4453 dst
[i
] = (GLshort
) source
[i
];
4455 if (dstPacking
->SwapBytes
) {
4456 _mesa_swap2( (GLushort
*) dst
, n
);
4460 case GL_UNSIGNED_INT
:
4462 GLuint
*dst
= (GLuint
*) dest
;
4464 for (i
= 0; i
< n
; i
++) {
4465 dst
[i
] = (GLuint
) source
[i
];
4467 if (dstPacking
->SwapBytes
) {
4468 _mesa_swap4( (GLuint
*) dst
, n
);
4474 GLint
*dst
= (GLint
*) dest
;
4476 for (i
= 0; i
< n
; i
++) {
4477 dst
[i
] = (GLint
) source
[i
];
4479 if (dstPacking
->SwapBytes
) {
4480 _mesa_swap4( (GLuint
*) dst
, n
);
4486 GLfloat
*dst
= (GLfloat
*) dest
;
4488 for (i
= 0; i
< n
; i
++) {
4489 dst
[i
] = (GLfloat
) source
[i
];
4491 if (dstPacking
->SwapBytes
) {
4492 _mesa_swap4( (GLuint
*) dst
, n
);
4496 case GL_HALF_FLOAT_ARB
:
4498 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4500 for (i
= 0; i
< n
; i
++) {
4501 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4503 if (dstPacking
->SwapBytes
) {
4504 _mesa_swap2( (GLushort
*) dst
, n
);
4509 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4517 * Unpack a row of stencil data from a client buffer according to
4518 * the pixel unpacking parameters.
4519 * This is (or will be) used by glDrawPixels
4521 * Args: ctx - the context
4522 * n - number of pixels
4523 * dstType - destination data type
4524 * dest - destination array
4525 * srcType - source pixel type
4526 * source - source data pointer
4527 * srcPacking - pixel unpacking parameters
4528 * transferOps - apply offset/bias/lookup ops?
4531 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4532 GLenum dstType
, GLvoid
*dest
,
4533 GLenum srcType
, const GLvoid
*source
,
4534 const struct gl_pixelstore_attrib
*srcPacking
,
4535 GLbitfield transferOps
)
4537 ASSERT(srcType
== GL_BITMAP
||
4538 srcType
== GL_UNSIGNED_BYTE
||
4539 srcType
== GL_BYTE
||
4540 srcType
== GL_UNSIGNED_SHORT
||
4541 srcType
== GL_SHORT
||
4542 srcType
== GL_UNSIGNED_INT
||
4543 srcType
== GL_INT
||
4544 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4545 srcType
== GL_HALF_FLOAT_ARB
||
4546 srcType
== GL_FLOAT
||
4547 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4549 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4550 dstType
== GL_UNSIGNED_SHORT
||
4551 dstType
== GL_UNSIGNED_INT
||
4552 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4554 /* only shift and offset apply to stencil */
4555 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4558 * Try simple cases first
4560 if (transferOps
== 0 &&
4561 !ctx
->Pixel
.MapStencilFlag
&&
4562 srcType
== GL_UNSIGNED_BYTE
&&
4563 dstType
== GL_UNSIGNED_BYTE
) {
4564 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4566 else if (transferOps
== 0 &&
4567 !ctx
->Pixel
.MapStencilFlag
&&
4568 srcType
== GL_UNSIGNED_INT
&&
4569 dstType
== GL_UNSIGNED_INT
&&
4570 !srcPacking
->SwapBytes
) {
4571 memcpy(dest
, source
, n
* sizeof(GLuint
));
4577 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4580 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4584 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4587 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4588 /* shift and offset indexes */
4589 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4592 if (ctx
->Pixel
.MapStencilFlag
) {
4593 /* Apply stencil lookup table */
4594 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4596 for (i
= 0; i
< n
; i
++) {
4597 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4601 /* convert to dest type */
4603 case GL_UNSIGNED_BYTE
:
4605 GLubyte
*dst
= (GLubyte
*) dest
;
4607 for (i
= 0; i
< n
; i
++) {
4608 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4612 case GL_UNSIGNED_SHORT
:
4614 GLuint
*dst
= (GLuint
*) dest
;
4616 for (i
= 0; i
< n
; i
++) {
4617 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4621 case GL_UNSIGNED_INT
:
4622 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4624 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4626 GLuint
*dst
= (GLuint
*) dest
;
4628 for (i
= 0; i
< n
; i
++) {
4629 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4634 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4643 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4644 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4645 const struct gl_pixelstore_attrib
*dstPacking
)
4647 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4650 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4654 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4655 ctx
->Pixel
.MapStencilFlag
) {
4656 /* make a copy of input */
4657 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4658 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4663 case GL_UNSIGNED_BYTE
:
4664 memcpy(dest
, source
, n
);
4668 GLbyte
*dst
= (GLbyte
*) dest
;
4671 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4675 case GL_UNSIGNED_SHORT
:
4677 GLushort
*dst
= (GLushort
*) dest
;
4680 dst
[i
] = (GLushort
) source
[i
];
4682 if (dstPacking
->SwapBytes
) {
4683 _mesa_swap2( (GLushort
*) dst
, n
);
4689 GLshort
*dst
= (GLshort
*) dest
;
4692 dst
[i
] = (GLshort
) source
[i
];
4694 if (dstPacking
->SwapBytes
) {
4695 _mesa_swap2( (GLushort
*) dst
, n
);
4699 case GL_UNSIGNED_INT
:
4701 GLuint
*dst
= (GLuint
*) dest
;
4704 dst
[i
] = (GLuint
) source
[i
];
4706 if (dstPacking
->SwapBytes
) {
4707 _mesa_swap4( (GLuint
*) dst
, n
);
4713 GLint
*dst
= (GLint
*) dest
;
4716 dst
[i
] = (GLint
) source
[i
];
4718 if (dstPacking
->SwapBytes
) {
4719 _mesa_swap4( (GLuint
*) dst
, n
);
4725 GLfloat
*dst
= (GLfloat
*) dest
;
4728 dst
[i
] = (GLfloat
) source
[i
];
4730 if (dstPacking
->SwapBytes
) {
4731 _mesa_swap4( (GLuint
*) dst
, n
);
4735 case GL_HALF_FLOAT_ARB
:
4737 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4740 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4742 if (dstPacking
->SwapBytes
) {
4743 _mesa_swap2( (GLushort
*) dst
, n
);
4748 if (dstPacking
->LsbFirst
) {
4749 GLubyte
*dst
= (GLubyte
*) dest
;
4752 for (i
= 0; i
< n
; i
++) {
4755 *dst
|= ((source
[i
] != 0) << shift
);
4764 GLubyte
*dst
= (GLubyte
*) dest
;
4767 for (i
= 0; i
< n
; i
++) {
4770 *dst
|= ((source
[i
] != 0) << shift
);
4780 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4786 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4789 const GLTYPE *src = (const GLTYPE *)source; \
4790 for (i = 0; i < n; i++) { \
4791 GLTYPE value = src[i]; \
4792 if (srcPacking->SwapBytes) { \
4793 if (sizeof(GLTYPE) == 2) { \
4795 } else if (sizeof(GLTYPE) == 4) { \
4799 depthValues[i] = GLTYPE2FLOAT(value); \
4805 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4806 * or GLfloat values.
4807 * The glPixelTransfer (scale/bias) params will be applied.
4809 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4810 * \param depthMax max value for returned GLushort or GLuint values
4811 * (ignored for GLfloat).
4814 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4815 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4816 GLenum srcType
, const GLvoid
*source
,
4817 const struct gl_pixelstore_attrib
*srcPacking
)
4819 GLfloat
*depthTemp
= NULL
, *depthValues
;
4820 GLboolean needClamp
= GL_FALSE
;
4822 /* Look for special cases first.
4823 * Not only are these faster, they're less prone to numeric conversion
4824 * problems. Otherwise, converting from an int type to a float then
4825 * back to an int type can introduce errors that will show up as
4826 * artifacts in things like depth peeling which uses glCopyTexImage.
4828 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4829 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4830 const GLuint
*src
= (const GLuint
*) source
;
4831 GLushort
*dst
= (GLushort
*) dest
;
4833 for (i
= 0; i
< n
; i
++) {
4834 dst
[i
] = src
[i
] >> 16;
4838 if (srcType
== GL_UNSIGNED_SHORT
4839 && dstType
== GL_UNSIGNED_INT
4840 && depthMax
== 0xffffffff) {
4841 const GLushort
*src
= (const GLushort
*) source
;
4842 GLuint
*dst
= (GLuint
*) dest
;
4844 for (i
= 0; i
< n
; i
++) {
4845 dst
[i
] = src
[i
] | (src
[i
] << 16);
4849 if (srcType
== GL_UNSIGNED_INT_24_8
4850 && dstType
== GL_UNSIGNED_INT
4851 && depthMax
== 0xffffff) {
4852 const GLuint
*src
= (const GLuint
*) source
;
4853 GLuint
*dst
= (GLuint
*) dest
;
4855 for (i
= 0; i
< n
; i
++) {
4856 dst
[i
] = src
[i
] >> 8;
4860 /* XXX may want to add additional cases here someday */
4863 /* general case path follows */
4865 if (dstType
== GL_FLOAT
) {
4866 depthValues
= (GLfloat
*) dest
;
4869 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4871 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4875 depthValues
= depthTemp
;
4878 /* Convert incoming values to GLfloat. Some conversions will require
4883 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4884 needClamp
= GL_TRUE
;
4886 case GL_UNSIGNED_BYTE
:
4887 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4890 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4891 needClamp
= GL_TRUE
;
4893 case GL_UNSIGNED_SHORT
:
4894 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4897 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4898 needClamp
= GL_TRUE
;
4900 case GL_UNSIGNED_INT
:
4901 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4903 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4904 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4905 depthMax
== 0xffffff &&
4906 ctx
->Pixel
.DepthScale
== 1.0 &&
4907 ctx
->Pixel
.DepthBias
== 0.0) {
4908 const GLuint
*src
= (const GLuint
*) source
;
4909 GLuint
*zValues
= (GLuint
*) dest
;
4911 for (i
= 0; i
< n
; i
++) {
4912 GLuint value
= src
[i
];
4913 if (srcPacking
->SwapBytes
) {
4916 zValues
[i
] = value
& 0xffffff00;
4922 const GLuint
*src
= (const GLuint
*) source
;
4923 const GLfloat scale
= 1.0f
/ 0xffffff;
4925 for (i
= 0; i
< n
; i
++) {
4926 GLuint value
= src
[i
];
4927 if (srcPacking
->SwapBytes
) {
4930 depthValues
[i
] = (value
>> 8) * scale
;
4934 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4937 const GLfloat
*src
= (const GLfloat
*)source
;
4938 for (i
= 0; i
< n
; i
++) {
4939 GLfloat value
= src
[i
* 2];
4940 if (srcPacking
->SwapBytes
) {
4943 depthValues
[i
] = value
;
4945 needClamp
= GL_TRUE
;
4949 DEPTH_VALUES(GLfloat
, 1*);
4950 needClamp
= GL_TRUE
;
4952 case GL_HALF_FLOAT_ARB
:
4955 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4956 for (i
= 0; i
< n
; i
++) {
4957 GLhalfARB value
= src
[i
];
4958 if (srcPacking
->SwapBytes
) {
4961 depthValues
[i
] = _mesa_half_to_float(value
);
4963 needClamp
= GL_TRUE
;
4967 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4972 /* apply depth scale and bias */
4974 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4975 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4976 if (scale
!= 1.0 || bias
!= 0.0) {
4978 for (i
= 0; i
< n
; i
++) {
4979 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4981 needClamp
= GL_TRUE
;
4985 /* clamp to [0, 1] */
4988 for (i
= 0; i
< n
; i
++) {
4989 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4994 * Convert values to dstType
4996 if (dstType
== GL_UNSIGNED_INT
) {
4997 GLuint
*zValues
= (GLuint
*) dest
;
4999 if (depthMax
<= 0xffffff) {
5000 /* no overflow worries */
5001 for (i
= 0; i
< n
; i
++) {
5002 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
5006 /* need to use double precision to prevent overflow problems */
5007 for (i
= 0; i
< n
; i
++) {
5008 GLdouble z
= depthValues
[i
] * (GLdouble
) depthMax
;
5009 if (z
>= (GLdouble
) 0xffffffff)
5010 zValues
[i
] = 0xffffffff;
5012 zValues
[i
] = (GLuint
) z
;
5016 else if (dstType
== GL_UNSIGNED_SHORT
) {
5017 GLushort
*zValues
= (GLushort
*) dest
;
5019 ASSERT(depthMax
<= 0xffff);
5020 for (i
= 0; i
< n
; i
++) {
5021 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
5024 else if (dstType
== GL_FLOAT
) {
5025 /* Nothing to do. depthValues is pointing to dest. */
5027 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
5028 GLfloat
*zValues
= (GLfloat
*) dest
;
5030 for (i
= 0; i
< n
; i
++) {
5031 zValues
[i
*2] = depthValues
[i
];
5043 * Pack an array of depth values. The values are floats in [0,1].
5046 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
5047 GLenum dstType
, const GLfloat
*depthSpan
,
5048 const struct gl_pixelstore_attrib
*dstPacking
)
5050 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5052 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5056 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5057 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
5058 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5059 depthSpan
= depthCopy
;
5063 case GL_UNSIGNED_BYTE
:
5065 GLubyte
*dst
= (GLubyte
*) dest
;
5067 for (i
= 0; i
< n
; i
++) {
5068 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5074 GLbyte
*dst
= (GLbyte
*) dest
;
5076 for (i
= 0; i
< n
; i
++) {
5077 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5081 case GL_UNSIGNED_SHORT
:
5083 GLushort
*dst
= (GLushort
*) dest
;
5085 for (i
= 0; i
< n
; i
++) {
5086 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5088 if (dstPacking
->SwapBytes
) {
5089 _mesa_swap2( (GLushort
*) dst
, n
);
5095 GLshort
*dst
= (GLshort
*) dest
;
5097 for (i
= 0; i
< n
; i
++) {
5098 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5100 if (dstPacking
->SwapBytes
) {
5101 _mesa_swap2( (GLushort
*) dst
, n
);
5105 case GL_UNSIGNED_INT
:
5107 GLuint
*dst
= (GLuint
*) dest
;
5109 for (i
= 0; i
< n
; i
++) {
5110 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5112 if (dstPacking
->SwapBytes
) {
5113 _mesa_swap4( (GLuint
*) dst
, n
);
5119 GLint
*dst
= (GLint
*) dest
;
5121 for (i
= 0; i
< n
; i
++) {
5122 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5124 if (dstPacking
->SwapBytes
) {
5125 _mesa_swap4( (GLuint
*) dst
, n
);
5131 GLfloat
*dst
= (GLfloat
*) dest
;
5133 for (i
= 0; i
< n
; i
++) {
5134 dst
[i
] = depthSpan
[i
];
5136 if (dstPacking
->SwapBytes
) {
5137 _mesa_swap4( (GLuint
*) dst
, n
);
5141 case GL_HALF_FLOAT_ARB
:
5143 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5145 for (i
= 0; i
< n
; i
++) {
5146 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5148 if (dstPacking
->SwapBytes
) {
5149 _mesa_swap2( (GLushort
*) dst
, n
);
5154 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5163 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5166 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5167 GLenum dstType
, GLuint
*dest
,
5168 const GLfloat
*depthVals
,
5169 const GLubyte
*stencilVals
,
5170 const struct gl_pixelstore_attrib
*dstPacking
)
5172 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5173 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5176 if (!depthCopy
|| !stencilCopy
) {
5177 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5183 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5184 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5185 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5186 depthVals
= depthCopy
;
5189 if (ctx
->Pixel
.IndexShift
||
5190 ctx
->Pixel
.IndexOffset
||
5191 ctx
->Pixel
.MapStencilFlag
) {
5192 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5193 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5194 stencilVals
= stencilCopy
;
5198 case GL_UNSIGNED_INT_24_8
:
5199 for (i
= 0; i
< n
; i
++) {
5200 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5201 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5204 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5205 for (i
= 0; i
< n
; i
++) {
5206 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5207 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5212 if (dstPacking
->SwapBytes
) {
5213 _mesa_swap4(dest
, n
);
5224 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5225 * Return all image data in a contiguous block. This is used when we
5226 * compile glDrawPixels, glTexImage, etc into a display list. We
5227 * need a copy of the data in a standard format.
5230 _mesa_unpack_image( GLuint dimensions
,
5231 GLsizei width
, GLsizei height
, GLsizei depth
,
5232 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5233 const struct gl_pixelstore_attrib
*unpack
)
5235 GLint bytesPerRow
, compsPerRow
;
5236 GLboolean flipBytes
, swap2
, swap4
;
5239 return NULL
; /* not necessarily an error */
5241 if (width
<= 0 || height
<= 0 || depth
<= 0)
5242 return NULL
; /* generate error later */
5244 if (type
== GL_BITMAP
) {
5245 bytesPerRow
= (width
+ 7) >> 3;
5246 flipBytes
= unpack
->LsbFirst
;
5247 swap2
= swap4
= GL_FALSE
;
5251 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5252 GLint components
= _mesa_components_in_format(format
);
5255 if (_mesa_type_is_packed(type
))
5258 if (bytesPerPixel
<= 0 || components
<= 0)
5259 return NULL
; /* bad format or type. generate error later */
5260 bytesPerRow
= bytesPerPixel
* width
;
5261 bytesPerComp
= bytesPerPixel
/ components
;
5262 flipBytes
= GL_FALSE
;
5263 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5264 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5265 compsPerRow
= components
* width
;
5266 assert(compsPerRow
>= width
);
5271 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5275 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5278 for (img
= 0; img
< depth
; img
++) {
5279 for (row
= 0; row
< height
; row
++) {
5280 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5281 width
, height
, format
, type
, img
, row
, 0);
5283 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5285 flipBytes
= GL_FALSE
;
5286 if (unpack
->LsbFirst
) {
5287 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5288 GLubyte dstMask
= 128;
5289 const GLubyte
*s
= src
;
5292 for (i
= 0; i
< width
; i
++) {
5296 if (srcMask
== 128) {
5301 srcMask
= srcMask
<< 1;
5309 dstMask
= dstMask
>> 1;
5314 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5315 GLubyte dstMask
= 128;
5316 const GLubyte
*s
= src
;
5319 for (i
= 0; i
< width
; i
++) {
5328 srcMask
= srcMask
>> 1;
5336 dstMask
= dstMask
>> 1;
5342 memcpy(dst
, src
, bytesPerRow
);
5345 /* byte flipping/swapping */
5347 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5350 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5353 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5365 * If we unpack colors from a luminance surface, we'll get pixel colors
5366 * such as (l, l, l, a).
5367 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5368 * function will compute L=R+G+B before packing. The net effect is we'll
5369 * accidentally store luminance values = 3*l.
5370 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5372 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5375 * Finally, we also need to do this when the actual surface format does
5376 * not match the logical surface format. For example, suppose the user
5377 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5378 * Again, we'll get pixel values like (l,l,l,a).
5381 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5385 switch (baseFormat
) {
5387 for (i
= 0; i
< n
; i
++) {
5388 rgba
[i
][RCOMP
] = 0.0F
;
5389 rgba
[i
][GCOMP
] = 0.0F
;
5390 rgba
[i
][BCOMP
] = 0.0F
;
5396 for (i
= 0; i
< n
; i
++) {
5397 rgba
[i
][GCOMP
] = 0.0F
;
5398 rgba
[i
][BCOMP
] = 0.0F
;
5399 rgba
[i
][ACOMP
] = 1.0F
;
5402 case GL_LUMINANCE_ALPHA
:
5403 for (i
= 0; i
< n
; i
++) {
5404 rgba
[i
][GCOMP
] = 0.0F
;
5405 rgba
[i
][BCOMP
] = 0.0F
;
5416 * As above, but GLuint components.
5419 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5423 switch (baseFormat
) {
5425 for (i
= 0; i
< n
; i
++) {
5434 for (i
= 0; i
< n
; i
++) {
5440 case GL_LUMINANCE_ALPHA
:
5441 for (i
= 0; i
< n
; i
++) {