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.
40 #include "pixeltransfer.h"
42 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
43 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
47 * Flip the 8 bits in each byte of the given array.
50 * \param n number of bytes.
52 * \todo try this trick to flip bytes someday:
54 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
55 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
56 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
60 flip_bytes( GLubyte
*p
, GLuint n
)
63 for (i
= 0; i
< n
; i
++) {
64 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
65 a
= ((b
& 0x01) << 7) |
80 * Unpack a 32x32 pixel polygon stipple from user memory using the
81 * current pixel unpack settings.
84 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
85 const struct gl_pixelstore_attrib
*unpacking
)
87 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
89 /* Convert pattern from GLubytes to GLuints and handle big/little
94 for (i
= 0; i
< 32; i
++) {
95 dest
[i
] = (p
[0] << 24)
107 * Pack polygon stipple into user memory given current pixel packing
111 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
112 const struct gl_pixelstore_attrib
*packing
)
114 /* Convert pattern from GLuints to GLubytes to handle big/little
115 * endian differences.
119 for (i
= 0; i
< 32; i
++) {
120 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
121 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
122 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
123 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
126 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
131 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
132 * order with row alignment = 1 byte.
135 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
136 const struct gl_pixelstore_attrib
*packing
)
138 GLint bytes
, row
, width_in_bytes
;
139 GLubyte
*buffer
, *dst
;
144 /* Alloc dest storage */
145 bytes
= ((width
+ 7) / 8 * height
);
146 buffer
= (GLubyte
*) malloc( bytes
);
150 width_in_bytes
= CEILING( width
, 8 );
152 for (row
= 0; row
< height
; row
++) {
153 const GLubyte
*src
= (const GLubyte
*)
154 _mesa_image_address2d(packing
, pixels
, width
, height
,
155 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
161 if ((packing
->SkipPixels
& 7) == 0) {
162 memcpy( dst
, src
, width_in_bytes
);
163 if (packing
->LsbFirst
) {
164 flip_bytes( dst
, width_in_bytes
);
168 /* handling SkipPixels is a bit tricky (no pun intended!) */
170 if (packing
->LsbFirst
) {
171 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
172 GLubyte dstMask
= 128;
173 const GLubyte
*s
= src
;
176 for (i
= 0; i
< width
; i
++) {
180 if (srcMask
== 128) {
185 srcMask
= srcMask
<< 1;
193 dstMask
= dstMask
>> 1;
198 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
199 GLubyte dstMask
= 128;
200 const GLubyte
*s
= src
;
203 for (i
= 0; i
< width
; i
++) {
212 srcMask
= srcMask
>> 1;
220 dstMask
= dstMask
>> 1;
225 dst
+= width_in_bytes
;
236 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
237 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
239 GLint row
, width_in_bytes
;
245 width_in_bytes
= CEILING( width
, 8 );
247 for (row
= 0; row
< height
; row
++) {
248 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
249 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
253 if ((packing
->SkipPixels
& 7) == 0) {
254 memcpy( dst
, src
, width_in_bytes
);
255 if (packing
->LsbFirst
) {
256 flip_bytes( dst
, width_in_bytes
);
260 /* handling SkipPixels is a bit tricky (no pun intended!) */
262 if (packing
->LsbFirst
) {
263 GLubyte srcMask
= 128;
264 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
265 const GLubyte
*s
= src
;
268 for (i
= 0; i
< width
; i
++) {
277 srcMask
= srcMask
>> 1;
279 if (dstMask
== 128) {
285 dstMask
= dstMask
<< 1;
290 GLubyte srcMask
= 128;
291 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
292 const GLubyte
*s
= src
;
295 for (i
= 0; i
< width
; i
++) {
304 srcMask
= srcMask
>> 1;
312 dstMask
= dstMask
>> 1;
317 src
+= width_in_bytes
;
323 * Get indexes of color components for a basic color format, such as
324 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
328 get_component_indexes(GLenum format
,
333 GLint
*luminanceIndex
,
334 GLint
*intensityIndex
)
340 *luminanceIndex
= -1;
341 *intensityIndex
= -1;
345 case GL_LUMINANCE_INTEGER_EXT
:
348 case GL_LUMINANCE_ALPHA
:
349 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
357 case GL_RED_INTEGER_EXT
:
361 case GL_GREEN_INTEGER_EXT
:
365 case GL_BLUE_INTEGER_EXT
:
369 case GL_ALPHA_INTEGER_EXT
:
378 case GL_RGB_INTEGER_EXT
:
384 case GL_BGR_INTEGER_EXT
:
390 case GL_RGBA_INTEGER_EXT
:
397 case GL_BGRA_INTEGER
:
415 assert(0 && "bad format in get_component_indexes()");
422 * For small integer types, return the min and max possible values.
423 * Used for clamping floats to unscaled integer types.
424 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
427 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
434 case GL_UNSIGNED_BYTE
:
442 case GL_UNSIGNED_SHORT
:
451 /* Customization of integer packing. We always treat src as uint, and can pack dst
452 * as any integer type/format combo.
454 #define SRC_TYPE GLuint
456 #define DST_TYPE GLuint
457 #define SRC_CONVERT(x) (x)
458 #define FN_NAME pack_uint_from_uint_rgba
459 #include "pack_tmp.h"
464 #define DST_TYPE GLushort
465 #define SRC_CONVERT(x) MIN2(x, 0xffff)
466 #define FN_NAME pack_ushort_from_uint_rgba
467 #include "pack_tmp.h"
472 #define DST_TYPE GLshort
473 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
474 #define FN_NAME pack_short_from_uint_rgba
475 #include "pack_tmp.h"
480 #define DST_TYPE GLubyte
481 #define SRC_CONVERT(x) MIN2(x, 0xff)
482 #define FN_NAME pack_ubyte_from_uint_rgba
483 #include "pack_tmp.h"
488 #define DST_TYPE GLbyte
489 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
490 #define FN_NAME pack_byte_from_uint_rgba
491 #include "pack_tmp.h"
497 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
498 GLenum dstFormat
, GLenum dstType
,
502 case GL_UNSIGNED_INT
:
503 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
506 /* No conversion necessary. */
507 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
509 case GL_UNSIGNED_SHORT
:
510 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
513 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
515 case GL_UNSIGNED_BYTE
:
516 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
519 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
529 * Used to pack an array [][4] of RGBA float colors as specified
530 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
531 * Historically, the RGBA values were in [0,1] and rescaled to fit
532 * into GLubytes, etc. But with new integer formats, the RGBA values
533 * may have any value and we don't always rescale when converting to
536 * Note: the rgba values will be modified by this function when any pixel
537 * transfer ops are enabled.
540 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
541 GLenum dstFormat
, GLenum dstType
,
543 const struct gl_pixelstore_attrib
*dstPacking
,
544 GLbitfield transferOps
)
547 const GLint comps
= _mesa_components_in_format(dstFormat
);
548 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
551 if (dstFormat
== GL_LUMINANCE
||
552 dstFormat
== GL_LUMINANCE_ALPHA
||
553 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
554 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
555 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
557 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
565 /* EXT_texture_integer specifies no transfer ops on integer
566 * types in the resolved issues section. Just set them to 0
567 * for integer surfaces.
573 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
577 * Component clamping (besides clamping to [0,1] in
578 * _mesa_apply_rgba_transfer_ops()).
581 /* clamping to dest type's min/max values */
583 if (get_type_min_max(dstType
, &min
, &max
)) {
584 for (i
= 0; i
< n
; i
++) {
585 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
586 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
587 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
588 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
592 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
593 /* compute luminance values */
594 if (transferOps
& IMAGE_CLAMP_BIT
) {
595 for (i
= 0; i
< n
; i
++) {
596 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
597 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
601 for (i
= 0; i
< n
; i
++) {
602 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
608 * Pack/store the pixels. Ugh! Lots of cases!!!
611 case GL_UNSIGNED_BYTE
:
613 GLubyte
*dst
= (GLubyte
*) dstAddr
;
617 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
621 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
625 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
629 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
633 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
635 case GL_LUMINANCE_ALPHA
:
637 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
638 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
643 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
644 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
649 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
650 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
651 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
656 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
657 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
658 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
659 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
664 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
665 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
666 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
671 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
672 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
673 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
674 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
679 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
680 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
681 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
682 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
685 case GL_RED_INTEGER_EXT
:
687 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
690 case GL_GREEN_INTEGER_EXT
:
692 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
695 case GL_BLUE_INTEGER_EXT
:
697 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
700 case GL_ALPHA_INTEGER_EXT
:
702 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
707 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
708 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
711 case GL_RGB_INTEGER_EXT
:
713 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
714 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
715 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
718 case GL_RGBA_INTEGER_EXT
:
720 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
721 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
722 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
723 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
726 case GL_BGR_INTEGER_EXT
:
728 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
729 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
730 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
733 case GL_BGRA_INTEGER_EXT
:
735 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
736 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
737 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
738 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
741 case GL_LUMINANCE_INTEGER_EXT
:
743 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
746 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
749 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
751 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
759 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
760 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
764 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
770 GLbyte
*dst
= (GLbyte
*) dstAddr
;
774 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
778 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
782 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
786 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
790 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
792 case GL_LUMINANCE_ALPHA
:
794 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
795 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
800 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
801 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
806 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
807 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
808 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
813 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
814 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
815 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
816 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
821 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
822 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
823 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
828 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
829 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
830 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
831 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
836 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
837 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
838 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
839 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
842 case GL_RED_INTEGER_EXT
:
844 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
847 case GL_GREEN_INTEGER_EXT
:
849 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
852 case GL_BLUE_INTEGER_EXT
:
854 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
857 case GL_ALPHA_INTEGER_EXT
:
859 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
864 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
865 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
868 case GL_RGB_INTEGER_EXT
:
870 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
871 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
872 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
875 case GL_RGBA_INTEGER_EXT
:
877 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
878 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
879 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
880 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
883 case GL_BGR_INTEGER_EXT
:
885 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
886 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
887 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
890 case GL_BGRA_INTEGER_EXT
:
892 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
893 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
894 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
895 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
898 case GL_LUMINANCE_INTEGER_EXT
:
900 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
903 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
906 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
908 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
916 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
917 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
921 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
925 case GL_UNSIGNED_SHORT
:
927 GLushort
*dst
= (GLushort
*) dstAddr
;
931 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
935 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
939 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
943 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
947 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
949 case GL_LUMINANCE_ALPHA
:
951 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
952 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
957 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
958 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
964 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
965 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
972 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
973 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
979 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
980 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
986 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
987 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
988 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
993 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
994 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
995 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
996 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
999 case GL_RED_INTEGER_EXT
:
1001 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1004 case GL_GREEN_INTEGER_EXT
:
1006 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1009 case GL_BLUE_INTEGER_EXT
:
1011 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1014 case GL_ALPHA_INTEGER_EXT
:
1016 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1021 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1022 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1025 case GL_RGB_INTEGER_EXT
:
1027 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1028 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1029 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1032 case GL_RGBA_INTEGER_EXT
:
1034 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1035 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1036 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1037 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1040 case GL_BGR_INTEGER_EXT
:
1042 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1043 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1044 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1047 case GL_BGRA_INTEGER_EXT
:
1049 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1050 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1051 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1052 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1055 case GL_LUMINANCE_INTEGER_EXT
:
1057 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1060 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1063 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1065 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1073 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1074 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1078 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1084 GLshort
*dst
= (GLshort
*) dstAddr
;
1085 switch (dstFormat
) {
1088 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1092 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1096 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1100 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1104 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1106 case GL_LUMINANCE_ALPHA
:
1108 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1109 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1114 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1115 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1120 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1121 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1122 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1127 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1128 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1129 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1130 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1135 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1136 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1137 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1142 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1143 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1144 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1145 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1150 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1151 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1152 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1153 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1156 case GL_RED_INTEGER_EXT
:
1158 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1161 case GL_GREEN_INTEGER_EXT
:
1163 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1166 case GL_BLUE_INTEGER_EXT
:
1168 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1171 case GL_ALPHA_INTEGER_EXT
:
1173 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1178 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1179 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1180 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1183 case GL_RGB_INTEGER_EXT
:
1185 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1186 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1187 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1190 case GL_RGBA_INTEGER_EXT
:
1192 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1193 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1194 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1195 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1198 case GL_BGR_INTEGER_EXT
:
1200 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1201 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1202 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1205 case GL_BGRA_INTEGER_EXT
:
1207 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1208 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1209 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1210 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1213 case GL_LUMINANCE_INTEGER_EXT
:
1215 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1218 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1221 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1223 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1231 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1232 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1236 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1240 case GL_UNSIGNED_INT
:
1242 GLuint
*dst
= (GLuint
*) dstAddr
;
1243 switch (dstFormat
) {
1246 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1250 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1254 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1258 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1262 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1264 case GL_LUMINANCE_ALPHA
:
1266 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1267 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1272 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1273 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1278 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1279 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1280 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1285 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1286 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1287 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1288 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1293 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1294 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1295 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1300 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1301 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1302 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1303 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1308 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1309 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1310 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1311 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1314 case GL_RED_INTEGER_EXT
:
1316 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1319 case GL_GREEN_INTEGER_EXT
:
1321 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1324 case GL_BLUE_INTEGER_EXT
:
1326 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1329 case GL_ALPHA_INTEGER_EXT
:
1331 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1336 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1337 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1340 case GL_RGB_INTEGER_EXT
:
1342 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1343 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1344 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1347 case GL_RGBA_INTEGER_EXT
:
1349 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1350 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1351 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1352 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1355 case GL_BGR_INTEGER_EXT
:
1357 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1358 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1359 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1362 case GL_BGRA_INTEGER_EXT
:
1364 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1365 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1366 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1367 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1370 case GL_LUMINANCE_INTEGER_EXT
:
1372 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1375 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1378 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1380 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1388 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1389 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1393 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1399 GLint
*dst
= (GLint
*) dstAddr
;
1400 switch (dstFormat
) {
1403 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1407 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1411 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1415 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1419 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1421 case GL_LUMINANCE_ALPHA
:
1423 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1424 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1429 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1430 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1435 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1436 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1437 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1442 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1443 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1444 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1445 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1450 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1451 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1452 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1457 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1458 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1459 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1460 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1465 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1466 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1467 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1468 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1474 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1475 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1478 case GL_RED_INTEGER_EXT
:
1480 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1483 case GL_GREEN_INTEGER_EXT
:
1485 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1488 case GL_BLUE_INTEGER_EXT
:
1490 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1493 case GL_ALPHA_INTEGER_EXT
:
1495 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1500 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1501 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1504 case GL_RGB_INTEGER_EXT
:
1506 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1507 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1508 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1511 case GL_RGBA_INTEGER_EXT
:
1513 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1514 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1515 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1516 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1519 case GL_BGR_INTEGER_EXT
:
1521 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1522 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1523 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1526 case GL_BGRA_INTEGER_EXT
:
1528 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1529 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1530 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1531 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1534 case GL_LUMINANCE_INTEGER_EXT
:
1536 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1539 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1542 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1544 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1550 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1556 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1557 switch (dstFormat
) {
1560 dst
[i
] = rgba
[i
][RCOMP
];
1564 dst
[i
] = rgba
[i
][GCOMP
];
1568 dst
[i
] = rgba
[i
][BCOMP
];
1572 dst
[i
] = rgba
[i
][ACOMP
];
1576 dst
[i
] = luminance
[i
];
1578 case GL_LUMINANCE_ALPHA
:
1580 dst
[i
*2+0] = luminance
[i
];
1581 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1586 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1587 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1592 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1593 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1594 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1599 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1600 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1601 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1602 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1607 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1608 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1609 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1614 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1615 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1616 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1617 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1622 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1623 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1624 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1625 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1631 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1632 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1636 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1640 case GL_HALF_FLOAT_ARB
:
1642 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1643 switch (dstFormat
) {
1646 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1650 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1654 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1658 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1662 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1664 case GL_LUMINANCE_ALPHA
:
1666 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1667 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1672 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1673 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1678 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1679 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1680 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1685 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1686 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1687 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1688 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1693 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1694 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1695 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1700 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1701 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1702 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1703 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1708 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1709 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1710 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1711 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1717 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1718 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1722 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1726 case GL_UNSIGNED_BYTE_3_3_2
:
1727 if (dstFormat
== GL_RGB
) {
1728 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1730 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1731 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1732 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1736 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1737 if (dstFormat
== GL_RGB
) {
1738 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1740 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1741 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1742 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1746 case GL_UNSIGNED_SHORT_5_6_5
:
1747 if (dstFormat
== GL_RGB
) {
1748 GLushort
*dst
= (GLushort
*) dstAddr
;
1750 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1751 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1752 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1756 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1757 if (dstFormat
== GL_RGB
) {
1758 GLushort
*dst
= (GLushort
*) dstAddr
;
1760 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1761 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1762 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1766 case GL_UNSIGNED_SHORT_4_4_4_4
:
1767 if (dstFormat
== GL_RGBA
) {
1768 GLushort
*dst
= (GLushort
*) dstAddr
;
1770 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1771 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1772 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1773 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1776 else if (dstFormat
== GL_BGRA
) {
1777 GLushort
*dst
= (GLushort
*) dstAddr
;
1779 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1780 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1781 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1782 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1785 else if (dstFormat
== GL_ABGR_EXT
) {
1786 GLushort
*dst
= (GLushort
*) dstAddr
;
1788 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1789 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1790 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1791 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1795 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1796 if (dstFormat
== GL_RGBA
) {
1797 GLushort
*dst
= (GLushort
*) dstAddr
;
1799 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1800 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1801 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1802 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1805 else if (dstFormat
== GL_BGRA
) {
1806 GLushort
*dst
= (GLushort
*) dstAddr
;
1808 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1809 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1810 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1811 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1814 else if (dstFormat
== GL_ABGR_EXT
) {
1815 GLushort
*dst
= (GLushort
*) dstAddr
;
1817 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1818 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1819 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1820 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1824 case GL_UNSIGNED_SHORT_5_5_5_1
:
1825 if (dstFormat
== GL_RGBA
) {
1826 GLushort
*dst
= (GLushort
*) dstAddr
;
1828 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1829 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1830 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1831 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1834 else if (dstFormat
== GL_BGRA
) {
1835 GLushort
*dst
= (GLushort
*) dstAddr
;
1837 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1838 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1839 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1840 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1843 else if (dstFormat
== GL_ABGR_EXT
) {
1844 GLushort
*dst
= (GLushort
*) dstAddr
;
1846 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1847 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1848 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1849 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1853 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1854 if (dstFormat
== GL_RGBA
) {
1855 GLushort
*dst
= (GLushort
*) dstAddr
;
1857 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1858 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1859 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1860 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1863 else if (dstFormat
== GL_BGRA
) {
1864 GLushort
*dst
= (GLushort
*) dstAddr
;
1866 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1867 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1868 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1869 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1872 else if (dstFormat
== GL_ABGR_EXT
) {
1873 GLushort
*dst
= (GLushort
*) dstAddr
;
1875 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1876 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1877 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1878 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1882 case GL_UNSIGNED_INT_8_8_8_8
:
1883 if (dstFormat
== GL_RGBA
) {
1884 GLuint
*dst
= (GLuint
*) dstAddr
;
1886 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1887 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1888 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1889 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1892 else if (dstFormat
== GL_BGRA
) {
1893 GLuint
*dst
= (GLuint
*) dstAddr
;
1895 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1896 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1897 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1898 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1901 else if (dstFormat
== GL_ABGR_EXT
) {
1902 GLuint
*dst
= (GLuint
*) dstAddr
;
1904 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1905 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1906 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1907 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1911 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1912 if (dstFormat
== GL_RGBA
) {
1913 GLuint
*dst
= (GLuint
*) dstAddr
;
1915 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1916 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1917 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1918 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1921 else if (dstFormat
== GL_BGRA
) {
1922 GLuint
*dst
= (GLuint
*) dstAddr
;
1924 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1925 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1926 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1927 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1930 else if (dstFormat
== GL_ABGR_EXT
) {
1931 GLuint
*dst
= (GLuint
*) dstAddr
;
1933 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1934 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1935 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1936 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1940 case GL_UNSIGNED_INT_10_10_10_2
:
1941 if (dstFormat
== GL_RGBA
) {
1942 GLuint
*dst
= (GLuint
*) dstAddr
;
1944 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1945 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1946 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1947 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1950 else if (dstFormat
== GL_BGRA
) {
1951 GLuint
*dst
= (GLuint
*) dstAddr
;
1953 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1954 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1955 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1956 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1959 else if (dstFormat
== GL_ABGR_EXT
) {
1960 GLuint
*dst
= (GLuint
*) dstAddr
;
1962 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1963 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1964 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1965 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1969 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1970 if (dstFormat
== GL_RGBA
) {
1971 GLuint
*dst
= (GLuint
*) dstAddr
;
1973 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1974 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1975 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1976 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1979 else if (dstFormat
== GL_BGRA
) {
1980 GLuint
*dst
= (GLuint
*) dstAddr
;
1982 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1983 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1984 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1985 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1988 else if (dstFormat
== GL_ABGR_EXT
) {
1989 GLuint
*dst
= (GLuint
*) dstAddr
;
1991 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1992 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1993 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1994 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1998 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2000 GLuint
*dst
= (GLuint
*) dstAddr
;
2001 for (i
= 0; i
< n
; i
++) {
2002 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
2006 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2008 GLuint
*dst
= (GLuint
*) dstAddr
;
2009 for (i
= 0; i
< n
; i
++) {
2010 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
2015 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2020 if (dstPacking
->SwapBytes
) {
2021 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2022 if (swapSize
== 2) {
2023 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2025 else if (swapSize
== 4) {
2026 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2035 #define SWAP2BYTE(VALUE) \
2037 GLubyte *bytes = (GLubyte *) &(VALUE); \
2038 GLubyte tmp = bytes[0]; \
2039 bytes[0] = bytes[1]; \
2043 #define SWAP4BYTE(VALUE) \
2045 GLubyte *bytes = (GLubyte *) &(VALUE); \
2046 GLubyte tmp = bytes[0]; \
2047 bytes[0] = bytes[3]; \
2050 bytes[1] = bytes[2]; \
2056 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2057 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2058 const struct gl_pixelstore_attrib
*unpack
)
2060 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2062 ASSERT(srcType
== GL_BITMAP
||
2063 srcType
== GL_UNSIGNED_BYTE
||
2064 srcType
== GL_BYTE
||
2065 srcType
== GL_UNSIGNED_SHORT
||
2066 srcType
== GL_SHORT
||
2067 srcType
== GL_UNSIGNED_INT
||
2068 srcType
== GL_INT
||
2069 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2070 srcType
== GL_HALF_FLOAT_ARB
||
2071 srcType
== GL_FLOAT
||
2072 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2077 GLubyte
*ubsrc
= (GLubyte
*) src
;
2078 if (unpack
->LsbFirst
) {
2079 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2081 for (i
= 0; i
< n
; i
++) {
2082 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2093 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2095 for (i
= 0; i
< n
; i
++) {
2096 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2108 case GL_UNSIGNED_BYTE
:
2111 const GLubyte
*s
= (const GLubyte
*) src
;
2112 for (i
= 0; i
< n
; i
++)
2119 const GLbyte
*s
= (const GLbyte
*) src
;
2120 for (i
= 0; i
< n
; i
++)
2124 case GL_UNSIGNED_SHORT
:
2127 const GLushort
*s
= (const GLushort
*) src
;
2128 if (unpack
->SwapBytes
) {
2129 for (i
= 0; i
< n
; i
++) {
2130 GLushort value
= s
[i
];
2136 for (i
= 0; i
< n
; i
++)
2144 const GLshort
*s
= (const GLshort
*) src
;
2145 if (unpack
->SwapBytes
) {
2146 for (i
= 0; i
< n
; i
++) {
2147 GLshort value
= s
[i
];
2153 for (i
= 0; i
< n
; i
++)
2158 case GL_UNSIGNED_INT
:
2161 const GLuint
*s
= (const GLuint
*) src
;
2162 if (unpack
->SwapBytes
) {
2163 for (i
= 0; i
< n
; i
++) {
2164 GLuint value
= s
[i
];
2170 for (i
= 0; i
< n
; i
++)
2178 const GLint
*s
= (const GLint
*) src
;
2179 if (unpack
->SwapBytes
) {
2180 for (i
= 0; i
< n
; i
++) {
2187 for (i
= 0; i
< n
; i
++)
2195 const GLfloat
*s
= (const GLfloat
*) src
;
2196 if (unpack
->SwapBytes
) {
2197 for (i
= 0; i
< n
; i
++) {
2198 GLfloat value
= s
[i
];
2200 indexes
[i
] = (GLuint
) value
;
2204 for (i
= 0; i
< n
; i
++)
2205 indexes
[i
] = (GLuint
) s
[i
];
2209 case GL_HALF_FLOAT_ARB
:
2212 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2213 if (unpack
->SwapBytes
) {
2214 for (i
= 0; i
< n
; i
++) {
2215 GLhalfARB value
= s
[i
];
2217 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2221 for (i
= 0; i
< n
; i
++)
2222 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2226 case GL_UNSIGNED_INT_24_8_EXT
:
2229 const GLuint
*s
= (const GLuint
*) src
;
2230 if (unpack
->SwapBytes
) {
2231 for (i
= 0; i
< n
; i
++) {
2232 GLuint value
= s
[i
];
2234 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2238 for (i
= 0; i
< n
; i
++)
2239 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2243 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2246 const GLuint
*s
= (const GLuint
*) src
;
2247 if (unpack
->SwapBytes
) {
2248 for (i
= 0; i
< n
; i
++) {
2249 GLuint value
= s
[i
*2+1];
2251 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2255 for (i
= 0; i
< n
; i
++)
2256 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2262 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2269 * Return source/dest RGBA indexes for unpacking pixels.
2272 get_component_mapping(GLenum format
,
2284 case GL_RED_INTEGER_EXT
:
2286 *gSrc
= *bSrc
= *aSrc
= -1;
2289 case GL_GREEN_INTEGER_EXT
:
2291 *rSrc
= *bSrc
= *aSrc
= -1;
2294 case GL_BLUE_INTEGER_EXT
:
2296 *rSrc
= *gSrc
= *aSrc
= -1;
2299 case GL_ALPHA_INTEGER_EXT
:
2300 *rSrc
= *gSrc
= *bSrc
= -1;
2304 case GL_LUMINANCE_INTEGER_EXT
:
2305 *rSrc
= *gSrc
= *bSrc
= 0;
2308 case GL_LUMINANCE_ALPHA
:
2309 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2310 *rSrc
= *gSrc
= *bSrc
= 0;
2314 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2328 case GL_RGB_INTEGER
:
2339 case GL_BGR_INTEGER
:
2350 case GL_RGBA_INTEGER
:
2361 case GL_BGRA_INTEGER
:
2389 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2390 _mesa_lookup_enum_by_nr(format
));
2398 * This function extracts floating point RGBA values from arbitrary
2399 * image data. srcFormat and srcType are the format and type parameters
2400 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2402 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2403 * implements the "Conversion to floating point", "Conversion to RGB",
2404 * and "Final Expansion to RGBA" operations.
2406 * Args: n - number of pixels
2407 * rgba - output colors
2408 * srcFormat - format of incoming data
2409 * srcType - data type of incoming data
2410 * src - source data pointer
2411 * swapBytes - perform byteswapping of incoming data?
2414 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2415 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2416 GLboolean swapBytes
)
2418 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2420 GLint rDst
, bDst
, gDst
, aDst
;
2421 GLboolean intFormat
;
2422 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2424 ASSERT(srcFormat
== GL_RED
||
2425 srcFormat
== GL_GREEN
||
2426 srcFormat
== GL_BLUE
||
2427 srcFormat
== GL_ALPHA
||
2428 srcFormat
== GL_LUMINANCE
||
2429 srcFormat
== GL_LUMINANCE_ALPHA
||
2430 srcFormat
== GL_INTENSITY
||
2431 srcFormat
== GL_RG
||
2432 srcFormat
== GL_RGB
||
2433 srcFormat
== GL_BGR
||
2434 srcFormat
== GL_RGBA
||
2435 srcFormat
== GL_BGRA
||
2436 srcFormat
== GL_ABGR_EXT
||
2437 srcFormat
== GL_DU8DV8_ATI
||
2438 srcFormat
== GL_DUDV_ATI
||
2439 srcFormat
== GL_RED_INTEGER_EXT
||
2440 srcFormat
== GL_GREEN_INTEGER_EXT
||
2441 srcFormat
== GL_BLUE_INTEGER_EXT
||
2442 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2443 srcFormat
== GL_RG_INTEGER
||
2444 srcFormat
== GL_RGB_INTEGER_EXT
||
2445 srcFormat
== GL_RGBA_INTEGER_EXT
||
2446 srcFormat
== GL_BGR_INTEGER_EXT
||
2447 srcFormat
== GL_BGRA_INTEGER_EXT
||
2448 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2449 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2451 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2452 srcType
== GL_BYTE
||
2453 srcType
== GL_UNSIGNED_SHORT
||
2454 srcType
== GL_SHORT
||
2455 srcType
== GL_UNSIGNED_INT
||
2456 srcType
== GL_INT
||
2457 srcType
== GL_HALF_FLOAT_ARB
||
2458 srcType
== GL_FLOAT
||
2459 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2460 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2461 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2462 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2463 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2464 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2465 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2466 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2467 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2468 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2469 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2470 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2471 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2472 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2474 get_component_mapping(srcFormat
,
2475 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2476 &rDst
, &gDst
, &bDst
, &aDst
);
2478 stride
= _mesa_components_in_format(srcFormat
);
2480 intFormat
= _mesa_is_integer_format(srcFormat
);
2482 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2483 if ((SRC_INDEX) < 0) { \
2486 for (i = 0; i < n; i++) { \
2487 rgba[i][DST_INDEX] = DEFAULT_INT; \
2491 for (i = 0; i < n; i++) { \
2492 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2496 else if (swapBytes) { \
2497 const TYPE *s = (const TYPE *) src; \
2499 for (i = 0; i < n; i++) { \
2500 TYPE value = s[SRC_INDEX]; \
2501 if (sizeof(TYPE) == 2) { \
2504 else if (sizeof(TYPE) == 4) { \
2508 rgba[i][DST_INDEX] = (GLfloat) value; \
2510 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2515 const TYPE *s = (const TYPE *) src; \
2518 for (i = 0; i < n; i++) { \
2519 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2524 for (i = 0; i < n; i++) { \
2525 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2532 case GL_UNSIGNED_BYTE
:
2533 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2534 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2535 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2536 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2539 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2540 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2541 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2542 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2544 case GL_UNSIGNED_SHORT
:
2545 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2546 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2547 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2548 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2551 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2552 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2553 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2554 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2556 case GL_UNSIGNED_INT
:
2557 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2558 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2559 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2560 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2563 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2564 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2565 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2566 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2569 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2570 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2571 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2572 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2574 case GL_HALF_FLOAT_ARB
:
2575 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2576 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2577 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2578 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2580 case GL_UNSIGNED_BYTE_3_3_2
:
2582 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2589 for (i
= 0; i
< n
; i
++) {
2590 GLubyte p
= ubsrc
[i
];
2591 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2592 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2593 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2594 rgba
[i
][aDst
] = 1.0F
;
2598 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2600 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2607 for (i
= 0; i
< n
; i
++) {
2608 GLubyte p
= ubsrc
[i
];
2609 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2610 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2611 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2612 rgba
[i
][aDst
] = 1.0F
;
2616 case GL_UNSIGNED_SHORT_5_6_5
:
2623 const GLushort
*ussrc
= (const GLushort
*) src
;
2625 for (i
= 0; i
< n
; i
++) {
2626 GLushort p
= ussrc
[i
];
2628 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2629 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2630 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2631 rgba
[i
][aDst
] = 1.0F
;
2635 const GLushort
*ussrc
= (const GLushort
*) src
;
2637 for (i
= 0; i
< n
; i
++) {
2638 GLushort p
= ussrc
[i
];
2639 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2640 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2641 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2642 rgba
[i
][aDst
] = 1.0F
;
2646 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2653 const GLushort
*ussrc
= (const GLushort
*) src
;
2655 for (i
= 0; i
< n
; i
++) {
2656 GLushort p
= ussrc
[i
];
2658 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2659 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2660 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2661 rgba
[i
][aDst
] = 1.0F
;
2665 const GLushort
*ussrc
= (const GLushort
*) src
;
2667 for (i
= 0; i
< n
; i
++) {
2668 GLushort p
= ussrc
[i
];
2669 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2670 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2671 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2672 rgba
[i
][aDst
] = 1.0F
;
2676 case GL_UNSIGNED_SHORT_4_4_4_4
:
2678 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2681 const GLushort
*ussrc
= (const GLushort
*) src
;
2683 for (i
= 0; i
< n
; i
++) {
2684 GLushort p
= ussrc
[i
];
2686 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2687 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2688 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2689 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2693 const GLushort
*ussrc
= (const GLushort
*) src
;
2695 for (i
= 0; i
< n
; i
++) {
2696 GLushort p
= ussrc
[i
];
2697 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2698 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2699 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2700 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2704 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2706 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2709 const GLushort
*ussrc
= (const GLushort
*) src
;
2711 for (i
= 0; i
< n
; i
++) {
2712 GLushort p
= ussrc
[i
];
2714 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2715 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2716 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2717 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2721 const GLushort
*ussrc
= (const GLushort
*) src
;
2723 for (i
= 0; i
< n
; i
++) {
2724 GLushort p
= ussrc
[i
];
2725 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2726 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2727 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2728 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2732 case GL_UNSIGNED_SHORT_5_5_5_1
:
2734 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2737 const GLushort
*ussrc
= (const GLushort
*) src
;
2739 for (i
= 0; i
< n
; i
++) {
2740 GLushort p
= ussrc
[i
];
2742 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2743 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2744 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2745 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2749 const GLushort
*ussrc
= (const GLushort
*) src
;
2751 for (i
= 0; i
< n
; i
++) {
2752 GLushort p
= ussrc
[i
];
2753 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2754 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2755 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2756 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2760 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2762 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2765 const GLushort
*ussrc
= (const GLushort
*) src
;
2767 for (i
= 0; i
< n
; i
++) {
2768 GLushort p
= ussrc
[i
];
2770 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2771 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2772 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2773 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2777 const GLushort
*ussrc
= (const GLushort
*) src
;
2779 for (i
= 0; i
< n
; i
++) {
2780 GLushort p
= ussrc
[i
];
2781 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2782 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2783 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2784 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2788 case GL_UNSIGNED_INT_8_8_8_8
:
2790 const GLuint
*uisrc
= (const GLuint
*) src
;
2793 for (i
= 0; i
< n
; i
++) {
2794 GLuint p
= uisrc
[i
];
2795 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2796 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2797 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2798 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2802 for (i
= 0; i
< n
; i
++) {
2803 GLuint p
= uisrc
[i
];
2804 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2805 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2806 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2807 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2812 const GLuint
*uisrc
= (const GLuint
*) src
;
2815 for (i
= 0; i
< n
; i
++) {
2816 GLuint p
= uisrc
[i
];
2817 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2818 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2819 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2820 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2824 for (i
= 0; i
< n
; i
++) {
2825 GLuint p
= uisrc
[i
];
2826 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2827 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2828 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2829 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2834 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2836 const GLuint
*uisrc
= (const GLuint
*) src
;
2839 for (i
= 0; i
< n
; i
++) {
2840 GLuint p
= uisrc
[i
];
2841 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2842 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2843 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2844 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2848 for (i
= 0; i
< n
; i
++) {
2849 GLuint p
= uisrc
[i
];
2850 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2851 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2852 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2853 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2858 const GLuint
*uisrc
= (const GLuint
*) src
;
2861 for (i
= 0; i
< n
; i
++) {
2862 GLuint p
= uisrc
[i
];
2863 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2864 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2865 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2866 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2870 for (i
= 0; i
< n
; i
++) {
2871 GLuint p
= uisrc
[i
];
2872 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2873 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2874 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2875 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2880 case GL_UNSIGNED_INT_10_10_10_2
:
2882 rs
= 1.0F
/ 1023.0F
;
2883 gs
= 1.0F
/ 1023.0F
;
2884 bs
= 1.0F
/ 1023.0F
;
2888 const GLuint
*uisrc
= (const GLuint
*) src
;
2890 for (i
= 0; i
< n
; i
++) {
2891 GLuint p
= uisrc
[i
];
2893 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2894 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2895 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2896 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2900 const GLuint
*uisrc
= (const GLuint
*) src
;
2902 for (i
= 0; i
< n
; i
++) {
2903 GLuint p
= uisrc
[i
];
2904 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2905 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2906 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2907 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2911 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2913 rs
= 1.0F
/ 1023.0F
;
2914 gs
= 1.0F
/ 1023.0F
;
2915 bs
= 1.0F
/ 1023.0F
;
2919 const GLuint
*uisrc
= (const GLuint
*) src
;
2921 for (i
= 0; i
< n
; i
++) {
2922 GLuint p
= uisrc
[i
];
2924 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2925 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2926 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2927 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2931 const GLuint
*uisrc
= (const GLuint
*) src
;
2933 for (i
= 0; i
< n
; i
++) {
2934 GLuint p
= uisrc
[i
];
2935 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2936 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2937 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2938 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2942 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2944 const GLuint
*uisrc
= (const GLuint
*) src
;
2947 for (i
= 0; i
< n
; i
++) {
2948 GLuint p
= uisrc
[i
];
2950 rgb9e5_to_float3(p
, f
);
2951 rgba
[i
][rDst
] = f
[0];
2952 rgba
[i
][gDst
] = f
[1];
2953 rgba
[i
][bDst
] = f
[2];
2954 rgba
[i
][aDst
] = 1.0F
;
2958 const GLuint
*uisrc
= (const GLuint
*) src
;
2961 for (i
= 0; i
< n
; i
++) {
2962 rgb9e5_to_float3(uisrc
[i
], f
);
2963 rgba
[i
][rDst
] = f
[0];
2964 rgba
[i
][gDst
] = f
[1];
2965 rgba
[i
][bDst
] = f
[2];
2966 rgba
[i
][aDst
] = 1.0F
;
2970 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2972 const GLuint
*uisrc
= (const GLuint
*) src
;
2975 for (i
= 0; i
< n
; i
++) {
2976 GLuint p
= uisrc
[i
];
2978 r11g11b10f_to_float3(p
, f
);
2979 rgba
[i
][rDst
] = f
[0];
2980 rgba
[i
][gDst
] = f
[1];
2981 rgba
[i
][bDst
] = f
[2];
2982 rgba
[i
][aDst
] = 1.0F
;
2986 const GLuint
*uisrc
= (const GLuint
*) src
;
2989 for (i
= 0; i
< n
; i
++) {
2990 r11g11b10f_to_float3(uisrc
[i
], f
);
2991 rgba
[i
][rDst
] = f
[0];
2992 rgba
[i
][gDst
] = f
[1];
2993 rgba
[i
][bDst
] = f
[2];
2994 rgba
[i
][aDst
] = 1.0F
;
2999 _mesa_problem(NULL
, "bad srcType in extract float data");
3006 static inline GLuint
3007 clamp_float_to_uint(GLfloat f
)
3009 return f
< 0.0F
? 0 : IROUND(f
);
3013 static inline GLuint
3014 clamp_half_to_uint(GLhalfARB h
)
3016 GLfloat f
= _mesa_half_to_float(h
);
3017 return f
< 0.0F
? 0 : IROUND(f
);
3022 * \sa extract_float_rgba()
3025 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3026 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3027 GLboolean swapBytes
)
3029 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3031 GLint rDst
, bDst
, gDst
, aDst
;
3033 ASSERT(srcFormat
== GL_RED
||
3034 srcFormat
== GL_GREEN
||
3035 srcFormat
== GL_BLUE
||
3036 srcFormat
== GL_ALPHA
||
3037 srcFormat
== GL_LUMINANCE
||
3038 srcFormat
== GL_LUMINANCE_ALPHA
||
3039 srcFormat
== GL_INTENSITY
||
3040 srcFormat
== GL_RG
||
3041 srcFormat
== GL_RGB
||
3042 srcFormat
== GL_BGR
||
3043 srcFormat
== GL_RGBA
||
3044 srcFormat
== GL_BGRA
||
3045 srcFormat
== GL_ABGR_EXT
||
3046 srcFormat
== GL_DU8DV8_ATI
||
3047 srcFormat
== GL_DUDV_ATI
||
3048 srcFormat
== GL_RED_INTEGER_EXT
||
3049 srcFormat
== GL_RG_INTEGER
||
3050 srcFormat
== GL_GREEN_INTEGER_EXT
||
3051 srcFormat
== GL_BLUE_INTEGER_EXT
||
3052 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3053 srcFormat
== GL_RGB_INTEGER_EXT
||
3054 srcFormat
== GL_RGBA_INTEGER_EXT
||
3055 srcFormat
== GL_BGR_INTEGER_EXT
||
3056 srcFormat
== GL_BGRA_INTEGER_EXT
||
3057 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3058 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3060 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3061 srcType
== GL_BYTE
||
3062 srcType
== GL_UNSIGNED_SHORT
||
3063 srcType
== GL_SHORT
||
3064 srcType
== GL_UNSIGNED_INT
||
3065 srcType
== GL_INT
||
3066 srcType
== GL_HALF_FLOAT_ARB
||
3067 srcType
== GL_FLOAT
||
3068 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3069 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3070 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3071 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3072 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3073 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3074 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3075 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3076 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3077 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3078 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3079 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3080 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3081 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3083 get_component_mapping(srcFormat
,
3084 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3085 &rDst
, &gDst
, &bDst
, &aDst
);
3087 stride
= _mesa_components_in_format(srcFormat
);
3089 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3090 if ((SRC_INDEX) < 0) { \
3092 for (i = 0; i < n; i++) { \
3093 rgba[i][DST_INDEX] = DEFAULT; \
3096 else if (swapBytes) { \
3097 const TYPE *s = (const TYPE *) src; \
3099 for (i = 0; i < n; i++) { \
3100 TYPE value = s[SRC_INDEX]; \
3101 if (sizeof(TYPE) == 2) { \
3104 else if (sizeof(TYPE) == 4) { \
3107 rgba[i][DST_INDEX] = CONVERSION(value); \
3112 const TYPE *s = (const TYPE *) src; \
3114 for (i = 0; i < n; i++) { \
3115 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3121 case GL_UNSIGNED_BYTE
:
3122 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3123 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3124 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3125 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3128 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3129 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3130 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3131 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3133 case GL_UNSIGNED_SHORT
:
3134 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3135 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3136 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3137 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3140 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3141 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3142 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3143 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3145 case GL_UNSIGNED_INT
:
3146 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3147 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3148 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3149 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3152 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3153 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3154 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3155 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3158 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3159 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3160 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3161 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3163 case GL_HALF_FLOAT_ARB
:
3164 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3165 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3166 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3167 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3169 case GL_UNSIGNED_BYTE_3_3_2
:
3171 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3173 for (i
= 0; i
< n
; i
++) {
3174 GLubyte p
= ubsrc
[i
];
3175 rgba
[i
][rDst
] = ((p
>> 5) );
3176 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3177 rgba
[i
][bDst
] = ((p
) & 0x3);
3182 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3184 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3186 for (i
= 0; i
< n
; i
++) {
3187 GLubyte p
= ubsrc
[i
];
3188 rgba
[i
][rDst
] = ((p
) & 0x7);
3189 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3190 rgba
[i
][bDst
] = ((p
>> 6) );
3195 case GL_UNSIGNED_SHORT_5_6_5
:
3197 const GLushort
*ussrc
= (const GLushort
*) src
;
3199 for (i
= 0; i
< n
; i
++) {
3200 GLushort p
= ussrc
[i
];
3202 rgba
[i
][rDst
] = ((p
>> 11) );
3203 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3204 rgba
[i
][bDst
] = ((p
) & 0x1f);
3209 const GLushort
*ussrc
= (const GLushort
*) src
;
3211 for (i
= 0; i
< n
; i
++) {
3212 GLushort p
= ussrc
[i
];
3213 rgba
[i
][rDst
] = ((p
>> 11) );
3214 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3215 rgba
[i
][bDst
] = ((p
) & 0x1f);
3220 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3222 const GLushort
*ussrc
= (const GLushort
*) src
;
3224 for (i
= 0; i
< n
; i
++) {
3225 GLushort p
= ussrc
[i
];
3227 rgba
[i
][rDst
] = ((p
) & 0x1f);
3228 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3229 rgba
[i
][bDst
] = ((p
>> 11) );
3234 const GLushort
*ussrc
= (const GLushort
*) src
;
3236 for (i
= 0; i
< n
; i
++) {
3237 GLushort p
= ussrc
[i
];
3238 rgba
[i
][rDst
] = ((p
) & 0x1f);
3239 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3240 rgba
[i
][bDst
] = ((p
>> 11) );
3245 case GL_UNSIGNED_SHORT_4_4_4_4
:
3247 const GLushort
*ussrc
= (const GLushort
*) src
;
3249 for (i
= 0; i
< n
; i
++) {
3250 GLushort p
= ussrc
[i
];
3252 rgba
[i
][rDst
] = ((p
>> 12) );
3253 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3254 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3255 rgba
[i
][aDst
] = ((p
) & 0xf);
3259 const GLushort
*ussrc
= (const GLushort
*) src
;
3261 for (i
= 0; i
< n
; i
++) {
3262 GLushort p
= ussrc
[i
];
3263 rgba
[i
][rDst
] = ((p
>> 12) );
3264 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3265 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3266 rgba
[i
][aDst
] = ((p
) & 0xf);
3270 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3272 const GLushort
*ussrc
= (const GLushort
*) src
;
3274 for (i
= 0; i
< n
; i
++) {
3275 GLushort p
= ussrc
[i
];
3277 rgba
[i
][rDst
] = ((p
) & 0xf);
3278 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3279 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3280 rgba
[i
][aDst
] = ((p
>> 12) );
3284 const GLushort
*ussrc
= (const GLushort
*) src
;
3286 for (i
= 0; i
< n
; i
++) {
3287 GLushort p
= ussrc
[i
];
3288 rgba
[i
][rDst
] = ((p
) & 0xf);
3289 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3290 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3291 rgba
[i
][aDst
] = ((p
>> 12) );
3295 case GL_UNSIGNED_SHORT_5_5_5_1
:
3297 const GLushort
*ussrc
= (const GLushort
*) src
;
3299 for (i
= 0; i
< n
; i
++) {
3300 GLushort p
= ussrc
[i
];
3302 rgba
[i
][rDst
] = ((p
>> 11) );
3303 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3304 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3305 rgba
[i
][aDst
] = ((p
) & 0x1 );
3309 const GLushort
*ussrc
= (const GLushort
*) src
;
3311 for (i
= 0; i
< n
; i
++) {
3312 GLushort p
= ussrc
[i
];
3313 rgba
[i
][rDst
] = ((p
>> 11) );
3314 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3315 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3316 rgba
[i
][aDst
] = ((p
) & 0x1 );
3320 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3322 const GLushort
*ussrc
= (const GLushort
*) src
;
3324 for (i
= 0; i
< n
; i
++) {
3325 GLushort p
= ussrc
[i
];
3327 rgba
[i
][rDst
] = ((p
) & 0x1f);
3328 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3329 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3330 rgba
[i
][aDst
] = ((p
>> 15) );
3334 const GLushort
*ussrc
= (const GLushort
*) src
;
3336 for (i
= 0; i
< n
; i
++) {
3337 GLushort p
= ussrc
[i
];
3338 rgba
[i
][rDst
] = ((p
) & 0x1f);
3339 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3340 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3341 rgba
[i
][aDst
] = ((p
>> 15) );
3345 case GL_UNSIGNED_INT_8_8_8_8
:
3347 const GLuint
*uisrc
= (const GLuint
*) src
;
3349 for (i
= 0; i
< n
; i
++) {
3350 GLuint p
= uisrc
[i
];
3351 rgba
[i
][rDst
] = ((p
) & 0xff);
3352 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3353 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3354 rgba
[i
][aDst
] = ((p
>> 24) );
3358 const GLuint
*uisrc
= (const GLuint
*) src
;
3360 for (i
= 0; i
< n
; i
++) {
3361 GLuint p
= uisrc
[i
];
3362 rgba
[i
][rDst
] = ((p
>> 24) );
3363 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3364 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3365 rgba
[i
][aDst
] = ((p
) & 0xff);
3369 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3371 const GLuint
*uisrc
= (const GLuint
*) src
;
3373 for (i
= 0; i
< n
; i
++) {
3374 GLuint p
= uisrc
[i
];
3375 rgba
[i
][rDst
] = ((p
>> 24) );
3376 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3377 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3378 rgba
[i
][aDst
] = ((p
) & 0xff);
3382 const GLuint
*uisrc
= (const GLuint
*) src
;
3384 for (i
= 0; i
< n
; i
++) {
3385 GLuint p
= uisrc
[i
];
3386 rgba
[i
][rDst
] = ((p
) & 0xff);
3387 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3388 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3389 rgba
[i
][aDst
] = ((p
>> 24) );
3393 case GL_UNSIGNED_INT_10_10_10_2
:
3395 const GLuint
*uisrc
= (const GLuint
*) src
;
3397 for (i
= 0; i
< n
; i
++) {
3398 GLuint p
= uisrc
[i
];
3400 rgba
[i
][rDst
] = ((p
>> 22) );
3401 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3402 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3403 rgba
[i
][aDst
] = ((p
) & 0x3 );
3407 const GLuint
*uisrc
= (const GLuint
*) src
;
3409 for (i
= 0; i
< n
; i
++) {
3410 GLuint p
= uisrc
[i
];
3411 rgba
[i
][rDst
] = ((p
>> 22) );
3412 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3413 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3414 rgba
[i
][aDst
] = ((p
) & 0x3 );
3418 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3420 const GLuint
*uisrc
= (const GLuint
*) src
;
3422 for (i
= 0; i
< n
; i
++) {
3423 GLuint p
= uisrc
[i
];
3425 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3426 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3427 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3428 rgba
[i
][aDst
] = ((p
>> 30) );
3432 const GLuint
*uisrc
= (const GLuint
*) src
;
3434 for (i
= 0; i
< n
; i
++) {
3435 GLuint p
= uisrc
[i
];
3436 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3437 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3438 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3439 rgba
[i
][aDst
] = ((p
>> 30) );
3443 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3445 const GLuint
*uisrc
= (const GLuint
*) src
;
3448 for (i
= 0; i
< n
; i
++) {
3449 GLuint p
= uisrc
[i
];
3451 rgb9e5_to_float3(p
, f
);
3452 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3453 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3454 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3459 const GLuint
*uisrc
= (const GLuint
*) src
;
3462 for (i
= 0; i
< n
; i
++) {
3463 GLuint p
= uisrc
[i
];
3464 rgb9e5_to_float3(p
, f
);
3465 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3466 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3467 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3472 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3474 const GLuint
*uisrc
= (const GLuint
*) src
;
3477 for (i
= 0; i
< n
; i
++) {
3478 GLuint p
= uisrc
[i
];
3480 r11g11b10f_to_float3(p
, f
);
3481 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3482 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3483 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3488 const GLuint
*uisrc
= (const GLuint
*) src
;
3491 for (i
= 0; i
< n
; i
++) {
3492 GLuint p
= uisrc
[i
];
3493 r11g11b10f_to_float3(p
, f
);
3494 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3495 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3496 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3502 _mesa_problem(NULL
, "bad srcType in extract uint data");
3511 * Unpack a row of color image data from a client buffer according to
3512 * the pixel unpacking parameters.
3513 * Return GLubyte values in the specified dest image format.
3514 * This is used by glDrawPixels and glTexImage?D().
3515 * \param ctx - the context
3516 * n - number of pixels in the span
3517 * dstFormat - format of destination color array
3518 * dest - the destination color array
3519 * srcFormat - source image format
3520 * srcType - source image data type
3521 * source - source image pointer
3522 * srcPacking - pixel unpacking parameters
3523 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3525 * XXX perhaps expand this to process whole images someday.
3528 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3529 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3530 GLenum srcFormat
, GLenum srcType
,
3531 const GLvoid
*source
,
3532 const struct gl_pixelstore_attrib
*srcPacking
,
3533 GLbitfield transferOps
)
3535 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3536 ASSERT(dstFormat
== GL_ALPHA
||
3537 dstFormat
== GL_LUMINANCE
||
3538 dstFormat
== GL_LUMINANCE_ALPHA
||
3539 dstFormat
== GL_INTENSITY
||
3540 dstFormat
== GL_RED
||
3541 dstFormat
== GL_RG
||
3542 dstFormat
== GL_RGB
||
3543 dstFormat
== GL_RGBA
);
3545 ASSERT(srcFormat
== GL_RED
||
3546 srcFormat
== GL_GREEN
||
3547 srcFormat
== GL_BLUE
||
3548 srcFormat
== GL_ALPHA
||
3549 srcFormat
== GL_LUMINANCE
||
3550 srcFormat
== GL_LUMINANCE_ALPHA
||
3551 srcFormat
== GL_INTENSITY
||
3552 srcFormat
== GL_RG
||
3553 srcFormat
== GL_RGB
||
3554 srcFormat
== GL_BGR
||
3555 srcFormat
== GL_RGBA
||
3556 srcFormat
== GL_BGRA
||
3557 srcFormat
== GL_ABGR_EXT
||
3558 srcFormat
== GL_COLOR_INDEX
);
3560 ASSERT(srcType
== GL_BITMAP
||
3561 srcType
== GL_UNSIGNED_BYTE
||
3562 srcType
== GL_BYTE
||
3563 srcType
== GL_UNSIGNED_SHORT
||
3564 srcType
== GL_SHORT
||
3565 srcType
== GL_UNSIGNED_INT
||
3566 srcType
== GL_INT
||
3567 srcType
== GL_HALF_FLOAT_ARB
||
3568 srcType
== GL_FLOAT
||
3569 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3570 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3571 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3572 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3573 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3574 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3575 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3576 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3577 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3578 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3579 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3580 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3581 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3582 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3584 /* EXT_texture_integer specifies no transfer ops on integer
3585 * types in the resolved issues section. Just set them to 0
3586 * for integer surfaces.
3591 /* Try simple cases first */
3592 if (transferOps
== 0) {
3593 if (srcType
== GL_UNSIGNED_BYTE
) {
3594 if (dstFormat
== GL_RGBA
) {
3595 if (srcFormat
== GL_RGBA
) {
3596 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3599 else if (srcFormat
== GL_RGB
) {
3601 const GLubyte
*src
= (const GLubyte
*) source
;
3602 GLubyte
*dst
= dest
;
3603 for (i
= 0; i
< n
; i
++) {
3614 else if (dstFormat
== GL_RGB
) {
3615 if (srcFormat
== GL_RGB
) {
3616 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3619 else if (srcFormat
== GL_RGBA
) {
3621 const GLubyte
*src
= (const GLubyte
*) source
;
3622 GLubyte
*dst
= dest
;
3623 for (i
= 0; i
< n
; i
++) {
3633 else if (dstFormat
== srcFormat
) {
3634 GLint comps
= _mesa_components_in_format(srcFormat
);
3636 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3643 /* general solution begins here */
3645 GLint dstComponents
;
3646 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3647 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3650 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3654 dstComponents
= _mesa_components_in_format( dstFormat
);
3655 /* source & dest image formats should have been error checked by now */
3656 assert(dstComponents
> 0);
3659 * Extract image data and convert to RGBA floats
3661 if (srcFormat
== GL_COLOR_INDEX
) {
3662 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3665 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3670 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3673 /* Convert indexes to RGBA */
3674 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3675 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3677 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3679 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3680 * with color indexes.
3682 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3687 /* non-color index data */
3688 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3689 srcPacking
->SwapBytes
);
3692 /* Need to clamp if returning GLubytes */
3693 transferOps
|= IMAGE_CLAMP_BIT
;
3696 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3699 get_component_indexes(dstFormat
,
3700 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3702 /* Now return the GLubyte data in the requested dstFormat */
3704 GLubyte
*dst
= dest
;
3706 for (i
= 0; i
< n
; i
++) {
3707 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3708 dst
+= dstComponents
;
3713 GLubyte
*dst
= dest
;
3715 for (i
= 0; i
< n
; i
++) {
3716 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3717 dst
+= dstComponents
;
3722 GLubyte
*dst
= dest
;
3724 for (i
= 0; i
< n
; i
++) {
3725 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3726 dst
+= dstComponents
;
3731 GLubyte
*dst
= dest
;
3733 for (i
= 0; i
< n
; i
++) {
3734 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3735 dst
+= dstComponents
;
3740 GLubyte
*dst
= dest
;
3743 assert(dstComponents
== 1);
3744 for (i
= 0; i
< n
; i
++) {
3745 /* Intensity comes from red channel */
3746 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3751 GLubyte
*dst
= dest
;
3754 for (i
= 0; i
< n
; i
++) {
3755 /* Luminance comes from red channel */
3756 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3757 dst
+= dstComponents
;
3767 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3768 * instead of GLubyte.
3771 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3772 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3773 GLenum srcFormat
, GLenum srcType
,
3774 const GLvoid
*source
,
3775 const struct gl_pixelstore_attrib
*srcPacking
,
3776 GLbitfield transferOps
)
3778 ASSERT(dstFormat
== GL_ALPHA
||
3779 dstFormat
== GL_LUMINANCE
||
3780 dstFormat
== GL_LUMINANCE_ALPHA
||
3781 dstFormat
== GL_INTENSITY
||
3782 dstFormat
== GL_RED
||
3783 dstFormat
== GL_RG
||
3784 dstFormat
== GL_RGB
||
3785 dstFormat
== GL_RGBA
);
3787 ASSERT(srcFormat
== GL_RED
||
3788 srcFormat
== GL_GREEN
||
3789 srcFormat
== GL_BLUE
||
3790 srcFormat
== GL_ALPHA
||
3791 srcFormat
== GL_LUMINANCE
||
3792 srcFormat
== GL_LUMINANCE_ALPHA
||
3793 srcFormat
== GL_INTENSITY
||
3794 srcFormat
== GL_RG
||
3795 srcFormat
== GL_RGB
||
3796 srcFormat
== GL_BGR
||
3797 srcFormat
== GL_RGBA
||
3798 srcFormat
== GL_BGRA
||
3799 srcFormat
== GL_ABGR_EXT
||
3800 srcFormat
== GL_RED_INTEGER_EXT
||
3801 srcFormat
== GL_GREEN_INTEGER_EXT
||
3802 srcFormat
== GL_BLUE_INTEGER_EXT
||
3803 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3804 srcFormat
== GL_RG_INTEGER
||
3805 srcFormat
== GL_RGB_INTEGER_EXT
||
3806 srcFormat
== GL_RGBA_INTEGER_EXT
||
3807 srcFormat
== GL_BGR_INTEGER_EXT
||
3808 srcFormat
== GL_BGRA_INTEGER_EXT
||
3809 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3810 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3811 srcFormat
== GL_COLOR_INDEX
);
3813 ASSERT(srcType
== GL_BITMAP
||
3814 srcType
== GL_UNSIGNED_BYTE
||
3815 srcType
== GL_BYTE
||
3816 srcType
== GL_UNSIGNED_SHORT
||
3817 srcType
== GL_SHORT
||
3818 srcType
== GL_UNSIGNED_INT
||
3819 srcType
== GL_INT
||
3820 srcType
== GL_HALF_FLOAT_ARB
||
3821 srcType
== GL_FLOAT
||
3822 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3823 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3824 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3825 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3826 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3827 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3828 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3829 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3830 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3831 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3832 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3833 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3834 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3835 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3837 /* general solution, no special cases, yet */
3839 GLint dstComponents
;
3840 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3841 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3842 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3845 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3849 dstComponents
= _mesa_components_in_format( dstFormat
);
3850 /* source & dest image formats should have been error checked by now */
3851 assert(dstComponents
> 0);
3853 /* EXT_texture_integer specifies no transfer ops on integer
3854 * types in the resolved issues section. Just set them to 0
3855 * for integer surfaces.
3861 * Extract image data and convert to RGBA floats
3863 if (srcFormat
== GL_COLOR_INDEX
) {
3864 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3867 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3872 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3875 /* Convert indexes to RGBA */
3876 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3877 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3879 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3881 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3882 * with color indexes.
3884 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3889 /* non-color index data */
3890 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3891 srcPacking
->SwapBytes
);
3895 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3898 get_component_indexes(dstFormat
,
3899 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3901 /* Now pack results in the requested dstFormat */
3903 GLfloat
*dst
= dest
;
3905 for (i
= 0; i
< n
; i
++) {
3906 dst
[rDst
] = rgba
[i
][RCOMP
];
3907 dst
+= dstComponents
;
3912 GLfloat
*dst
= dest
;
3914 for (i
= 0; i
< n
; i
++) {
3915 dst
[gDst
] = rgba
[i
][GCOMP
];
3916 dst
+= dstComponents
;
3921 GLfloat
*dst
= dest
;
3923 for (i
= 0; i
< n
; i
++) {
3924 dst
[bDst
] = rgba
[i
][BCOMP
];
3925 dst
+= dstComponents
;
3930 GLfloat
*dst
= dest
;
3932 for (i
= 0; i
< n
; i
++) {
3933 dst
[aDst
] = rgba
[i
][ACOMP
];
3934 dst
+= dstComponents
;
3939 GLfloat
*dst
= dest
;
3942 assert(dstComponents
== 1);
3943 for (i
= 0; i
< n
; i
++) {
3944 /* Intensity comes from red channel */
3945 dst
[i
] = rgba
[i
][RCOMP
];
3950 GLfloat
*dst
= dest
;
3953 for (i
= 0; i
< n
; i
++) {
3954 /* Luminance comes from red channel */
3955 dst
[0] = rgba
[i
][RCOMP
];
3956 dst
+= dstComponents
;
3966 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3967 * instead of GLubyte.
3968 * No pixel transfer ops are applied.
3971 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3972 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3973 GLenum srcFormat
, GLenum srcType
,
3974 const GLvoid
*source
,
3975 const struct gl_pixelstore_attrib
*srcPacking
)
3977 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3980 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3984 ASSERT(dstFormat
== GL_ALPHA
||
3985 dstFormat
== GL_LUMINANCE
||
3986 dstFormat
== GL_LUMINANCE_ALPHA
||
3987 dstFormat
== GL_INTENSITY
||
3988 dstFormat
== GL_RED
||
3989 dstFormat
== GL_RG
||
3990 dstFormat
== GL_RGB
||
3991 dstFormat
== GL_RGBA
);
3993 ASSERT(srcFormat
== GL_RED
||
3994 srcFormat
== GL_GREEN
||
3995 srcFormat
== GL_BLUE
||
3996 srcFormat
== GL_ALPHA
||
3997 srcFormat
== GL_LUMINANCE
||
3998 srcFormat
== GL_LUMINANCE_ALPHA
||
3999 srcFormat
== GL_INTENSITY
||
4000 srcFormat
== GL_RG
||
4001 srcFormat
== GL_RGB
||
4002 srcFormat
== GL_BGR
||
4003 srcFormat
== GL_RGBA
||
4004 srcFormat
== GL_BGRA
||
4005 srcFormat
== GL_ABGR_EXT
||
4006 srcFormat
== GL_RED_INTEGER_EXT
||
4007 srcFormat
== GL_GREEN_INTEGER_EXT
||
4008 srcFormat
== GL_BLUE_INTEGER_EXT
||
4009 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4010 srcFormat
== GL_RG_INTEGER
||
4011 srcFormat
== GL_RGB_INTEGER_EXT
||
4012 srcFormat
== GL_RGBA_INTEGER_EXT
||
4013 srcFormat
== GL_BGR_INTEGER_EXT
||
4014 srcFormat
== GL_BGRA_INTEGER_EXT
||
4015 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4016 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4018 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4019 srcType
== GL_BYTE
||
4020 srcType
== GL_UNSIGNED_SHORT
||
4021 srcType
== GL_SHORT
||
4022 srcType
== GL_UNSIGNED_INT
||
4023 srcType
== GL_INT
||
4024 srcType
== GL_HALF_FLOAT_ARB
||
4025 srcType
== GL_FLOAT
||
4026 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4027 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4028 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4029 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4030 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4031 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4032 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4033 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4034 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4035 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4036 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4037 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4038 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4039 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4042 /* Extract image data as uint[4] pixels */
4043 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4044 srcPacking
->SwapBytes
);
4046 if (dstFormat
== GL_RGBA
) {
4048 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4052 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4053 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4055 assert(dstComponents
> 0);
4057 get_component_indexes(dstFormat
,
4058 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4060 /* Now pack values in the requested dest format */
4064 for (i
= 0; i
< n
; i
++) {
4065 dst
[rDst
] = rgba
[i
][RCOMP
];
4066 dst
+= dstComponents
;
4073 for (i
= 0; i
< n
; i
++) {
4074 dst
[gDst
] = rgba
[i
][GCOMP
];
4075 dst
+= dstComponents
;
4082 for (i
= 0; i
< n
; i
++) {
4083 dst
[bDst
] = rgba
[i
][BCOMP
];
4084 dst
+= dstComponents
;
4091 for (i
= 0; i
< n
; i
++) {
4092 dst
[aDst
] = rgba
[i
][ACOMP
];
4093 dst
+= dstComponents
;
4101 assert(dstComponents
== 1);
4102 for (i
= 0; i
< n
; i
++) {
4103 /* Intensity comes from red channel */
4104 dst
[i
] = rgba
[i
][RCOMP
];
4112 for (i
= 0; i
< n
; i
++) {
4113 /* Luminance comes from red channel */
4114 dst
[0] = rgba
[i
][RCOMP
];
4115 dst
+= dstComponents
;
4126 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4127 * directly return GLbyte data, no transfer ops apply.
4130 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4131 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4132 GLenum srcFormat
, GLenum srcType
,
4133 const GLvoid
*source
,
4134 const struct gl_pixelstore_attrib
*srcPacking
,
4135 GLbitfield transferOps
)
4137 ASSERT(dstFormat
== GL_DUDV_ATI
);
4138 ASSERT(srcFormat
== GL_DUDV_ATI
||
4139 srcFormat
== GL_DU8DV8_ATI
);
4141 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4142 srcType
== GL_BYTE
||
4143 srcType
== GL_UNSIGNED_SHORT
||
4144 srcType
== GL_SHORT
||
4145 srcType
== GL_UNSIGNED_INT
||
4146 srcType
== GL_INT
||
4147 srcType
== GL_HALF_FLOAT_ARB
||
4148 srcType
== GL_FLOAT
);
4150 /* general solution */
4152 GLint dstComponents
;
4155 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4158 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4162 dstComponents
= _mesa_components_in_format( dstFormat
);
4163 /* source & dest image formats should have been error checked by now */
4164 assert(dstComponents
> 0);
4167 * Extract image data and convert to RGBA floats
4169 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4170 srcPacking
->SwapBytes
);
4173 /* Now determine which color channels we need to produce.
4174 * And determine the dest index (offset) within each color tuple.
4177 /* Now pack results in the requested dstFormat */
4178 for (i
= 0; i
< n
; i
++) {
4179 /* not sure - need clamp[-1,1] here? */
4180 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4181 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4182 dst
+= dstComponents
;
4190 * Unpack a row of color index data from a client buffer according to
4191 * the pixel unpacking parameters.
4192 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4194 * Args: ctx - the context
4195 * n - number of pixels
4196 * dstType - destination data type
4197 * dest - destination array
4198 * srcType - source pixel type
4199 * source - source data pointer
4200 * srcPacking - pixel unpacking parameters
4201 * transferOps - the pixel transfer operations to apply
4204 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4205 GLenum dstType
, GLvoid
*dest
,
4206 GLenum srcType
, const GLvoid
*source
,
4207 const struct gl_pixelstore_attrib
*srcPacking
,
4208 GLbitfield transferOps
)
4210 ASSERT(srcType
== GL_BITMAP
||
4211 srcType
== GL_UNSIGNED_BYTE
||
4212 srcType
== GL_BYTE
||
4213 srcType
== GL_UNSIGNED_SHORT
||
4214 srcType
== GL_SHORT
||
4215 srcType
== GL_UNSIGNED_INT
||
4216 srcType
== GL_INT
||
4217 srcType
== GL_HALF_FLOAT_ARB
||
4218 srcType
== GL_FLOAT
);
4220 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4221 dstType
== GL_UNSIGNED_SHORT
||
4222 dstType
== GL_UNSIGNED_INT
);
4225 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4228 * Try simple cases first
4230 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4231 && dstType
== GL_UNSIGNED_BYTE
) {
4232 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4234 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4235 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4236 memcpy(dest
, source
, n
* sizeof(GLuint
));
4242 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4245 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4249 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4253 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4255 /* convert to dest type */
4257 case GL_UNSIGNED_BYTE
:
4259 GLubyte
*dst
= (GLubyte
*) dest
;
4261 for (i
= 0; i
< n
; i
++) {
4262 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4266 case GL_UNSIGNED_SHORT
:
4268 GLuint
*dst
= (GLuint
*) dest
;
4270 for (i
= 0; i
< n
; i
++) {
4271 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4275 case GL_UNSIGNED_INT
:
4276 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4279 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4288 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4289 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4290 const struct gl_pixelstore_attrib
*dstPacking
,
4291 GLbitfield transferOps
)
4293 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4296 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4300 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4302 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4303 /* make a copy of input */
4304 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4305 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4310 case GL_UNSIGNED_BYTE
:
4312 GLubyte
*dst
= (GLubyte
*) dest
;
4314 for (i
= 0; i
< n
; i
++) {
4315 *dst
++ = (GLubyte
) source
[i
];
4321 GLbyte
*dst
= (GLbyte
*) dest
;
4323 for (i
= 0; i
< n
; i
++) {
4324 dst
[i
] = (GLbyte
) source
[i
];
4328 case GL_UNSIGNED_SHORT
:
4330 GLushort
*dst
= (GLushort
*) dest
;
4332 for (i
= 0; i
< n
; i
++) {
4333 dst
[i
] = (GLushort
) source
[i
];
4335 if (dstPacking
->SwapBytes
) {
4336 _mesa_swap2( (GLushort
*) dst
, n
);
4342 GLshort
*dst
= (GLshort
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLshort
) source
[i
];
4347 if (dstPacking
->SwapBytes
) {
4348 _mesa_swap2( (GLushort
*) dst
, n
);
4352 case GL_UNSIGNED_INT
:
4354 GLuint
*dst
= (GLuint
*) dest
;
4356 for (i
= 0; i
< n
; i
++) {
4357 dst
[i
] = (GLuint
) source
[i
];
4359 if (dstPacking
->SwapBytes
) {
4360 _mesa_swap4( (GLuint
*) dst
, n
);
4366 GLint
*dst
= (GLint
*) dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 dst
[i
] = (GLint
) source
[i
];
4371 if (dstPacking
->SwapBytes
) {
4372 _mesa_swap4( (GLuint
*) dst
, n
);
4378 GLfloat
*dst
= (GLfloat
*) dest
;
4380 for (i
= 0; i
< n
; i
++) {
4381 dst
[i
] = (GLfloat
) source
[i
];
4383 if (dstPacking
->SwapBytes
) {
4384 _mesa_swap4( (GLuint
*) dst
, n
);
4388 case GL_HALF_FLOAT_ARB
:
4390 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4392 for (i
= 0; i
< n
; i
++) {
4393 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4395 if (dstPacking
->SwapBytes
) {
4396 _mesa_swap2( (GLushort
*) dst
, n
);
4401 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4409 * Unpack a row of stencil data from a client buffer according to
4410 * the pixel unpacking parameters.
4411 * This is (or will be) used by glDrawPixels
4413 * Args: ctx - the context
4414 * n - number of pixels
4415 * dstType - destination data type
4416 * dest - destination array
4417 * srcType - source pixel type
4418 * source - source data pointer
4419 * srcPacking - pixel unpacking parameters
4420 * transferOps - apply offset/bias/lookup ops?
4423 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4424 GLenum dstType
, GLvoid
*dest
,
4425 GLenum srcType
, const GLvoid
*source
,
4426 const struct gl_pixelstore_attrib
*srcPacking
,
4427 GLbitfield transferOps
)
4429 ASSERT(srcType
== GL_BITMAP
||
4430 srcType
== GL_UNSIGNED_BYTE
||
4431 srcType
== GL_BYTE
||
4432 srcType
== GL_UNSIGNED_SHORT
||
4433 srcType
== GL_SHORT
||
4434 srcType
== GL_UNSIGNED_INT
||
4435 srcType
== GL_INT
||
4436 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4437 srcType
== GL_HALF_FLOAT_ARB
||
4438 srcType
== GL_FLOAT
||
4439 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4441 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4442 dstType
== GL_UNSIGNED_SHORT
||
4443 dstType
== GL_UNSIGNED_INT
||
4444 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4446 /* only shift and offset apply to stencil */
4447 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4450 * Try simple cases first
4452 if (transferOps
== 0 &&
4453 !ctx
->Pixel
.MapStencilFlag
&&
4454 srcType
== GL_UNSIGNED_BYTE
&&
4455 dstType
== GL_UNSIGNED_BYTE
) {
4456 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4458 else if (transferOps
== 0 &&
4459 !ctx
->Pixel
.MapStencilFlag
&&
4460 srcType
== GL_UNSIGNED_INT
&&
4461 dstType
== GL_UNSIGNED_INT
&&
4462 !srcPacking
->SwapBytes
) {
4463 memcpy(dest
, source
, n
* sizeof(GLuint
));
4469 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4472 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4476 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4479 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4480 /* shift and offset indexes */
4481 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4484 if (ctx
->Pixel
.MapStencilFlag
) {
4485 /* Apply stencil lookup table */
4486 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4488 for (i
= 0; i
< n
; i
++) {
4489 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4493 /* convert to dest type */
4495 case GL_UNSIGNED_BYTE
:
4497 GLubyte
*dst
= (GLubyte
*) dest
;
4499 for (i
= 0; i
< n
; i
++) {
4500 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4504 case GL_UNSIGNED_SHORT
:
4506 GLuint
*dst
= (GLuint
*) dest
;
4508 for (i
= 0; i
< n
; i
++) {
4509 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4513 case GL_UNSIGNED_INT
:
4514 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4516 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4518 GLuint
*dst
= (GLuint
*) dest
;
4520 for (i
= 0; i
< n
; i
++) {
4521 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4526 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4535 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4536 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4537 const struct gl_pixelstore_attrib
*dstPacking
)
4539 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4542 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4546 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4547 ctx
->Pixel
.MapStencilFlag
) {
4548 /* make a copy of input */
4549 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4550 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4555 case GL_UNSIGNED_BYTE
:
4556 memcpy(dest
, source
, n
);
4560 GLbyte
*dst
= (GLbyte
*) dest
;
4563 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4567 case GL_UNSIGNED_SHORT
:
4569 GLushort
*dst
= (GLushort
*) dest
;
4572 dst
[i
] = (GLushort
) source
[i
];
4574 if (dstPacking
->SwapBytes
) {
4575 _mesa_swap2( (GLushort
*) dst
, n
);
4581 GLshort
*dst
= (GLshort
*) dest
;
4584 dst
[i
] = (GLshort
) source
[i
];
4586 if (dstPacking
->SwapBytes
) {
4587 _mesa_swap2( (GLushort
*) dst
, n
);
4591 case GL_UNSIGNED_INT
:
4593 GLuint
*dst
= (GLuint
*) dest
;
4596 dst
[i
] = (GLuint
) source
[i
];
4598 if (dstPacking
->SwapBytes
) {
4599 _mesa_swap4( (GLuint
*) dst
, n
);
4605 GLint
*dst
= (GLint
*) dest
;
4608 dst
[i
] = (GLint
) source
[i
];
4610 if (dstPacking
->SwapBytes
) {
4611 _mesa_swap4( (GLuint
*) dst
, n
);
4617 GLfloat
*dst
= (GLfloat
*) dest
;
4620 dst
[i
] = (GLfloat
) source
[i
];
4622 if (dstPacking
->SwapBytes
) {
4623 _mesa_swap4( (GLuint
*) dst
, n
);
4627 case GL_HALF_FLOAT_ARB
:
4629 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4632 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4634 if (dstPacking
->SwapBytes
) {
4635 _mesa_swap2( (GLushort
*) dst
, n
);
4640 if (dstPacking
->LsbFirst
) {
4641 GLubyte
*dst
= (GLubyte
*) dest
;
4644 for (i
= 0; i
< n
; i
++) {
4647 *dst
|= ((source
[i
] != 0) << shift
);
4656 GLubyte
*dst
= (GLubyte
*) dest
;
4659 for (i
= 0; i
< n
; i
++) {
4662 *dst
|= ((source
[i
] != 0) << shift
);
4672 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4678 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4681 const GLTYPE *src = (const GLTYPE *)source; \
4682 for (i = 0; i < n; i++) { \
4683 GLTYPE value = src[i]; \
4684 if (srcPacking->SwapBytes) { \
4685 if (sizeof(GLTYPE) == 2) { \
4687 } else if (sizeof(GLTYPE) == 4) { \
4691 depthValues[i] = GLTYPE2FLOAT(value); \
4697 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4698 * or GLfloat values.
4699 * The glPixelTransfer (scale/bias) params will be applied.
4701 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4702 * \param depthMax max value for returned GLushort or GLuint values
4703 * (ignored for GLfloat).
4706 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4707 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4708 GLenum srcType
, const GLvoid
*source
,
4709 const struct gl_pixelstore_attrib
*srcPacking
)
4711 GLfloat
*depthTemp
= NULL
, *depthValues
;
4712 GLboolean needClamp
= GL_FALSE
;
4714 /* Look for special cases first.
4715 * Not only are these faster, they're less prone to numeric conversion
4716 * problems. Otherwise, converting from an int type to a float then
4717 * back to an int type can introduce errors that will show up as
4718 * artifacts in things like depth peeling which uses glCopyTexImage.
4720 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4721 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4722 const GLuint
*src
= (const GLuint
*) source
;
4723 GLushort
*dst
= (GLushort
*) dest
;
4725 for (i
= 0; i
< n
; i
++) {
4726 dst
[i
] = src
[i
] >> 16;
4730 if (srcType
== GL_UNSIGNED_SHORT
4731 && dstType
== GL_UNSIGNED_INT
4732 && depthMax
== 0xffffffff) {
4733 const GLushort
*src
= (const GLushort
*) source
;
4734 GLuint
*dst
= (GLuint
*) dest
;
4736 for (i
= 0; i
< n
; i
++) {
4737 dst
[i
] = src
[i
] | (src
[i
] << 16);
4741 if (srcType
== GL_UNSIGNED_INT_24_8
4742 && dstType
== GL_UNSIGNED_INT
4743 && depthMax
== 0xffffff) {
4744 const GLuint
*src
= (const GLuint
*) source
;
4745 GLuint
*dst
= (GLuint
*) dest
;
4747 for (i
= 0; i
< n
; i
++) {
4748 dst
[i
] = src
[i
] >> 8;
4752 /* XXX may want to add additional cases here someday */
4755 /* general case path follows */
4757 if (dstType
== GL_FLOAT
) {
4758 depthValues
= (GLfloat
*) dest
;
4761 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4763 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4767 depthValues
= depthTemp
;
4770 /* Convert incoming values to GLfloat. Some conversions will require
4775 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4776 needClamp
= GL_TRUE
;
4778 case GL_UNSIGNED_BYTE
:
4779 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4782 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4783 needClamp
= GL_TRUE
;
4785 case GL_UNSIGNED_SHORT
:
4786 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4789 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4790 needClamp
= GL_TRUE
;
4792 case GL_UNSIGNED_INT
:
4793 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4795 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4796 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4797 depthMax
== 0xffffff &&
4798 ctx
->Pixel
.DepthScale
== 1.0 &&
4799 ctx
->Pixel
.DepthBias
== 0.0) {
4800 const GLuint
*src
= (const GLuint
*) source
;
4801 GLuint
*zValues
= (GLuint
*) dest
;
4803 for (i
= 0; i
< n
; i
++) {
4804 GLuint value
= src
[i
];
4805 if (srcPacking
->SwapBytes
) {
4808 zValues
[i
] = value
& 0xffffff00;
4814 const GLuint
*src
= (const GLuint
*) source
;
4815 const GLfloat scale
= 1.0f
/ 0xffffff;
4817 for (i
= 0; i
< n
; i
++) {
4818 GLuint value
= src
[i
];
4819 if (srcPacking
->SwapBytes
) {
4822 depthValues
[i
] = (value
>> 8) * scale
;
4826 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4829 const GLfloat
*src
= (const GLfloat
*)source
;
4830 for (i
= 0; i
< n
; i
++) {
4831 GLfloat value
= src
[i
* 2];
4832 if (srcPacking
->SwapBytes
) {
4835 depthValues
[i
] = value
;
4837 needClamp
= GL_TRUE
;
4841 DEPTH_VALUES(GLfloat
, 1*);
4842 needClamp
= GL_TRUE
;
4844 case GL_HALF_FLOAT_ARB
:
4847 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4848 for (i
= 0; i
< n
; i
++) {
4849 GLhalfARB value
= src
[i
];
4850 if (srcPacking
->SwapBytes
) {
4853 depthValues
[i
] = _mesa_half_to_float(value
);
4855 needClamp
= GL_TRUE
;
4859 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4864 /* apply depth scale and bias */
4866 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4867 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4868 if (scale
!= 1.0 || bias
!= 0.0) {
4870 for (i
= 0; i
< n
; i
++) {
4871 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4873 needClamp
= GL_TRUE
;
4877 /* clamp to [0, 1] */
4880 for (i
= 0; i
< n
; i
++) {
4881 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4886 * Convert values to dstType
4888 if (dstType
== GL_UNSIGNED_INT
) {
4889 GLuint
*zValues
= (GLuint
*) dest
;
4891 if (depthMax
<= 0xffffff) {
4892 /* no overflow worries */
4893 for (i
= 0; i
< n
; i
++) {
4894 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4898 /* need to use double precision to prevent overflow problems */
4899 for (i
= 0; i
< n
; i
++) {
4900 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4901 if (z
>= (GLdouble
) 0xffffffff)
4902 zValues
[i
] = 0xffffffff;
4904 zValues
[i
] = (GLuint
) z
;
4908 else if (dstType
== GL_UNSIGNED_SHORT
) {
4909 GLushort
*zValues
= (GLushort
*) dest
;
4911 ASSERT(depthMax
<= 0xffff);
4912 for (i
= 0; i
< n
; i
++) {
4913 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4916 else if (dstType
== GL_FLOAT
) {
4917 /* Nothing to do. depthValues is pointing to dest. */
4919 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4920 GLfloat
*zValues
= (GLfloat
*) dest
;
4922 for (i
= 0; i
< n
; i
++) {
4923 zValues
[i
*2] = depthValues
[i
];
4935 * Pack an array of depth values. The values are floats in [0,1].
4938 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4939 GLenum dstType
, const GLfloat
*depthSpan
,
4940 const struct gl_pixelstore_attrib
*dstPacking
)
4942 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4944 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4948 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4949 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4950 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4951 depthSpan
= depthCopy
;
4955 case GL_UNSIGNED_BYTE
:
4957 GLubyte
*dst
= (GLubyte
*) dest
;
4959 for (i
= 0; i
< n
; i
++) {
4960 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4966 GLbyte
*dst
= (GLbyte
*) dest
;
4968 for (i
= 0; i
< n
; i
++) {
4969 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4973 case GL_UNSIGNED_SHORT
:
4975 GLushort
*dst
= (GLushort
*) dest
;
4977 for (i
= 0; i
< n
; i
++) {
4978 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4980 if (dstPacking
->SwapBytes
) {
4981 _mesa_swap2( (GLushort
*) dst
, n
);
4987 GLshort
*dst
= (GLshort
*) dest
;
4989 for (i
= 0; i
< n
; i
++) {
4990 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4992 if (dstPacking
->SwapBytes
) {
4993 _mesa_swap2( (GLushort
*) dst
, n
);
4997 case GL_UNSIGNED_INT
:
4999 GLuint
*dst
= (GLuint
*) dest
;
5001 for (i
= 0; i
< n
; i
++) {
5002 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5004 if (dstPacking
->SwapBytes
) {
5005 _mesa_swap4( (GLuint
*) dst
, n
);
5011 GLint
*dst
= (GLint
*) dest
;
5013 for (i
= 0; i
< n
; i
++) {
5014 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5016 if (dstPacking
->SwapBytes
) {
5017 _mesa_swap4( (GLuint
*) dst
, n
);
5023 GLfloat
*dst
= (GLfloat
*) dest
;
5025 for (i
= 0; i
< n
; i
++) {
5026 dst
[i
] = depthSpan
[i
];
5028 if (dstPacking
->SwapBytes
) {
5029 _mesa_swap4( (GLuint
*) dst
, n
);
5033 case GL_HALF_FLOAT_ARB
:
5035 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5037 for (i
= 0; i
< n
; i
++) {
5038 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5040 if (dstPacking
->SwapBytes
) {
5041 _mesa_swap2( (GLushort
*) dst
, n
);
5046 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5055 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5058 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5059 GLenum dstType
, GLuint
*dest
,
5060 const GLfloat
*depthVals
,
5061 const GLubyte
*stencilVals
,
5062 const struct gl_pixelstore_attrib
*dstPacking
)
5064 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5065 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5068 if (!depthCopy
|| !stencilCopy
) {
5069 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5075 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5076 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5077 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5078 depthVals
= depthCopy
;
5081 if (ctx
->Pixel
.IndexShift
||
5082 ctx
->Pixel
.IndexOffset
||
5083 ctx
->Pixel
.MapStencilFlag
) {
5084 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5085 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5086 stencilVals
= stencilCopy
;
5090 case GL_UNSIGNED_INT_24_8
:
5091 for (i
= 0; i
< n
; i
++) {
5092 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5093 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5096 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5097 for (i
= 0; i
< n
; i
++) {
5098 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5099 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5104 if (dstPacking
->SwapBytes
) {
5105 _mesa_swap4(dest
, n
);
5116 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5117 * Return all image data in a contiguous block. This is used when we
5118 * compile glDrawPixels, glTexImage, etc into a display list. We
5119 * need a copy of the data in a standard format.
5122 _mesa_unpack_image( GLuint dimensions
,
5123 GLsizei width
, GLsizei height
, GLsizei depth
,
5124 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5125 const struct gl_pixelstore_attrib
*unpack
)
5127 GLint bytesPerRow
, compsPerRow
;
5128 GLboolean flipBytes
, swap2
, swap4
;
5131 return NULL
; /* not necessarily an error */
5133 if (width
<= 0 || height
<= 0 || depth
<= 0)
5134 return NULL
; /* generate error later */
5136 if (type
== GL_BITMAP
) {
5137 bytesPerRow
= (width
+ 7) >> 3;
5138 flipBytes
= unpack
->LsbFirst
;
5139 swap2
= swap4
= GL_FALSE
;
5143 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5144 GLint components
= _mesa_components_in_format(format
);
5147 if (_mesa_type_is_packed(type
))
5150 if (bytesPerPixel
<= 0 || components
<= 0)
5151 return NULL
; /* bad format or type. generate error later */
5152 bytesPerRow
= bytesPerPixel
* width
;
5153 bytesPerComp
= bytesPerPixel
/ components
;
5154 flipBytes
= GL_FALSE
;
5155 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5156 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5157 compsPerRow
= components
* width
;
5158 assert(compsPerRow
>= width
);
5163 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5167 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5170 for (img
= 0; img
< depth
; img
++) {
5171 for (row
= 0; row
< height
; row
++) {
5172 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5173 width
, height
, format
, type
, img
, row
, 0);
5175 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5177 flipBytes
= GL_FALSE
;
5178 if (unpack
->LsbFirst
) {
5179 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5180 GLubyte dstMask
= 128;
5181 const GLubyte
*s
= src
;
5184 for (i
= 0; i
< width
; i
++) {
5188 if (srcMask
== 128) {
5193 srcMask
= srcMask
<< 1;
5201 dstMask
= dstMask
>> 1;
5206 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5207 GLubyte dstMask
= 128;
5208 const GLubyte
*s
= src
;
5211 for (i
= 0; i
< width
; i
++) {
5220 srcMask
= srcMask
>> 1;
5228 dstMask
= dstMask
>> 1;
5234 memcpy(dst
, src
, bytesPerRow
);
5237 /* byte flipping/swapping */
5239 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5242 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5245 _mesa_swap4((GLuint
*) dst
, compsPerRow
);