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
:
452 * integer packing , no transfer operations only packs
453 * to dst of GL_UNSIGNED_INT or GL_INT
456 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
457 GLenum dstFormat
, GLenum dstType
,
463 case GL_UNSIGNED_INT
: {
464 GLuint
*dst
= (GLuint
*) dstAddr
;
466 case GL_RED_INTEGER_EXT
:
467 case GL_GREEN_INTEGER_EXT
:
468 case GL_BLUE_INTEGER_EXT
:
469 case GL_ALPHA_INTEGER_EXT
:
470 case GL_RGB_INTEGER_EXT
:
471 case GL_RGBA_INTEGER_EXT
:
472 case GL_BGR_INTEGER_EXT
:
473 case GL_BGRA_INTEGER_EXT
:
474 case GL_LUMINANCE_INTEGER_EXT
:
475 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
477 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
478 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
479 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
480 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
487 GLint
*dst
= (GLint
*) dstAddr
;
489 case GL_RED_INTEGER_EXT
:
490 case GL_GREEN_INTEGER_EXT
:
491 case GL_BLUE_INTEGER_EXT
:
492 case GL_ALPHA_INTEGER_EXT
:
493 case GL_RGB_INTEGER_EXT
:
494 case GL_RGBA_INTEGER_EXT
:
495 case GL_BGR_INTEGER_EXT
:
496 case GL_BGRA_INTEGER_EXT
:
497 case GL_LUMINANCE_INTEGER_EXT
:
498 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
500 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
501 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
502 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
503 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
517 * Used to pack an array [][4] of RGBA float colors as specified
518 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
519 * Historically, the RGBA values were in [0,1] and rescaled to fit
520 * into GLubytes, etc. But with new integer formats, the RGBA values
521 * may have any value and we don't always rescale when converting to
524 * Note: the rgba values will be modified by this function when any pixel
525 * transfer ops are enabled.
528 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
529 GLenum dstFormat
, GLenum dstType
,
531 const struct gl_pixelstore_attrib
*dstPacking
,
532 GLbitfield transferOps
)
535 const GLint comps
= _mesa_components_in_format(dstFormat
);
536 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
539 if (dstFormat
== GL_LUMINANCE
||
540 dstFormat
== GL_LUMINANCE_ALPHA
||
541 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
542 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
543 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
545 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
553 /* EXT_texture_integer specifies no transfer ops on integer
554 * types in the resolved issues section. Just set them to 0
555 * for integer surfaces.
561 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
565 * Component clamping (besides clamping to [0,1] in
566 * _mesa_apply_rgba_transfer_ops()).
569 /* clamping to dest type's min/max values */
571 if (get_type_min_max(dstType
, &min
, &max
)) {
572 for (i
= 0; i
< n
; i
++) {
573 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
574 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
575 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
576 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
580 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
581 /* compute luminance values */
582 if (transferOps
& IMAGE_CLAMP_BIT
) {
583 for (i
= 0; i
< n
; i
++) {
584 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
585 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
589 for (i
= 0; i
< n
; i
++) {
590 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
596 * Pack/store the pixels. Ugh! Lots of cases!!!
599 case GL_UNSIGNED_BYTE
:
601 GLubyte
*dst
= (GLubyte
*) dstAddr
;
605 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
609 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
613 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
617 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
621 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
623 case GL_LUMINANCE_ALPHA
:
625 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
626 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
631 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
632 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
637 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
638 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
639 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
644 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
645 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
646 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
647 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
652 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
653 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
654 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
659 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
660 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
661 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
662 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
667 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
668 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
669 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
670 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
673 case GL_RED_INTEGER_EXT
:
675 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
678 case GL_GREEN_INTEGER_EXT
:
680 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
683 case GL_BLUE_INTEGER_EXT
:
685 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
688 case GL_ALPHA_INTEGER_EXT
:
690 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
693 case GL_RGB_INTEGER_EXT
:
695 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
696 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
697 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
700 case GL_RGBA_INTEGER_EXT
:
702 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
703 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
704 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
705 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
708 case GL_BGR_INTEGER_EXT
:
710 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
711 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
712 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
715 case GL_BGRA_INTEGER_EXT
:
717 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
718 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
719 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
720 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
723 case GL_LUMINANCE_INTEGER_EXT
:
725 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
728 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
731 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
733 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
741 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
742 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
746 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
752 GLbyte
*dst
= (GLbyte
*) dstAddr
;
756 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
760 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
764 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
768 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
772 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
774 case GL_LUMINANCE_ALPHA
:
776 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
777 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
782 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
783 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
788 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
789 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
790 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
795 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
796 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
797 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
798 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
803 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
804 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
805 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
810 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
811 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
812 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
813 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
818 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
819 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
820 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
821 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
824 case GL_RED_INTEGER_EXT
:
826 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
829 case GL_GREEN_INTEGER_EXT
:
831 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
834 case GL_BLUE_INTEGER_EXT
:
836 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
839 case GL_ALPHA_INTEGER_EXT
:
841 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
844 case GL_RGB_INTEGER_EXT
:
846 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
847 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
848 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
851 case GL_RGBA_INTEGER_EXT
:
853 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
854 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
855 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
856 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
859 case GL_BGR_INTEGER_EXT
:
861 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
862 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
863 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
866 case GL_BGRA_INTEGER_EXT
:
868 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
869 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
870 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
871 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
874 case GL_LUMINANCE_INTEGER_EXT
:
876 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
879 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
882 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
884 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
892 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
893 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
897 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
901 case GL_UNSIGNED_SHORT
:
903 GLushort
*dst
= (GLushort
*) dstAddr
;
907 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
911 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
915 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
923 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
925 case GL_LUMINANCE_ALPHA
:
927 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
928 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
933 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
934 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
939 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
940 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
941 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
946 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
947 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
948 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
949 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
954 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
955 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
956 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
961 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
962 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
964 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
969 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
972 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
975 case GL_RED_INTEGER_EXT
:
977 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
980 case GL_GREEN_INTEGER_EXT
:
982 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
985 case GL_BLUE_INTEGER_EXT
:
987 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
990 case GL_ALPHA_INTEGER_EXT
:
992 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
995 case GL_RGB_INTEGER_EXT
:
997 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
998 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
999 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1002 case GL_RGBA_INTEGER_EXT
:
1004 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1005 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1006 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1007 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1010 case GL_BGR_INTEGER_EXT
:
1012 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1013 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1014 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1017 case GL_BGRA_INTEGER_EXT
:
1019 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1020 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1021 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1022 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1025 case GL_LUMINANCE_INTEGER_EXT
:
1027 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1030 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1033 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1035 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1043 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1044 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1048 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1054 GLshort
*dst
= (GLshort
*) dstAddr
;
1055 switch (dstFormat
) {
1058 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1062 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1066 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1070 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1074 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1076 case GL_LUMINANCE_ALPHA
:
1078 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1079 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1084 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1085 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1090 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1091 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1092 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1097 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1098 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1099 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1100 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1105 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1106 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1107 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1112 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1113 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1114 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1115 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1120 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1121 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1122 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1123 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1126 case GL_RED_INTEGER_EXT
:
1128 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1131 case GL_GREEN_INTEGER_EXT
:
1133 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1136 case GL_BLUE_INTEGER_EXT
:
1138 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1141 case GL_ALPHA_INTEGER_EXT
:
1143 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1146 case GL_RGB_INTEGER_EXT
:
1148 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1149 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1150 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1153 case GL_RGBA_INTEGER_EXT
:
1155 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1156 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1157 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1158 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1161 case GL_BGR_INTEGER_EXT
:
1163 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1164 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1165 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1168 case GL_BGRA_INTEGER_EXT
:
1170 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1171 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1172 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1173 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1176 case GL_LUMINANCE_INTEGER_EXT
:
1178 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1181 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1184 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1186 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1194 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1195 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1199 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1203 case GL_UNSIGNED_INT
:
1205 GLuint
*dst
= (GLuint
*) dstAddr
;
1206 switch (dstFormat
) {
1209 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1213 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1217 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1221 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1225 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1227 case GL_LUMINANCE_ALPHA
:
1229 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1230 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1235 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1236 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1241 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1242 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1243 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1248 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1249 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1250 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1251 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1256 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1257 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1258 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1263 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1264 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1265 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1266 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1271 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1272 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1273 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1274 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1277 case GL_RED_INTEGER_EXT
:
1279 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1282 case GL_GREEN_INTEGER_EXT
:
1284 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1287 case GL_BLUE_INTEGER_EXT
:
1289 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1292 case GL_ALPHA_INTEGER_EXT
:
1294 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1297 case GL_RGB_INTEGER_EXT
:
1299 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1300 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1301 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1304 case GL_RGBA_INTEGER_EXT
:
1306 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1307 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1308 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1309 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1312 case GL_BGR_INTEGER_EXT
:
1314 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1315 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1316 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1319 case GL_BGRA_INTEGER_EXT
:
1321 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1322 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1323 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1324 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1327 case GL_LUMINANCE_INTEGER_EXT
:
1329 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1332 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1335 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1337 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1345 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1346 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1350 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1356 GLint
*dst
= (GLint
*) dstAddr
;
1357 switch (dstFormat
) {
1360 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1364 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1368 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1372 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1376 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1378 case GL_LUMINANCE_ALPHA
:
1380 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1381 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1386 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1387 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1392 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1393 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1394 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1399 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1400 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1401 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1402 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1407 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1408 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1409 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1414 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1415 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1416 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1417 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1422 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1423 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1424 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1425 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1431 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1432 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1435 case GL_RED_INTEGER_EXT
:
1437 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1440 case GL_GREEN_INTEGER_EXT
:
1442 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1445 case GL_BLUE_INTEGER_EXT
:
1447 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1450 case GL_ALPHA_INTEGER_EXT
:
1452 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1455 case GL_RGB_INTEGER_EXT
:
1457 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1458 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1459 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1462 case GL_RGBA_INTEGER_EXT
:
1464 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1465 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1466 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1467 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1470 case GL_BGR_INTEGER_EXT
:
1472 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1473 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1474 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1477 case GL_BGRA_INTEGER_EXT
:
1479 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1480 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1481 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1482 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1485 case GL_LUMINANCE_INTEGER_EXT
:
1487 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1490 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1493 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1495 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1501 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1507 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1508 switch (dstFormat
) {
1511 dst
[i
] = rgba
[i
][RCOMP
];
1515 dst
[i
] = rgba
[i
][GCOMP
];
1519 dst
[i
] = rgba
[i
][BCOMP
];
1523 dst
[i
] = rgba
[i
][ACOMP
];
1527 dst
[i
] = luminance
[i
];
1529 case GL_LUMINANCE_ALPHA
:
1531 dst
[i
*2+0] = luminance
[i
];
1532 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1537 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1538 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1543 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1544 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1545 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1550 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1551 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1552 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1553 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1558 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1559 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1560 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1565 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1566 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1567 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1568 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1573 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1574 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1575 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1576 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1582 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1583 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1587 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1591 case GL_HALF_FLOAT_ARB
:
1593 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1594 switch (dstFormat
) {
1597 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1601 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1605 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1609 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1613 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1615 case GL_LUMINANCE_ALPHA
:
1617 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1618 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1623 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1624 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1629 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1630 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1631 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1636 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1637 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1638 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1639 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1644 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1645 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1646 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1651 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1652 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1653 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1654 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1659 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1660 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1661 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1662 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1668 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1669 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1673 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1677 case GL_UNSIGNED_BYTE_3_3_2
:
1678 if (dstFormat
== GL_RGB
) {
1679 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1681 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1682 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1683 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1687 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1688 if (dstFormat
== GL_RGB
) {
1689 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1691 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1692 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1693 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1697 case GL_UNSIGNED_SHORT_5_6_5
:
1698 if (dstFormat
== GL_RGB
) {
1699 GLushort
*dst
= (GLushort
*) dstAddr
;
1701 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1702 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1703 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1707 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1708 if (dstFormat
== GL_RGB
) {
1709 GLushort
*dst
= (GLushort
*) dstAddr
;
1711 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1712 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1713 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1717 case GL_UNSIGNED_SHORT_4_4_4_4
:
1718 if (dstFormat
== GL_RGBA
) {
1719 GLushort
*dst
= (GLushort
*) dstAddr
;
1721 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1722 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1723 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1724 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1727 else if (dstFormat
== GL_BGRA
) {
1728 GLushort
*dst
= (GLushort
*) dstAddr
;
1730 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1731 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1732 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1733 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1736 else if (dstFormat
== GL_ABGR_EXT
) {
1737 GLushort
*dst
= (GLushort
*) dstAddr
;
1739 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1740 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1741 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1742 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1746 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1747 if (dstFormat
== GL_RGBA
) {
1748 GLushort
*dst
= (GLushort
*) dstAddr
;
1750 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1751 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1752 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1753 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1756 else if (dstFormat
== GL_BGRA
) {
1757 GLushort
*dst
= (GLushort
*) dstAddr
;
1759 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1760 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1761 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1762 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1765 else if (dstFormat
== GL_ABGR_EXT
) {
1766 GLushort
*dst
= (GLushort
*) dstAddr
;
1768 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1769 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1770 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1771 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1775 case GL_UNSIGNED_SHORT_5_5_5_1
:
1776 if (dstFormat
== GL_RGBA
) {
1777 GLushort
*dst
= (GLushort
*) dstAddr
;
1779 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1780 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1781 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1782 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1785 else if (dstFormat
== GL_BGRA
) {
1786 GLushort
*dst
= (GLushort
*) dstAddr
;
1788 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1789 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1790 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1791 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1794 else if (dstFormat
== GL_ABGR_EXT
) {
1795 GLushort
*dst
= (GLushort
*) dstAddr
;
1797 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1798 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1799 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1800 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1804 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1805 if (dstFormat
== GL_RGBA
) {
1806 GLushort
*dst
= (GLushort
*) dstAddr
;
1808 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1809 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1810 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1811 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1814 else if (dstFormat
== GL_BGRA
) {
1815 GLushort
*dst
= (GLushort
*) dstAddr
;
1817 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1818 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1819 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1820 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1823 else if (dstFormat
== GL_ABGR_EXT
) {
1824 GLushort
*dst
= (GLushort
*) dstAddr
;
1826 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1827 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1828 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1829 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1833 case GL_UNSIGNED_INT_8_8_8_8
:
1834 if (dstFormat
== GL_RGBA
) {
1835 GLuint
*dst
= (GLuint
*) dstAddr
;
1837 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1838 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1839 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1840 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1843 else if (dstFormat
== GL_BGRA
) {
1844 GLuint
*dst
= (GLuint
*) dstAddr
;
1846 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1847 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1848 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1849 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1852 else if (dstFormat
== GL_ABGR_EXT
) {
1853 GLuint
*dst
= (GLuint
*) dstAddr
;
1855 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1856 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1857 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1858 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1862 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1863 if (dstFormat
== GL_RGBA
) {
1864 GLuint
*dst
= (GLuint
*) dstAddr
;
1866 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1867 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1868 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1869 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1872 else if (dstFormat
== GL_BGRA
) {
1873 GLuint
*dst
= (GLuint
*) dstAddr
;
1875 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1876 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1877 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1878 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1881 else if (dstFormat
== GL_ABGR_EXT
) {
1882 GLuint
*dst
= (GLuint
*) dstAddr
;
1884 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1885 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1886 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1887 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1891 case GL_UNSIGNED_INT_10_10_10_2
:
1892 if (dstFormat
== GL_RGBA
) {
1893 GLuint
*dst
= (GLuint
*) dstAddr
;
1895 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1896 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1897 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1898 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1901 else if (dstFormat
== GL_BGRA
) {
1902 GLuint
*dst
= (GLuint
*) dstAddr
;
1904 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1905 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1906 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1907 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1910 else if (dstFormat
== GL_ABGR_EXT
) {
1911 GLuint
*dst
= (GLuint
*) dstAddr
;
1913 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1914 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1915 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1916 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1920 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1921 if (dstFormat
== GL_RGBA
) {
1922 GLuint
*dst
= (GLuint
*) dstAddr
;
1924 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1925 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1926 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1927 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1930 else if (dstFormat
== GL_BGRA
) {
1931 GLuint
*dst
= (GLuint
*) dstAddr
;
1933 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1934 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1935 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1936 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1939 else if (dstFormat
== GL_ABGR_EXT
) {
1940 GLuint
*dst
= (GLuint
*) dstAddr
;
1942 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1943 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1944 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1945 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1949 case GL_UNSIGNED_INT_5_9_9_9_REV
:
1951 GLuint
*dst
= (GLuint
*) dstAddr
;
1952 for (i
= 0; i
< n
; i
++) {
1953 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
1957 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
1959 GLuint
*dst
= (GLuint
*) dstAddr
;
1960 for (i
= 0; i
< n
; i
++) {
1961 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
1966 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1971 if (dstPacking
->SwapBytes
) {
1972 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1973 if (swapSize
== 2) {
1974 if (dstPacking
->SwapBytes
) {
1975 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1978 else if (swapSize
== 4) {
1979 if (dstPacking
->SwapBytes
) {
1980 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1990 #define SWAP2BYTE(VALUE) \
1992 GLubyte *bytes = (GLubyte *) &(VALUE); \
1993 GLubyte tmp = bytes[0]; \
1994 bytes[0] = bytes[1]; \
1998 #define SWAP4BYTE(VALUE) \
2000 GLubyte *bytes = (GLubyte *) &(VALUE); \
2001 GLubyte tmp = bytes[0]; \
2002 bytes[0] = bytes[3]; \
2005 bytes[1] = bytes[2]; \
2011 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2012 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2013 const struct gl_pixelstore_attrib
*unpack
)
2015 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2017 ASSERT(srcType
== GL_BITMAP
||
2018 srcType
== GL_UNSIGNED_BYTE
||
2019 srcType
== GL_BYTE
||
2020 srcType
== GL_UNSIGNED_SHORT
||
2021 srcType
== GL_SHORT
||
2022 srcType
== GL_UNSIGNED_INT
||
2023 srcType
== GL_INT
||
2024 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2025 srcType
== GL_HALF_FLOAT_ARB
||
2026 srcType
== GL_FLOAT
||
2027 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2032 GLubyte
*ubsrc
= (GLubyte
*) src
;
2033 if (unpack
->LsbFirst
) {
2034 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2036 for (i
= 0; i
< n
; i
++) {
2037 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2048 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2050 for (i
= 0; i
< n
; i
++) {
2051 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2063 case GL_UNSIGNED_BYTE
:
2066 const GLubyte
*s
= (const GLubyte
*) src
;
2067 for (i
= 0; i
< n
; i
++)
2074 const GLbyte
*s
= (const GLbyte
*) src
;
2075 for (i
= 0; i
< n
; i
++)
2079 case GL_UNSIGNED_SHORT
:
2082 const GLushort
*s
= (const GLushort
*) src
;
2083 if (unpack
->SwapBytes
) {
2084 for (i
= 0; i
< n
; i
++) {
2085 GLushort value
= s
[i
];
2091 for (i
= 0; i
< n
; i
++)
2099 const GLshort
*s
= (const GLshort
*) src
;
2100 if (unpack
->SwapBytes
) {
2101 for (i
= 0; i
< n
; i
++) {
2102 GLshort value
= s
[i
];
2108 for (i
= 0; i
< n
; i
++)
2113 case GL_UNSIGNED_INT
:
2116 const GLuint
*s
= (const GLuint
*) src
;
2117 if (unpack
->SwapBytes
) {
2118 for (i
= 0; i
< n
; i
++) {
2119 GLuint value
= s
[i
];
2125 for (i
= 0; i
< n
; i
++)
2133 const GLint
*s
= (const GLint
*) src
;
2134 if (unpack
->SwapBytes
) {
2135 for (i
= 0; i
< n
; i
++) {
2142 for (i
= 0; i
< n
; i
++)
2150 const GLfloat
*s
= (const GLfloat
*) src
;
2151 if (unpack
->SwapBytes
) {
2152 for (i
= 0; i
< n
; i
++) {
2153 GLfloat value
= s
[i
];
2155 indexes
[i
] = (GLuint
) value
;
2159 for (i
= 0; i
< n
; i
++)
2160 indexes
[i
] = (GLuint
) s
[i
];
2164 case GL_HALF_FLOAT_ARB
:
2167 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2168 if (unpack
->SwapBytes
) {
2169 for (i
= 0; i
< n
; i
++) {
2170 GLhalfARB value
= s
[i
];
2172 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2176 for (i
= 0; i
< n
; i
++)
2177 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2181 case GL_UNSIGNED_INT_24_8_EXT
:
2184 const GLuint
*s
= (const GLuint
*) src
;
2185 if (unpack
->SwapBytes
) {
2186 for (i
= 0; i
< n
; i
++) {
2187 GLuint value
= s
[i
];
2189 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2193 for (i
= 0; i
< n
; i
++)
2194 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2198 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2201 const GLuint
*s
= (const GLuint
*) src
;
2202 if (unpack
->SwapBytes
) {
2203 for (i
= 0; i
< n
; i
++) {
2204 GLuint value
= s
[i
*2+1];
2206 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2210 for (i
= 0; i
< n
; i
++)
2211 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2217 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2224 * Return source/dest RGBA indexes for unpacking pixels.
2227 get_component_mapping(GLenum format
,
2239 case GL_RED_INTEGER_EXT
:
2241 *gSrc
= *bSrc
= *aSrc
= -1;
2244 case GL_GREEN_INTEGER_EXT
:
2246 *rSrc
= *bSrc
= *aSrc
= -1;
2249 case GL_BLUE_INTEGER_EXT
:
2251 *rSrc
= *gSrc
= *aSrc
= -1;
2254 case GL_ALPHA_INTEGER_EXT
:
2255 *rSrc
= *gSrc
= *bSrc
= -1;
2259 case GL_LUMINANCE_INTEGER_EXT
:
2260 *rSrc
= *gSrc
= *bSrc
= 0;
2263 case GL_LUMINANCE_ALPHA
:
2264 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2265 *rSrc
= *gSrc
= *bSrc
= 0;
2269 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2283 case GL_RGB_INTEGER
:
2294 case GL_BGR_INTEGER
:
2305 case GL_RGBA_INTEGER
:
2316 case GL_BGRA_INTEGER
:
2344 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2345 _mesa_lookup_enum_by_nr(format
));
2353 * This function extracts floating point RGBA values from arbitrary
2354 * image data. srcFormat and srcType are the format and type parameters
2355 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2357 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2358 * implements the "Conversion to floating point", "Conversion to RGB",
2359 * and "Final Expansion to RGBA" operations.
2361 * Args: n - number of pixels
2362 * rgba - output colors
2363 * srcFormat - format of incoming data
2364 * srcType - data type of incoming data
2365 * src - source data pointer
2366 * swapBytes - perform byteswapping of incoming data?
2369 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2370 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2371 GLboolean swapBytes
)
2373 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2375 GLint rDst
, bDst
, gDst
, aDst
;
2376 GLboolean intFormat
;
2377 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2379 ASSERT(srcFormat
== GL_RED
||
2380 srcFormat
== GL_GREEN
||
2381 srcFormat
== GL_BLUE
||
2382 srcFormat
== GL_ALPHA
||
2383 srcFormat
== GL_LUMINANCE
||
2384 srcFormat
== GL_LUMINANCE_ALPHA
||
2385 srcFormat
== GL_INTENSITY
||
2386 srcFormat
== GL_RG
||
2387 srcFormat
== GL_RGB
||
2388 srcFormat
== GL_BGR
||
2389 srcFormat
== GL_RGBA
||
2390 srcFormat
== GL_BGRA
||
2391 srcFormat
== GL_ABGR_EXT
||
2392 srcFormat
== GL_DU8DV8_ATI
||
2393 srcFormat
== GL_DUDV_ATI
||
2394 srcFormat
== GL_RED_INTEGER_EXT
||
2395 srcFormat
== GL_GREEN_INTEGER_EXT
||
2396 srcFormat
== GL_BLUE_INTEGER_EXT
||
2397 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2398 srcFormat
== GL_RGB_INTEGER_EXT
||
2399 srcFormat
== GL_RGBA_INTEGER_EXT
||
2400 srcFormat
== GL_BGR_INTEGER_EXT
||
2401 srcFormat
== GL_BGRA_INTEGER_EXT
||
2402 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2403 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2405 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2406 srcType
== GL_BYTE
||
2407 srcType
== GL_UNSIGNED_SHORT
||
2408 srcType
== GL_SHORT
||
2409 srcType
== GL_UNSIGNED_INT
||
2410 srcType
== GL_INT
||
2411 srcType
== GL_HALF_FLOAT_ARB
||
2412 srcType
== GL_FLOAT
||
2413 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2414 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2415 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2416 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2417 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2418 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2419 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2420 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2421 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2422 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2423 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2424 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2425 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2426 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2428 get_component_mapping(srcFormat
,
2429 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2430 &rDst
, &gDst
, &bDst
, &aDst
);
2432 stride
= _mesa_components_in_format(srcFormat
);
2434 intFormat
= _mesa_is_integer_format(srcFormat
);
2436 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2437 if ((SRC_INDEX) < 0) { \
2440 for (i = 0; i < n; i++) { \
2441 rgba[i][DST_INDEX] = DEFAULT_INT; \
2445 for (i = 0; i < n; i++) { \
2446 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2450 else if (swapBytes) { \
2451 const TYPE *s = (const TYPE *) src; \
2453 for (i = 0; i < n; i++) { \
2454 TYPE value = s[SRC_INDEX]; \
2455 if (sizeof(TYPE) == 2) { \
2458 else if (sizeof(TYPE) == 4) { \
2462 rgba[i][DST_INDEX] = (GLfloat) value; \
2464 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2469 const TYPE *s = (const TYPE *) src; \
2472 for (i = 0; i < n; i++) { \
2473 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2478 for (i = 0; i < n; i++) { \
2479 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2486 case GL_UNSIGNED_BYTE
:
2487 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2488 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2489 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2490 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2493 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2494 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2495 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2496 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2498 case GL_UNSIGNED_SHORT
:
2499 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2500 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2501 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2502 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2505 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2506 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2507 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2508 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2510 case GL_UNSIGNED_INT
:
2511 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2512 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2513 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2514 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2517 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2518 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2519 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2520 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2523 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2524 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2525 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2526 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2528 case GL_HALF_FLOAT_ARB
:
2529 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2530 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2531 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2532 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2534 case GL_UNSIGNED_BYTE_3_3_2
:
2536 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2543 for (i
= 0; i
< n
; i
++) {
2544 GLubyte p
= ubsrc
[i
];
2545 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2546 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2547 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2548 rgba
[i
][aDst
] = 1.0F
;
2552 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2554 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2561 for (i
= 0; i
< n
; i
++) {
2562 GLubyte p
= ubsrc
[i
];
2563 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2564 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2565 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2566 rgba
[i
][aDst
] = 1.0F
;
2570 case GL_UNSIGNED_SHORT_5_6_5
:
2577 const GLushort
*ussrc
= (const GLushort
*) src
;
2579 for (i
= 0; i
< n
; i
++) {
2580 GLushort p
= ussrc
[i
];
2582 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2583 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2584 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2585 rgba
[i
][aDst
] = 1.0F
;
2589 const GLushort
*ussrc
= (const GLushort
*) src
;
2591 for (i
= 0; i
< n
; i
++) {
2592 GLushort p
= ussrc
[i
];
2593 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2594 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2595 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2596 rgba
[i
][aDst
] = 1.0F
;
2600 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2607 const GLushort
*ussrc
= (const GLushort
*) src
;
2609 for (i
= 0; i
< n
; i
++) {
2610 GLushort p
= ussrc
[i
];
2612 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2613 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2614 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2615 rgba
[i
][aDst
] = 1.0F
;
2619 const GLushort
*ussrc
= (const GLushort
*) src
;
2621 for (i
= 0; i
< n
; i
++) {
2622 GLushort p
= ussrc
[i
];
2623 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2624 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2625 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2626 rgba
[i
][aDst
] = 1.0F
;
2630 case GL_UNSIGNED_SHORT_4_4_4_4
:
2632 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2635 const GLushort
*ussrc
= (const GLushort
*) src
;
2637 for (i
= 0; i
< n
; i
++) {
2638 GLushort p
= ussrc
[i
];
2640 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2641 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2642 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2643 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2647 const GLushort
*ussrc
= (const GLushort
*) src
;
2649 for (i
= 0; i
< n
; i
++) {
2650 GLushort p
= ussrc
[i
];
2651 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2652 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2653 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2654 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2658 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2660 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2663 const GLushort
*ussrc
= (const GLushort
*) src
;
2665 for (i
= 0; i
< n
; i
++) {
2666 GLushort p
= ussrc
[i
];
2668 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2669 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2670 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2671 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2675 const GLushort
*ussrc
= (const GLushort
*) src
;
2677 for (i
= 0; i
< n
; i
++) {
2678 GLushort p
= ussrc
[i
];
2679 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2680 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2681 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2682 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2686 case GL_UNSIGNED_SHORT_5_5_5_1
:
2688 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2691 const GLushort
*ussrc
= (const GLushort
*) src
;
2693 for (i
= 0; i
< n
; i
++) {
2694 GLushort p
= ussrc
[i
];
2696 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2697 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2698 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2699 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2703 const GLushort
*ussrc
= (const GLushort
*) src
;
2705 for (i
= 0; i
< n
; i
++) {
2706 GLushort p
= ussrc
[i
];
2707 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2708 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2709 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2710 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2714 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2716 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2719 const GLushort
*ussrc
= (const GLushort
*) src
;
2721 for (i
= 0; i
< n
; i
++) {
2722 GLushort p
= ussrc
[i
];
2724 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2725 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2726 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2727 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2731 const GLushort
*ussrc
= (const GLushort
*) src
;
2733 for (i
= 0; i
< n
; i
++) {
2734 GLushort p
= ussrc
[i
];
2735 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2736 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2737 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2738 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2742 case GL_UNSIGNED_INT_8_8_8_8
:
2744 const GLuint
*uisrc
= (const GLuint
*) src
;
2747 for (i
= 0; i
< n
; i
++) {
2748 GLuint p
= uisrc
[i
];
2749 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2750 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2751 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2752 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2756 for (i
= 0; i
< n
; i
++) {
2757 GLuint p
= uisrc
[i
];
2758 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2759 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2760 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2761 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2766 const GLuint
*uisrc
= (const GLuint
*) src
;
2769 for (i
= 0; i
< n
; i
++) {
2770 GLuint p
= uisrc
[i
];
2771 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2772 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2773 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2774 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2778 for (i
= 0; i
< n
; i
++) {
2779 GLuint p
= uisrc
[i
];
2780 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2781 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2782 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2783 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2788 case GL_UNSIGNED_INT_8_8_8_8_REV
:
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
>> 24) );
2796 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2797 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2798 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2802 for (i
= 0; i
< n
; i
++) {
2803 GLuint p
= uisrc
[i
];
2804 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2805 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2806 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2807 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
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
) & 0xff);
2818 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2819 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2820 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2824 for (i
= 0; i
< n
; i
++) {
2825 GLuint p
= uisrc
[i
];
2826 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2827 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2828 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2829 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2834 case GL_UNSIGNED_INT_10_10_10_2
:
2836 rs
= 1.0F
/ 1023.0F
;
2837 gs
= 1.0F
/ 1023.0F
;
2838 bs
= 1.0F
/ 1023.0F
;
2842 const GLuint
*uisrc
= (const GLuint
*) src
;
2844 for (i
= 0; i
< n
; i
++) {
2845 GLuint p
= uisrc
[i
];
2847 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2848 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2849 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2850 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2854 const GLuint
*uisrc
= (const GLuint
*) src
;
2856 for (i
= 0; i
< n
; i
++) {
2857 GLuint p
= uisrc
[i
];
2858 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2859 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2860 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2861 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2865 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2867 rs
= 1.0F
/ 1023.0F
;
2868 gs
= 1.0F
/ 1023.0F
;
2869 bs
= 1.0F
/ 1023.0F
;
2873 const GLuint
*uisrc
= (const GLuint
*) src
;
2875 for (i
= 0; i
< n
; i
++) {
2876 GLuint p
= uisrc
[i
];
2878 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2879 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2880 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2881 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2885 const GLuint
*uisrc
= (const GLuint
*) src
;
2887 for (i
= 0; i
< n
; i
++) {
2888 GLuint p
= uisrc
[i
];
2889 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2890 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2891 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2892 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2896 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2898 const GLuint
*uisrc
= (const GLuint
*) src
;
2901 for (i
= 0; i
< n
; i
++) {
2902 GLuint p
= uisrc
[i
];
2904 rgb9e5_to_float3(p
, f
);
2905 rgba
[i
][rDst
] = f
[0];
2906 rgba
[i
][gDst
] = f
[1];
2907 rgba
[i
][bDst
] = f
[2];
2908 rgba
[i
][aDst
] = 1.0F
;
2912 const GLuint
*uisrc
= (const GLuint
*) src
;
2915 for (i
= 0; i
< n
; i
++) {
2916 rgb9e5_to_float3(uisrc
[i
], f
);
2917 rgba
[i
][rDst
] = f
[0];
2918 rgba
[i
][gDst
] = f
[1];
2919 rgba
[i
][bDst
] = f
[2];
2920 rgba
[i
][aDst
] = 1.0F
;
2924 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2926 const GLuint
*uisrc
= (const GLuint
*) src
;
2929 for (i
= 0; i
< n
; i
++) {
2930 GLuint p
= uisrc
[i
];
2932 r11g11b10f_to_float3(p
, f
);
2933 rgba
[i
][rDst
] = f
[0];
2934 rgba
[i
][gDst
] = f
[1];
2935 rgba
[i
][bDst
] = f
[2];
2936 rgba
[i
][aDst
] = 1.0F
;
2940 const GLuint
*uisrc
= (const GLuint
*) src
;
2943 for (i
= 0; i
< n
; i
++) {
2944 r11g11b10f_to_float3(uisrc
[i
], f
);
2945 rgba
[i
][rDst
] = f
[0];
2946 rgba
[i
][gDst
] = f
[1];
2947 rgba
[i
][bDst
] = f
[2];
2948 rgba
[i
][aDst
] = 1.0F
;
2953 _mesa_problem(NULL
, "bad srcType in extract float data");
2960 static inline GLuint
2961 clamp_byte_to_uint(GLbyte b
)
2963 return b
< 0 ? 0 : b
;
2967 static inline GLuint
2968 clamp_short_to_uint(GLshort s
)
2970 return s
< 0 ? 0 : s
;
2974 static inline GLuint
2975 clamp_int_to_uint(GLint i
)
2977 return i
< 0 ? 0 : i
;
2981 static inline GLuint
2982 clamp_float_to_uint(GLfloat f
)
2984 return f
< 0.0F
? 0 : IROUND(f
);
2988 static inline GLuint
2989 clamp_half_to_uint(GLhalfARB h
)
2991 GLfloat f
= _mesa_half_to_float(h
);
2992 return f
< 0.0F
? 0 : IROUND(f
);
2997 * \sa extract_float_rgba()
3000 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
3001 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3002 GLboolean swapBytes
)
3004 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3006 GLint rDst
, bDst
, gDst
, aDst
;
3008 ASSERT(srcFormat
== GL_RED
||
3009 srcFormat
== GL_GREEN
||
3010 srcFormat
== GL_BLUE
||
3011 srcFormat
== GL_ALPHA
||
3012 srcFormat
== GL_LUMINANCE
||
3013 srcFormat
== GL_LUMINANCE_ALPHA
||
3014 srcFormat
== GL_INTENSITY
||
3015 srcFormat
== GL_RG
||
3016 srcFormat
== GL_RGB
||
3017 srcFormat
== GL_BGR
||
3018 srcFormat
== GL_RGBA
||
3019 srcFormat
== GL_BGRA
||
3020 srcFormat
== GL_ABGR_EXT
||
3021 srcFormat
== GL_DU8DV8_ATI
||
3022 srcFormat
== GL_DUDV_ATI
||
3023 srcFormat
== GL_RED_INTEGER_EXT
||
3024 srcFormat
== GL_GREEN_INTEGER_EXT
||
3025 srcFormat
== GL_BLUE_INTEGER_EXT
||
3026 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3027 srcFormat
== GL_RGB_INTEGER_EXT
||
3028 srcFormat
== GL_RGBA_INTEGER_EXT
||
3029 srcFormat
== GL_BGR_INTEGER_EXT
||
3030 srcFormat
== GL_BGRA_INTEGER_EXT
||
3031 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3032 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3034 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3035 srcType
== GL_BYTE
||
3036 srcType
== GL_UNSIGNED_SHORT
||
3037 srcType
== GL_SHORT
||
3038 srcType
== GL_UNSIGNED_INT
||
3039 srcType
== GL_INT
||
3040 srcType
== GL_HALF_FLOAT_ARB
||
3041 srcType
== GL_FLOAT
||
3042 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3043 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3044 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3045 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3046 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3047 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3048 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3049 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3050 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3051 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3052 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3053 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3054 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3055 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3057 get_component_mapping(srcFormat
,
3058 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3059 &rDst
, &gDst
, &bDst
, &aDst
);
3061 stride
= _mesa_components_in_format(srcFormat
);
3063 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3064 if ((SRC_INDEX) < 0) { \
3066 for (i = 0; i < n; i++) { \
3067 rgba[i][DST_INDEX] = DEFAULT; \
3070 else if (swapBytes) { \
3071 const TYPE *s = (const TYPE *) src; \
3073 for (i = 0; i < n; i++) { \
3074 TYPE value = s[SRC_INDEX]; \
3075 if (sizeof(TYPE) == 2) { \
3078 else if (sizeof(TYPE) == 4) { \
3081 rgba[i][DST_INDEX] = CONVERSION(value); \
3086 const TYPE *s = (const TYPE *) src; \
3088 for (i = 0; i < n; i++) { \
3089 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3095 case GL_UNSIGNED_BYTE
:
3096 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3097 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3098 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3099 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3102 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3103 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3104 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3105 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3107 case GL_UNSIGNED_SHORT
:
3108 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3109 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3110 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3111 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3114 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3115 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3116 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3117 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3119 case GL_UNSIGNED_INT
:
3120 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3121 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3122 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3123 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3126 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3127 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3128 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3129 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3132 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3133 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3134 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3135 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3137 case GL_HALF_FLOAT_ARB
:
3138 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3139 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3140 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3141 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3143 case GL_UNSIGNED_BYTE_3_3_2
:
3145 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3147 for (i
= 0; i
< n
; i
++) {
3148 GLubyte p
= ubsrc
[i
];
3149 rgba
[i
][rDst
] = ((p
>> 5) );
3150 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3151 rgba
[i
][bDst
] = ((p
) & 0x3);
3156 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3158 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3160 for (i
= 0; i
< n
; i
++) {
3161 GLubyte p
= ubsrc
[i
];
3162 rgba
[i
][rDst
] = ((p
) & 0x7);
3163 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3164 rgba
[i
][bDst
] = ((p
>> 6) );
3169 case GL_UNSIGNED_SHORT_5_6_5
:
3171 const GLushort
*ussrc
= (const GLushort
*) src
;
3173 for (i
= 0; i
< n
; i
++) {
3174 GLushort p
= ussrc
[i
];
3176 rgba
[i
][rDst
] = ((p
>> 11) );
3177 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3178 rgba
[i
][bDst
] = ((p
) & 0x1f);
3183 const GLushort
*ussrc
= (const GLushort
*) src
;
3185 for (i
= 0; i
< n
; i
++) {
3186 GLushort p
= ussrc
[i
];
3187 rgba
[i
][rDst
] = ((p
>> 11) );
3188 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3189 rgba
[i
][bDst
] = ((p
) & 0x1f);
3194 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3196 const GLushort
*ussrc
= (const GLushort
*) src
;
3198 for (i
= 0; i
< n
; i
++) {
3199 GLushort p
= ussrc
[i
];
3201 rgba
[i
][rDst
] = ((p
) & 0x1f);
3202 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3203 rgba
[i
][bDst
] = ((p
>> 11) );
3208 const GLushort
*ussrc
= (const GLushort
*) src
;
3210 for (i
= 0; i
< n
; i
++) {
3211 GLushort p
= ussrc
[i
];
3212 rgba
[i
][rDst
] = ((p
) & 0x1f);
3213 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3214 rgba
[i
][bDst
] = ((p
>> 11) );
3219 case GL_UNSIGNED_SHORT_4_4_4_4
:
3221 const GLushort
*ussrc
= (const GLushort
*) src
;
3223 for (i
= 0; i
< n
; i
++) {
3224 GLushort p
= ussrc
[i
];
3226 rgba
[i
][rDst
] = ((p
>> 12) );
3227 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3228 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3229 rgba
[i
][aDst
] = ((p
) & 0xf);
3233 const GLushort
*ussrc
= (const GLushort
*) src
;
3235 for (i
= 0; i
< n
; i
++) {
3236 GLushort p
= ussrc
[i
];
3237 rgba
[i
][rDst
] = ((p
>> 12) );
3238 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3239 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3240 rgba
[i
][aDst
] = ((p
) & 0xf);
3244 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3246 const GLushort
*ussrc
= (const GLushort
*) src
;
3248 for (i
= 0; i
< n
; i
++) {
3249 GLushort p
= ussrc
[i
];
3251 rgba
[i
][rDst
] = ((p
) & 0xf);
3252 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3253 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3254 rgba
[i
][aDst
] = ((p
>> 12) );
3258 const GLushort
*ussrc
= (const GLushort
*) src
;
3260 for (i
= 0; i
< n
; i
++) {
3261 GLushort p
= ussrc
[i
];
3262 rgba
[i
][rDst
] = ((p
) & 0xf);
3263 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3264 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3265 rgba
[i
][aDst
] = ((p
>> 12) );
3269 case GL_UNSIGNED_SHORT_5_5_5_1
:
3271 const GLushort
*ussrc
= (const GLushort
*) src
;
3273 for (i
= 0; i
< n
; i
++) {
3274 GLushort p
= ussrc
[i
];
3276 rgba
[i
][rDst
] = ((p
>> 11) );
3277 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3278 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3279 rgba
[i
][aDst
] = ((p
) & 0x1 );
3283 const GLushort
*ussrc
= (const GLushort
*) src
;
3285 for (i
= 0; i
< n
; i
++) {
3286 GLushort p
= ussrc
[i
];
3287 rgba
[i
][rDst
] = ((p
>> 11) );
3288 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3289 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3290 rgba
[i
][aDst
] = ((p
) & 0x1 );
3294 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3296 const GLushort
*ussrc
= (const GLushort
*) src
;
3298 for (i
= 0; i
< n
; i
++) {
3299 GLushort p
= ussrc
[i
];
3301 rgba
[i
][rDst
] = ((p
) & 0x1f);
3302 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3303 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3304 rgba
[i
][aDst
] = ((p
>> 15) );
3308 const GLushort
*ussrc
= (const GLushort
*) src
;
3310 for (i
= 0; i
< n
; i
++) {
3311 GLushort p
= ussrc
[i
];
3312 rgba
[i
][rDst
] = ((p
) & 0x1f);
3313 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3314 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3315 rgba
[i
][aDst
] = ((p
>> 15) );
3319 case GL_UNSIGNED_INT_8_8_8_8
:
3321 const GLuint
*uisrc
= (const GLuint
*) src
;
3323 for (i
= 0; i
< n
; i
++) {
3324 GLuint p
= uisrc
[i
];
3325 rgba
[i
][rDst
] = ((p
) & 0xff);
3326 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3327 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3328 rgba
[i
][aDst
] = ((p
>> 24) );
3332 const GLuint
*uisrc
= (const GLuint
*) src
;
3334 for (i
= 0; i
< n
; i
++) {
3335 GLuint p
= uisrc
[i
];
3336 rgba
[i
][rDst
] = ((p
>> 24) );
3337 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3338 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3339 rgba
[i
][aDst
] = ((p
) & 0xff);
3343 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3345 const GLuint
*uisrc
= (const GLuint
*) src
;
3347 for (i
= 0; i
< n
; i
++) {
3348 GLuint p
= uisrc
[i
];
3349 rgba
[i
][rDst
] = ((p
>> 24) );
3350 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3351 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3352 rgba
[i
][aDst
] = ((p
) & 0xff);
3356 const GLuint
*uisrc
= (const GLuint
*) src
;
3358 for (i
= 0; i
< n
; i
++) {
3359 GLuint p
= uisrc
[i
];
3360 rgba
[i
][rDst
] = ((p
) & 0xff);
3361 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3362 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3363 rgba
[i
][aDst
] = ((p
>> 24) );
3367 case GL_UNSIGNED_INT_10_10_10_2
:
3369 const GLuint
*uisrc
= (const GLuint
*) src
;
3371 for (i
= 0; i
< n
; i
++) {
3372 GLuint p
= uisrc
[i
];
3374 rgba
[i
][rDst
] = ((p
>> 22) );
3375 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3376 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3377 rgba
[i
][aDst
] = ((p
) & 0x3 );
3381 const GLuint
*uisrc
= (const GLuint
*) src
;
3383 for (i
= 0; i
< n
; i
++) {
3384 GLuint p
= uisrc
[i
];
3385 rgba
[i
][rDst
] = ((p
>> 22) );
3386 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3387 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3388 rgba
[i
][aDst
] = ((p
) & 0x3 );
3392 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3394 const GLuint
*uisrc
= (const GLuint
*) src
;
3396 for (i
= 0; i
< n
; i
++) {
3397 GLuint p
= uisrc
[i
];
3399 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3400 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3401 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3402 rgba
[i
][aDst
] = ((p
>> 30) );
3406 const GLuint
*uisrc
= (const GLuint
*) src
;
3408 for (i
= 0; i
< n
; i
++) {
3409 GLuint p
= uisrc
[i
];
3410 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3411 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3412 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3413 rgba
[i
][aDst
] = ((p
>> 30) );
3417 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3419 const GLuint
*uisrc
= (const GLuint
*) src
;
3422 for (i
= 0; i
< n
; i
++) {
3423 GLuint p
= uisrc
[i
];
3425 rgb9e5_to_float3(p
, f
);
3426 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3427 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3428 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3433 const GLuint
*uisrc
= (const GLuint
*) src
;
3436 for (i
= 0; i
< n
; i
++) {
3437 GLuint p
= uisrc
[i
];
3438 rgb9e5_to_float3(p
, f
);
3439 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3440 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3441 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3446 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3448 const GLuint
*uisrc
= (const GLuint
*) src
;
3451 for (i
= 0; i
< n
; i
++) {
3452 GLuint p
= uisrc
[i
];
3454 r11g11b10f_to_float3(p
, f
);
3455 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3456 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3457 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3462 const GLuint
*uisrc
= (const GLuint
*) src
;
3465 for (i
= 0; i
< n
; i
++) {
3466 GLuint p
= uisrc
[i
];
3467 r11g11b10f_to_float3(p
, f
);
3468 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3469 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3470 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3476 _mesa_problem(NULL
, "bad srcType in extract uint data");
3485 * Unpack a row of color image data from a client buffer according to
3486 * the pixel unpacking parameters.
3487 * Return GLubyte values in the specified dest image format.
3488 * This is used by glDrawPixels and glTexImage?D().
3489 * \param ctx - the context
3490 * n - number of pixels in the span
3491 * dstFormat - format of destination color array
3492 * dest - the destination color array
3493 * srcFormat - source image format
3494 * srcType - source image data type
3495 * source - source image pointer
3496 * srcPacking - pixel unpacking parameters
3497 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3499 * XXX perhaps expand this to process whole images someday.
3502 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3503 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3504 GLenum srcFormat
, GLenum srcType
,
3505 const GLvoid
*source
,
3506 const struct gl_pixelstore_attrib
*srcPacking
,
3507 GLbitfield transferOps
)
3509 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3510 ASSERT(dstFormat
== GL_ALPHA
||
3511 dstFormat
== GL_LUMINANCE
||
3512 dstFormat
== GL_LUMINANCE_ALPHA
||
3513 dstFormat
== GL_INTENSITY
||
3514 dstFormat
== GL_RED
||
3515 dstFormat
== GL_RG
||
3516 dstFormat
== GL_RGB
||
3517 dstFormat
== GL_RGBA
);
3519 ASSERT(srcFormat
== GL_RED
||
3520 srcFormat
== GL_GREEN
||
3521 srcFormat
== GL_BLUE
||
3522 srcFormat
== GL_ALPHA
||
3523 srcFormat
== GL_LUMINANCE
||
3524 srcFormat
== GL_LUMINANCE_ALPHA
||
3525 srcFormat
== GL_INTENSITY
||
3526 srcFormat
== GL_RG
||
3527 srcFormat
== GL_RGB
||
3528 srcFormat
== GL_BGR
||
3529 srcFormat
== GL_RGBA
||
3530 srcFormat
== GL_BGRA
||
3531 srcFormat
== GL_ABGR_EXT
||
3532 srcFormat
== GL_COLOR_INDEX
);
3534 ASSERT(srcType
== GL_BITMAP
||
3535 srcType
== GL_UNSIGNED_BYTE
||
3536 srcType
== GL_BYTE
||
3537 srcType
== GL_UNSIGNED_SHORT
||
3538 srcType
== GL_SHORT
||
3539 srcType
== GL_UNSIGNED_INT
||
3540 srcType
== GL_INT
||
3541 srcType
== GL_HALF_FLOAT_ARB
||
3542 srcType
== GL_FLOAT
||
3543 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3544 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3545 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3546 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3547 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3548 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3549 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3550 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3551 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3552 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3553 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3554 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3555 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3556 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3558 /* EXT_texture_integer specifies no transfer ops on integer
3559 * types in the resolved issues section. Just set them to 0
3560 * for integer surfaces.
3565 /* Try simple cases first */
3566 if (transferOps
== 0) {
3567 if (srcType
== GL_UNSIGNED_BYTE
) {
3568 if (dstFormat
== GL_RGBA
) {
3569 if (srcFormat
== GL_RGBA
) {
3570 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3573 else if (srcFormat
== GL_RGB
) {
3575 const GLubyte
*src
= (const GLubyte
*) source
;
3576 GLubyte
*dst
= dest
;
3577 for (i
= 0; i
< n
; i
++) {
3588 else if (dstFormat
== GL_RGB
) {
3589 if (srcFormat
== GL_RGB
) {
3590 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3593 else if (srcFormat
== GL_RGBA
) {
3595 const GLubyte
*src
= (const GLubyte
*) source
;
3596 GLubyte
*dst
= dest
;
3597 for (i
= 0; i
< n
; i
++) {
3607 else if (dstFormat
== srcFormat
) {
3608 GLint comps
= _mesa_components_in_format(srcFormat
);
3610 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3615 * Common situation, loading 8bit RGBA/RGB source images
3616 * into 16/32 bit destination. (OSMesa16/32)
3618 else if (srcType
== GL_UNSIGNED_BYTE
) {
3619 if (dstFormat
== GL_RGBA
) {
3620 if (srcFormat
== GL_RGB
) {
3622 const GLubyte
*src
= (const GLubyte
*) source
;
3623 GLubyte
*dst
= dest
;
3624 for (i
= 0; i
< n
; i
++) {
3634 else if (srcFormat
== GL_RGBA
) {
3636 const GLubyte
*src
= (const GLubyte
*) source
;
3637 GLubyte
*dst
= dest
;
3638 for (i
= 0; i
< n
; i
++) {
3649 else if (dstFormat
== GL_RGB
) {
3650 if (srcFormat
== GL_RGB
) {
3652 const GLubyte
*src
= (const GLubyte
*) source
;
3653 GLubyte
*dst
= dest
;
3654 for (i
= 0; i
< n
; i
++) {
3663 else if (srcFormat
== GL_RGBA
) {
3665 const GLubyte
*src
= (const GLubyte
*) source
;
3666 GLubyte
*dst
= dest
;
3667 for (i
= 0; i
< n
; i
++) {
3681 /* general solution begins here */
3683 GLint dstComponents
;
3684 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3685 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3688 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3692 dstComponents
= _mesa_components_in_format( dstFormat
);
3693 /* source & dest image formats should have been error checked by now */
3694 assert(dstComponents
> 0);
3697 * Extract image data and convert to RGBA floats
3699 if (srcFormat
== GL_COLOR_INDEX
) {
3700 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3703 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3708 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3711 /* Convert indexes to RGBA */
3712 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3713 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3715 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3717 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3718 * with color indexes.
3720 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3725 /* non-color index data */
3726 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3727 srcPacking
->SwapBytes
);
3730 /* Need to clamp if returning GLubytes */
3731 transferOps
|= IMAGE_CLAMP_BIT
;
3734 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3737 get_component_indexes(dstFormat
,
3738 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3740 /* Now return the GLubyte data in the requested dstFormat */
3742 GLubyte
*dst
= dest
;
3744 for (i
= 0; i
< n
; i
++) {
3745 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3746 dst
+= dstComponents
;
3751 GLubyte
*dst
= dest
;
3753 for (i
= 0; i
< n
; i
++) {
3754 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3755 dst
+= dstComponents
;
3760 GLubyte
*dst
= dest
;
3762 for (i
= 0; i
< n
; i
++) {
3763 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3764 dst
+= dstComponents
;
3769 GLubyte
*dst
= dest
;
3771 for (i
= 0; i
< n
; i
++) {
3772 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3773 dst
+= dstComponents
;
3778 GLubyte
*dst
= dest
;
3781 assert(dstComponents
== 1);
3782 for (i
= 0; i
< n
; i
++) {
3783 /* Intensity comes from red channel */
3784 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3789 GLubyte
*dst
= dest
;
3792 for (i
= 0; i
< n
; i
++) {
3793 /* Luminance comes from red channel */
3794 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3795 dst
+= dstComponents
;
3805 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3806 * instead of GLubyte.
3809 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3810 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3811 GLenum srcFormat
, GLenum srcType
,
3812 const GLvoid
*source
,
3813 const struct gl_pixelstore_attrib
*srcPacking
,
3814 GLbitfield transferOps
)
3816 ASSERT(dstFormat
== GL_ALPHA
||
3817 dstFormat
== GL_LUMINANCE
||
3818 dstFormat
== GL_LUMINANCE_ALPHA
||
3819 dstFormat
== GL_INTENSITY
||
3820 dstFormat
== GL_RED
||
3821 dstFormat
== GL_RG
||
3822 dstFormat
== GL_RGB
||
3823 dstFormat
== GL_RGBA
);
3825 ASSERT(srcFormat
== GL_RED
||
3826 srcFormat
== GL_GREEN
||
3827 srcFormat
== GL_BLUE
||
3828 srcFormat
== GL_ALPHA
||
3829 srcFormat
== GL_LUMINANCE
||
3830 srcFormat
== GL_LUMINANCE_ALPHA
||
3831 srcFormat
== GL_INTENSITY
||
3832 srcFormat
== GL_RG
||
3833 srcFormat
== GL_RGB
||
3834 srcFormat
== GL_BGR
||
3835 srcFormat
== GL_RGBA
||
3836 srcFormat
== GL_BGRA
||
3837 srcFormat
== GL_ABGR_EXT
||
3838 srcFormat
== GL_RED_INTEGER_EXT
||
3839 srcFormat
== GL_GREEN_INTEGER_EXT
||
3840 srcFormat
== GL_BLUE_INTEGER_EXT
||
3841 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3842 srcFormat
== GL_RGB_INTEGER_EXT
||
3843 srcFormat
== GL_RGBA_INTEGER_EXT
||
3844 srcFormat
== GL_BGR_INTEGER_EXT
||
3845 srcFormat
== GL_BGRA_INTEGER_EXT
||
3846 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3847 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3848 srcFormat
== GL_COLOR_INDEX
);
3850 ASSERT(srcType
== GL_BITMAP
||
3851 srcType
== GL_UNSIGNED_BYTE
||
3852 srcType
== GL_BYTE
||
3853 srcType
== GL_UNSIGNED_SHORT
||
3854 srcType
== GL_SHORT
||
3855 srcType
== GL_UNSIGNED_INT
||
3856 srcType
== GL_INT
||
3857 srcType
== GL_HALF_FLOAT_ARB
||
3858 srcType
== GL_FLOAT
||
3859 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3860 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3861 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3862 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3863 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3864 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3865 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3866 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3867 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3868 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3869 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3870 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3871 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3872 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3874 /* general solution, no special cases, yet */
3876 GLint dstComponents
;
3877 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3878 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3879 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3882 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3886 dstComponents
= _mesa_components_in_format( dstFormat
);
3887 /* source & dest image formats should have been error checked by now */
3888 assert(dstComponents
> 0);
3890 /* EXT_texture_integer specifies no transfer ops on integer
3891 * types in the resolved issues section. Just set them to 0
3892 * for integer surfaces.
3898 * Extract image data and convert to RGBA floats
3900 if (srcFormat
== GL_COLOR_INDEX
) {
3901 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3904 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3909 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3912 /* Convert indexes to RGBA */
3913 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3914 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3916 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3918 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3919 * with color indexes.
3921 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3926 /* non-color index data */
3927 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3928 srcPacking
->SwapBytes
);
3932 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3935 get_component_indexes(dstFormat
,
3936 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3938 /* Now pack results in the requested dstFormat */
3940 GLfloat
*dst
= dest
;
3942 for (i
= 0; i
< n
; i
++) {
3943 dst
[rDst
] = rgba
[i
][RCOMP
];
3944 dst
+= dstComponents
;
3949 GLfloat
*dst
= dest
;
3951 for (i
= 0; i
< n
; i
++) {
3952 dst
[gDst
] = rgba
[i
][GCOMP
];
3953 dst
+= dstComponents
;
3958 GLfloat
*dst
= dest
;
3960 for (i
= 0; i
< n
; i
++) {
3961 dst
[bDst
] = rgba
[i
][BCOMP
];
3962 dst
+= dstComponents
;
3967 GLfloat
*dst
= dest
;
3969 for (i
= 0; i
< n
; i
++) {
3970 dst
[aDst
] = rgba
[i
][ACOMP
];
3971 dst
+= dstComponents
;
3976 GLfloat
*dst
= dest
;
3979 assert(dstComponents
== 1);
3980 for (i
= 0; i
< n
; i
++) {
3981 /* Intensity comes from red channel */
3982 dst
[i
] = rgba
[i
][RCOMP
];
3987 GLfloat
*dst
= dest
;
3990 for (i
= 0; i
< n
; i
++) {
3991 /* Luminance comes from red channel */
3992 dst
[0] = rgba
[i
][RCOMP
];
3993 dst
+= dstComponents
;
4003 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4004 * instead of GLubyte.
4005 * No pixel transfer ops are applied.
4008 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4009 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4010 GLenum srcFormat
, GLenum srcType
,
4011 const GLvoid
*source
,
4012 const struct gl_pixelstore_attrib
*srcPacking
)
4014 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
4017 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4021 ASSERT(dstFormat
== GL_ALPHA
||
4022 dstFormat
== GL_LUMINANCE
||
4023 dstFormat
== GL_LUMINANCE_ALPHA
||
4024 dstFormat
== GL_INTENSITY
||
4025 dstFormat
== GL_RED
||
4026 dstFormat
== GL_RG
||
4027 dstFormat
== GL_RGB
||
4028 dstFormat
== GL_RGBA
);
4030 ASSERT(srcFormat
== GL_RED
||
4031 srcFormat
== GL_GREEN
||
4032 srcFormat
== GL_BLUE
||
4033 srcFormat
== GL_ALPHA
||
4034 srcFormat
== GL_LUMINANCE
||
4035 srcFormat
== GL_LUMINANCE_ALPHA
||
4036 srcFormat
== GL_INTENSITY
||
4037 srcFormat
== GL_RG
||
4038 srcFormat
== GL_RGB
||
4039 srcFormat
== GL_BGR
||
4040 srcFormat
== GL_RGBA
||
4041 srcFormat
== GL_BGRA
||
4042 srcFormat
== GL_ABGR_EXT
||
4043 srcFormat
== GL_RED_INTEGER_EXT
||
4044 srcFormat
== GL_GREEN_INTEGER_EXT
||
4045 srcFormat
== GL_BLUE_INTEGER_EXT
||
4046 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4047 srcFormat
== GL_RGB_INTEGER_EXT
||
4048 srcFormat
== GL_RGBA_INTEGER_EXT
||
4049 srcFormat
== GL_BGR_INTEGER_EXT
||
4050 srcFormat
== GL_BGRA_INTEGER_EXT
||
4051 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4052 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4054 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4055 srcType
== GL_BYTE
||
4056 srcType
== GL_UNSIGNED_SHORT
||
4057 srcType
== GL_SHORT
||
4058 srcType
== GL_UNSIGNED_INT
||
4059 srcType
== GL_INT
||
4060 srcType
== GL_HALF_FLOAT_ARB
||
4061 srcType
== GL_FLOAT
||
4062 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4063 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4064 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4065 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4066 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4067 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4068 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4069 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4070 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4071 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4072 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4073 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4074 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4075 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4078 /* Extract image data as uint[4] pixels */
4079 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4080 srcPacking
->SwapBytes
);
4082 if (dstFormat
== GL_RGBA
) {
4084 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4088 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4089 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4091 assert(dstComponents
> 0);
4093 get_component_indexes(dstFormat
,
4094 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4096 /* Now pack values in the requested dest format */
4100 for (i
= 0; i
< n
; i
++) {
4101 dst
[rDst
] = rgba
[i
][RCOMP
];
4102 dst
+= dstComponents
;
4109 for (i
= 0; i
< n
; i
++) {
4110 dst
[gDst
] = rgba
[i
][GCOMP
];
4111 dst
+= dstComponents
;
4118 for (i
= 0; i
< n
; i
++) {
4119 dst
[bDst
] = rgba
[i
][BCOMP
];
4120 dst
+= dstComponents
;
4127 for (i
= 0; i
< n
; i
++) {
4128 dst
[aDst
] = rgba
[i
][ACOMP
];
4129 dst
+= dstComponents
;
4137 assert(dstComponents
== 1);
4138 for (i
= 0; i
< n
; i
++) {
4139 /* Intensity comes from red channel */
4140 dst
[i
] = rgba
[i
][RCOMP
];
4148 for (i
= 0; i
< n
; i
++) {
4149 /* Luminance comes from red channel */
4150 dst
[0] = rgba
[i
][RCOMP
];
4151 dst
+= dstComponents
;
4162 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4163 * directly return GLbyte data, no transfer ops apply.
4166 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4167 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4168 GLenum srcFormat
, GLenum srcType
,
4169 const GLvoid
*source
,
4170 const struct gl_pixelstore_attrib
*srcPacking
,
4171 GLbitfield transferOps
)
4173 ASSERT(dstFormat
== GL_DUDV_ATI
);
4174 ASSERT(srcFormat
== GL_DUDV_ATI
||
4175 srcFormat
== GL_DU8DV8_ATI
);
4177 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4178 srcType
== GL_BYTE
||
4179 srcType
== GL_UNSIGNED_SHORT
||
4180 srcType
== GL_SHORT
||
4181 srcType
== GL_UNSIGNED_INT
||
4182 srcType
== GL_INT
||
4183 srcType
== GL_HALF_FLOAT_ARB
||
4184 srcType
== GL_FLOAT
);
4186 /* general solution */
4188 GLint dstComponents
;
4191 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4194 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4198 dstComponents
= _mesa_components_in_format( dstFormat
);
4199 /* source & dest image formats should have been error checked by now */
4200 assert(dstComponents
> 0);
4203 * Extract image data and convert to RGBA floats
4205 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4206 srcPacking
->SwapBytes
);
4209 /* Now determine which color channels we need to produce.
4210 * And determine the dest index (offset) within each color tuple.
4213 /* Now pack results in the requested dstFormat */
4214 for (i
= 0; i
< n
; i
++) {
4215 /* not sure - need clamp[-1,1] here? */
4216 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4217 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4218 dst
+= dstComponents
;
4226 * Unpack a row of color index data from a client buffer according to
4227 * the pixel unpacking parameters.
4228 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4230 * Args: ctx - the context
4231 * n - number of pixels
4232 * dstType - destination data type
4233 * dest - destination array
4234 * srcType - source pixel type
4235 * source - source data pointer
4236 * srcPacking - pixel unpacking parameters
4237 * transferOps - the pixel transfer operations to apply
4240 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4241 GLenum dstType
, GLvoid
*dest
,
4242 GLenum srcType
, const GLvoid
*source
,
4243 const struct gl_pixelstore_attrib
*srcPacking
,
4244 GLbitfield transferOps
)
4246 ASSERT(srcType
== GL_BITMAP
||
4247 srcType
== GL_UNSIGNED_BYTE
||
4248 srcType
== GL_BYTE
||
4249 srcType
== GL_UNSIGNED_SHORT
||
4250 srcType
== GL_SHORT
||
4251 srcType
== GL_UNSIGNED_INT
||
4252 srcType
== GL_INT
||
4253 srcType
== GL_HALF_FLOAT_ARB
||
4254 srcType
== GL_FLOAT
);
4256 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4257 dstType
== GL_UNSIGNED_SHORT
||
4258 dstType
== GL_UNSIGNED_INT
);
4261 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4264 * Try simple cases first
4266 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4267 && dstType
== GL_UNSIGNED_BYTE
) {
4268 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4270 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4271 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4272 memcpy(dest
, source
, n
* sizeof(GLuint
));
4278 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4281 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4285 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4289 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4291 /* convert to dest type */
4293 case GL_UNSIGNED_BYTE
:
4295 GLubyte
*dst
= (GLubyte
*) dest
;
4297 for (i
= 0; i
< n
; i
++) {
4298 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4302 case GL_UNSIGNED_SHORT
:
4304 GLuint
*dst
= (GLuint
*) dest
;
4306 for (i
= 0; i
< n
; i
++) {
4307 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4311 case GL_UNSIGNED_INT
:
4312 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4315 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4324 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4325 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4326 const struct gl_pixelstore_attrib
*dstPacking
,
4327 GLbitfield transferOps
)
4329 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4332 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4336 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4338 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4339 /* make a copy of input */
4340 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4341 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4346 case GL_UNSIGNED_BYTE
:
4348 GLubyte
*dst
= (GLubyte
*) dest
;
4350 for (i
= 0; i
< n
; i
++) {
4351 *dst
++ = (GLubyte
) source
[i
];
4357 GLbyte
*dst
= (GLbyte
*) dest
;
4359 for (i
= 0; i
< n
; i
++) {
4360 dst
[i
] = (GLbyte
) source
[i
];
4364 case GL_UNSIGNED_SHORT
:
4366 GLushort
*dst
= (GLushort
*) dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 dst
[i
] = (GLushort
) source
[i
];
4371 if (dstPacking
->SwapBytes
) {
4372 _mesa_swap2( (GLushort
*) dst
, n
);
4378 GLshort
*dst
= (GLshort
*) dest
;
4380 for (i
= 0; i
< n
; i
++) {
4381 dst
[i
] = (GLshort
) source
[i
];
4383 if (dstPacking
->SwapBytes
) {
4384 _mesa_swap2( (GLushort
*) dst
, n
);
4388 case GL_UNSIGNED_INT
:
4390 GLuint
*dst
= (GLuint
*) dest
;
4392 for (i
= 0; i
< n
; i
++) {
4393 dst
[i
] = (GLuint
) source
[i
];
4395 if (dstPacking
->SwapBytes
) {
4396 _mesa_swap4( (GLuint
*) dst
, n
);
4402 GLint
*dst
= (GLint
*) dest
;
4404 for (i
= 0; i
< n
; i
++) {
4405 dst
[i
] = (GLint
) source
[i
];
4407 if (dstPacking
->SwapBytes
) {
4408 _mesa_swap4( (GLuint
*) dst
, n
);
4414 GLfloat
*dst
= (GLfloat
*) dest
;
4416 for (i
= 0; i
< n
; i
++) {
4417 dst
[i
] = (GLfloat
) source
[i
];
4419 if (dstPacking
->SwapBytes
) {
4420 _mesa_swap4( (GLuint
*) dst
, n
);
4424 case GL_HALF_FLOAT_ARB
:
4426 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4428 for (i
= 0; i
< n
; i
++) {
4429 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4431 if (dstPacking
->SwapBytes
) {
4432 _mesa_swap2( (GLushort
*) dst
, n
);
4437 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4445 * Unpack a row of stencil data from a client buffer according to
4446 * the pixel unpacking parameters.
4447 * This is (or will be) used by glDrawPixels
4449 * Args: ctx - the context
4450 * n - number of pixels
4451 * dstType - destination data type
4452 * dest - destination array
4453 * srcType - source pixel type
4454 * source - source data pointer
4455 * srcPacking - pixel unpacking parameters
4456 * transferOps - apply offset/bias/lookup ops?
4459 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4460 GLenum dstType
, GLvoid
*dest
,
4461 GLenum srcType
, const GLvoid
*source
,
4462 const struct gl_pixelstore_attrib
*srcPacking
,
4463 GLbitfield transferOps
)
4465 ASSERT(srcType
== GL_BITMAP
||
4466 srcType
== GL_UNSIGNED_BYTE
||
4467 srcType
== GL_BYTE
||
4468 srcType
== GL_UNSIGNED_SHORT
||
4469 srcType
== GL_SHORT
||
4470 srcType
== GL_UNSIGNED_INT
||
4471 srcType
== GL_INT
||
4472 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4473 srcType
== GL_HALF_FLOAT_ARB
||
4474 srcType
== GL_FLOAT
||
4475 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4477 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4478 dstType
== GL_UNSIGNED_SHORT
||
4479 dstType
== GL_UNSIGNED_INT
||
4480 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4482 /* only shift and offset apply to stencil */
4483 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4486 * Try simple cases first
4488 if (transferOps
== 0 &&
4489 !ctx
->Pixel
.MapStencilFlag
&&
4490 srcType
== GL_UNSIGNED_BYTE
&&
4491 dstType
== GL_UNSIGNED_BYTE
) {
4492 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4494 else if (transferOps
== 0 &&
4495 !ctx
->Pixel
.MapStencilFlag
&&
4496 srcType
== GL_UNSIGNED_INT
&&
4497 dstType
== GL_UNSIGNED_INT
&&
4498 !srcPacking
->SwapBytes
) {
4499 memcpy(dest
, source
, n
* sizeof(GLuint
));
4505 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4508 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4512 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4515 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4516 /* shift and offset indexes */
4517 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4520 if (ctx
->Pixel
.MapStencilFlag
) {
4521 /* Apply stencil lookup table */
4522 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4524 for (i
= 0; i
< n
; i
++) {
4525 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4529 /* convert to dest type */
4531 case GL_UNSIGNED_BYTE
:
4533 GLubyte
*dst
= (GLubyte
*) dest
;
4535 for (i
= 0; i
< n
; i
++) {
4536 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4540 case GL_UNSIGNED_SHORT
:
4542 GLuint
*dst
= (GLuint
*) dest
;
4544 for (i
= 0; i
< n
; i
++) {
4545 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4549 case GL_UNSIGNED_INT
:
4550 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4552 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4554 GLuint
*dst
= (GLuint
*) dest
;
4556 for (i
= 0; i
< n
; i
++) {
4557 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4562 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4571 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4572 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4573 const struct gl_pixelstore_attrib
*dstPacking
)
4575 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4578 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4582 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4583 ctx
->Pixel
.MapStencilFlag
) {
4584 /* make a copy of input */
4585 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4586 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4591 case GL_UNSIGNED_BYTE
:
4592 memcpy(dest
, source
, n
);
4596 GLbyte
*dst
= (GLbyte
*) dest
;
4599 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4603 case GL_UNSIGNED_SHORT
:
4605 GLushort
*dst
= (GLushort
*) dest
;
4608 dst
[i
] = (GLushort
) source
[i
];
4610 if (dstPacking
->SwapBytes
) {
4611 _mesa_swap2( (GLushort
*) dst
, n
);
4617 GLshort
*dst
= (GLshort
*) dest
;
4620 dst
[i
] = (GLshort
) source
[i
];
4622 if (dstPacking
->SwapBytes
) {
4623 _mesa_swap2( (GLushort
*) dst
, n
);
4627 case GL_UNSIGNED_INT
:
4629 GLuint
*dst
= (GLuint
*) dest
;
4632 dst
[i
] = (GLuint
) source
[i
];
4634 if (dstPacking
->SwapBytes
) {
4635 _mesa_swap4( (GLuint
*) dst
, n
);
4641 GLint
*dst
= (GLint
*) dest
;
4644 dst
[i
] = (GLint
) source
[i
];
4646 if (dstPacking
->SwapBytes
) {
4647 _mesa_swap4( (GLuint
*) dst
, n
);
4653 GLfloat
*dst
= (GLfloat
*) dest
;
4656 dst
[i
] = (GLfloat
) source
[i
];
4658 if (dstPacking
->SwapBytes
) {
4659 _mesa_swap4( (GLuint
*) dst
, n
);
4663 case GL_HALF_FLOAT_ARB
:
4665 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4668 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4670 if (dstPacking
->SwapBytes
) {
4671 _mesa_swap2( (GLushort
*) dst
, n
);
4676 if (dstPacking
->LsbFirst
) {
4677 GLubyte
*dst
= (GLubyte
*) dest
;
4680 for (i
= 0; i
< n
; i
++) {
4683 *dst
|= ((source
[i
] != 0) << shift
);
4692 GLubyte
*dst
= (GLubyte
*) dest
;
4695 for (i
= 0; i
< n
; i
++) {
4698 *dst
|= ((source
[i
] != 0) << shift
);
4708 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4714 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4717 const GLTYPE *src = (const GLTYPE *)source; \
4718 for (i = 0; i < n; i++) { \
4719 GLTYPE value = src[i]; \
4720 if (srcPacking->SwapBytes) { \
4721 if (sizeof(GLTYPE) == 2) { \
4723 } else if (sizeof(GLTYPE) == 4) { \
4727 depthValues[i] = GLTYPE2FLOAT(value); \
4733 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4734 * or GLfloat values.
4735 * The glPixelTransfer (scale/bias) params will be applied.
4737 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4738 * \param depthMax max value for returned GLushort or GLuint values
4739 * (ignored for GLfloat).
4742 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4743 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4744 GLenum srcType
, const GLvoid
*source
,
4745 const struct gl_pixelstore_attrib
*srcPacking
)
4747 GLfloat
*depthTemp
= NULL
, *depthValues
;
4748 GLboolean needClamp
= GL_FALSE
;
4750 /* Look for special cases first.
4751 * Not only are these faster, they're less prone to numeric conversion
4752 * problems. Otherwise, converting from an int type to a float then
4753 * back to an int type can introduce errors that will show up as
4754 * artifacts in things like depth peeling which uses glCopyTexImage.
4756 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4757 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4758 const GLuint
*src
= (const GLuint
*) source
;
4759 GLushort
*dst
= (GLushort
*) dest
;
4761 for (i
= 0; i
< n
; i
++) {
4762 dst
[i
] = src
[i
] >> 16;
4766 if (srcType
== GL_UNSIGNED_SHORT
4767 && dstType
== GL_UNSIGNED_INT
4768 && depthMax
== 0xffffffff) {
4769 const GLushort
*src
= (const GLushort
*) source
;
4770 GLuint
*dst
= (GLuint
*) dest
;
4772 for (i
= 0; i
< n
; i
++) {
4773 dst
[i
] = src
[i
] | (src
[i
] << 16);
4777 if (srcType
== GL_UNSIGNED_INT_24_8
4778 && dstType
== GL_UNSIGNED_INT
4779 && depthMax
== 0xffffff) {
4780 const GLuint
*src
= (const GLuint
*) source
;
4781 GLuint
*dst
= (GLuint
*) dest
;
4783 for (i
= 0; i
< n
; i
++) {
4784 dst
[i
] = src
[i
] >> 8;
4788 /* XXX may want to add additional cases here someday */
4791 /* general case path follows */
4793 if (dstType
== GL_FLOAT
) {
4794 depthValues
= (GLfloat
*) dest
;
4797 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4799 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4803 depthValues
= depthTemp
;
4806 /* Convert incoming values to GLfloat. Some conversions will require
4811 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4812 needClamp
= GL_TRUE
;
4814 case GL_UNSIGNED_BYTE
:
4815 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4818 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4819 needClamp
= GL_TRUE
;
4821 case GL_UNSIGNED_SHORT
:
4822 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4825 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4826 needClamp
= GL_TRUE
;
4828 case GL_UNSIGNED_INT
:
4829 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4831 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4832 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4833 depthMax
== 0xffffff &&
4834 ctx
->Pixel
.DepthScale
== 1.0 &&
4835 ctx
->Pixel
.DepthBias
== 0.0) {
4836 const GLuint
*src
= (const GLuint
*) source
;
4837 GLuint
*zValues
= (GLuint
*) dest
;
4839 for (i
= 0; i
< n
; i
++) {
4840 GLuint value
= src
[i
];
4841 if (srcPacking
->SwapBytes
) {
4844 zValues
[i
] = value
& 0xffffff00;
4850 const GLuint
*src
= (const GLuint
*) source
;
4851 const GLfloat scale
= 1.0f
/ 0xffffff;
4853 for (i
= 0; i
< n
; i
++) {
4854 GLuint value
= src
[i
];
4855 if (srcPacking
->SwapBytes
) {
4858 depthValues
[i
] = (value
>> 8) * scale
;
4862 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4865 const GLfloat
*src
= (const GLfloat
*)source
;
4866 for (i
= 0; i
< n
; i
++) {
4867 GLfloat value
= src
[i
* 2];
4868 if (srcPacking
->SwapBytes
) {
4871 depthValues
[i
] = value
;
4873 needClamp
= GL_TRUE
;
4877 DEPTH_VALUES(GLfloat
, 1*);
4878 needClamp
= GL_TRUE
;
4880 case GL_HALF_FLOAT_ARB
:
4883 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4884 for (i
= 0; i
< n
; i
++) {
4885 GLhalfARB value
= src
[i
];
4886 if (srcPacking
->SwapBytes
) {
4889 depthValues
[i
] = _mesa_half_to_float(value
);
4891 needClamp
= GL_TRUE
;
4895 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4900 /* apply depth scale and bias */
4902 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4903 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4904 if (scale
!= 1.0 || bias
!= 0.0) {
4906 for (i
= 0; i
< n
; i
++) {
4907 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4909 needClamp
= GL_TRUE
;
4913 /* clamp to [0, 1] */
4916 for (i
= 0; i
< n
; i
++) {
4917 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4922 * Convert values to dstType
4924 if (dstType
== GL_UNSIGNED_INT
) {
4925 GLuint
*zValues
= (GLuint
*) dest
;
4927 if (depthMax
<= 0xffffff) {
4928 /* no overflow worries */
4929 for (i
= 0; i
< n
; i
++) {
4930 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4934 /* need to use double precision to prevent overflow problems */
4935 for (i
= 0; i
< n
; i
++) {
4936 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4937 if (z
>= (GLdouble
) 0xffffffff)
4938 zValues
[i
] = 0xffffffff;
4940 zValues
[i
] = (GLuint
) z
;
4944 else if (dstType
== GL_UNSIGNED_SHORT
) {
4945 GLushort
*zValues
= (GLushort
*) dest
;
4947 ASSERT(depthMax
<= 0xffff);
4948 for (i
= 0; i
< n
; i
++) {
4949 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4952 else if (dstType
== GL_FLOAT
) {
4953 /* Nothing to do. depthValues is pointing to dest. */
4955 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4956 GLfloat
*zValues
= (GLfloat
*) dest
;
4958 for (i
= 0; i
< n
; i
++) {
4959 zValues
[i
*2] = depthValues
[i
];
4971 * Pack an array of depth values. The values are floats in [0,1].
4974 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4975 GLenum dstType
, const GLfloat
*depthSpan
,
4976 const struct gl_pixelstore_attrib
*dstPacking
)
4978 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4980 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4984 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4985 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4986 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4987 depthSpan
= depthCopy
;
4991 case GL_UNSIGNED_BYTE
:
4993 GLubyte
*dst
= (GLubyte
*) dest
;
4995 for (i
= 0; i
< n
; i
++) {
4996 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5002 GLbyte
*dst
= (GLbyte
*) dest
;
5004 for (i
= 0; i
< n
; i
++) {
5005 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5009 case GL_UNSIGNED_SHORT
:
5011 GLushort
*dst
= (GLushort
*) dest
;
5013 for (i
= 0; i
< n
; i
++) {
5014 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5016 if (dstPacking
->SwapBytes
) {
5017 _mesa_swap2( (GLushort
*) dst
, n
);
5023 GLshort
*dst
= (GLshort
*) dest
;
5025 for (i
= 0; i
< n
; i
++) {
5026 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5028 if (dstPacking
->SwapBytes
) {
5029 _mesa_swap2( (GLushort
*) dst
, n
);
5033 case GL_UNSIGNED_INT
:
5035 GLuint
*dst
= (GLuint
*) dest
;
5037 for (i
= 0; i
< n
; i
++) {
5038 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5040 if (dstPacking
->SwapBytes
) {
5041 _mesa_swap4( (GLuint
*) dst
, n
);
5047 GLint
*dst
= (GLint
*) dest
;
5049 for (i
= 0; i
< n
; i
++) {
5050 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5052 if (dstPacking
->SwapBytes
) {
5053 _mesa_swap4( (GLuint
*) dst
, n
);
5059 GLfloat
*dst
= (GLfloat
*) dest
;
5061 for (i
= 0; i
< n
; i
++) {
5062 dst
[i
] = depthSpan
[i
];
5064 if (dstPacking
->SwapBytes
) {
5065 _mesa_swap4( (GLuint
*) dst
, n
);
5069 case GL_HALF_FLOAT_ARB
:
5071 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5073 for (i
= 0; i
< n
; i
++) {
5074 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5076 if (dstPacking
->SwapBytes
) {
5077 _mesa_swap2( (GLushort
*) dst
, n
);
5082 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5091 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5094 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5095 GLenum dstType
, GLuint
*dest
,
5096 const GLfloat
*depthVals
,
5097 const GLubyte
*stencilVals
,
5098 const struct gl_pixelstore_attrib
*dstPacking
)
5100 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5101 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5104 if (!depthCopy
|| !stencilCopy
) {
5105 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5111 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5112 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5113 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5114 depthVals
= depthCopy
;
5117 if (ctx
->Pixel
.IndexShift
||
5118 ctx
->Pixel
.IndexOffset
||
5119 ctx
->Pixel
.MapStencilFlag
) {
5120 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5121 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5122 stencilVals
= stencilCopy
;
5126 case GL_UNSIGNED_INT_24_8
:
5127 for (i
= 0; i
< n
; i
++) {
5128 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5129 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5132 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5133 for (i
= 0; i
< n
; i
++) {
5134 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5135 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5140 if (dstPacking
->SwapBytes
) {
5141 _mesa_swap4(dest
, n
);
5152 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5153 * Return all image data in a contiguous block. This is used when we
5154 * compile glDrawPixels, glTexImage, etc into a display list. We
5155 * need a copy of the data in a standard format.
5158 _mesa_unpack_image( GLuint dimensions
,
5159 GLsizei width
, GLsizei height
, GLsizei depth
,
5160 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5161 const struct gl_pixelstore_attrib
*unpack
)
5163 GLint bytesPerRow
, compsPerRow
;
5164 GLboolean flipBytes
, swap2
, swap4
;
5167 return NULL
; /* not necessarily an error */
5169 if (width
<= 0 || height
<= 0 || depth
<= 0)
5170 return NULL
; /* generate error later */
5172 if (type
== GL_BITMAP
) {
5173 bytesPerRow
= (width
+ 7) >> 3;
5174 flipBytes
= unpack
->LsbFirst
;
5175 swap2
= swap4
= GL_FALSE
;
5179 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5180 GLint components
= _mesa_components_in_format(format
);
5183 if (_mesa_type_is_packed(type
))
5186 if (bytesPerPixel
<= 0 || components
<= 0)
5187 return NULL
; /* bad format or type. generate error later */
5188 bytesPerRow
= bytesPerPixel
* width
;
5189 bytesPerComp
= bytesPerPixel
/ components
;
5190 flipBytes
= GL_FALSE
;
5191 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5192 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5193 compsPerRow
= components
* width
;
5194 assert(compsPerRow
>= width
);
5199 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5203 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5206 for (img
= 0; img
< depth
; img
++) {
5207 for (row
= 0; row
< height
; row
++) {
5208 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5209 width
, height
, format
, type
, img
, row
, 0);
5211 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5213 flipBytes
= GL_FALSE
;
5214 if (unpack
->LsbFirst
) {
5215 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5216 GLubyte dstMask
= 128;
5217 const GLubyte
*s
= src
;
5220 for (i
= 0; i
< width
; i
++) {
5224 if (srcMask
== 128) {
5229 srcMask
= srcMask
<< 1;
5237 dstMask
= dstMask
>> 1;
5242 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5243 GLubyte dstMask
= 128;
5244 const GLubyte
*s
= src
;
5247 for (i
= 0; i
< width
; i
++) {
5256 srcMask
= srcMask
>> 1;
5264 dstMask
= dstMask
>> 1;
5270 memcpy(dst
, src
, bytesPerRow
);
5273 /* byte flipping/swapping */
5275 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5278 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5281 _mesa_swap4((GLuint
*) dst
, compsPerRow
);