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
) );
3617 /* general solution begins here */
3619 GLint dstComponents
;
3620 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3621 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3624 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3628 dstComponents
= _mesa_components_in_format( dstFormat
);
3629 /* source & dest image formats should have been error checked by now */
3630 assert(dstComponents
> 0);
3633 * Extract image data and convert to RGBA floats
3635 if (srcFormat
== GL_COLOR_INDEX
) {
3636 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3639 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3644 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3647 /* Convert indexes to RGBA */
3648 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3649 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3651 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3653 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3654 * with color indexes.
3656 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3661 /* non-color index data */
3662 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3663 srcPacking
->SwapBytes
);
3666 /* Need to clamp if returning GLubytes */
3667 transferOps
|= IMAGE_CLAMP_BIT
;
3670 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3673 get_component_indexes(dstFormat
,
3674 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3676 /* Now return the GLubyte data in the requested dstFormat */
3678 GLubyte
*dst
= dest
;
3680 for (i
= 0; i
< n
; i
++) {
3681 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3682 dst
+= dstComponents
;
3687 GLubyte
*dst
= dest
;
3689 for (i
= 0; i
< n
; i
++) {
3690 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3691 dst
+= dstComponents
;
3696 GLubyte
*dst
= dest
;
3698 for (i
= 0; i
< n
; i
++) {
3699 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3700 dst
+= dstComponents
;
3705 GLubyte
*dst
= dest
;
3707 for (i
= 0; i
< n
; i
++) {
3708 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3709 dst
+= dstComponents
;
3714 GLubyte
*dst
= dest
;
3717 assert(dstComponents
== 1);
3718 for (i
= 0; i
< n
; i
++) {
3719 /* Intensity comes from red channel */
3720 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3725 GLubyte
*dst
= dest
;
3728 for (i
= 0; i
< n
; i
++) {
3729 /* Luminance comes from red channel */
3730 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3731 dst
+= dstComponents
;
3741 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3742 * instead of GLubyte.
3745 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3746 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3747 GLenum srcFormat
, GLenum srcType
,
3748 const GLvoid
*source
,
3749 const struct gl_pixelstore_attrib
*srcPacking
,
3750 GLbitfield transferOps
)
3752 ASSERT(dstFormat
== GL_ALPHA
||
3753 dstFormat
== GL_LUMINANCE
||
3754 dstFormat
== GL_LUMINANCE_ALPHA
||
3755 dstFormat
== GL_INTENSITY
||
3756 dstFormat
== GL_RED
||
3757 dstFormat
== GL_RG
||
3758 dstFormat
== GL_RGB
||
3759 dstFormat
== GL_RGBA
);
3761 ASSERT(srcFormat
== GL_RED
||
3762 srcFormat
== GL_GREEN
||
3763 srcFormat
== GL_BLUE
||
3764 srcFormat
== GL_ALPHA
||
3765 srcFormat
== GL_LUMINANCE
||
3766 srcFormat
== GL_LUMINANCE_ALPHA
||
3767 srcFormat
== GL_INTENSITY
||
3768 srcFormat
== GL_RG
||
3769 srcFormat
== GL_RGB
||
3770 srcFormat
== GL_BGR
||
3771 srcFormat
== GL_RGBA
||
3772 srcFormat
== GL_BGRA
||
3773 srcFormat
== GL_ABGR_EXT
||
3774 srcFormat
== GL_RED_INTEGER_EXT
||
3775 srcFormat
== GL_GREEN_INTEGER_EXT
||
3776 srcFormat
== GL_BLUE_INTEGER_EXT
||
3777 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3778 srcFormat
== GL_RGB_INTEGER_EXT
||
3779 srcFormat
== GL_RGBA_INTEGER_EXT
||
3780 srcFormat
== GL_BGR_INTEGER_EXT
||
3781 srcFormat
== GL_BGRA_INTEGER_EXT
||
3782 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3783 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3784 srcFormat
== GL_COLOR_INDEX
);
3786 ASSERT(srcType
== GL_BITMAP
||
3787 srcType
== GL_UNSIGNED_BYTE
||
3788 srcType
== GL_BYTE
||
3789 srcType
== GL_UNSIGNED_SHORT
||
3790 srcType
== GL_SHORT
||
3791 srcType
== GL_UNSIGNED_INT
||
3792 srcType
== GL_INT
||
3793 srcType
== GL_HALF_FLOAT_ARB
||
3794 srcType
== GL_FLOAT
||
3795 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3796 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3797 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3798 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3799 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3800 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3801 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3802 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3803 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3804 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3805 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3806 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3807 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3808 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3810 /* general solution, no special cases, yet */
3812 GLint dstComponents
;
3813 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3814 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3815 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3818 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3822 dstComponents
= _mesa_components_in_format( dstFormat
);
3823 /* source & dest image formats should have been error checked by now */
3824 assert(dstComponents
> 0);
3826 /* EXT_texture_integer specifies no transfer ops on integer
3827 * types in the resolved issues section. Just set them to 0
3828 * for integer surfaces.
3834 * Extract image data and convert to RGBA floats
3836 if (srcFormat
== GL_COLOR_INDEX
) {
3837 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3840 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3845 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3848 /* Convert indexes to RGBA */
3849 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3850 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3852 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3854 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3855 * with color indexes.
3857 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3862 /* non-color index data */
3863 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3864 srcPacking
->SwapBytes
);
3868 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3871 get_component_indexes(dstFormat
,
3872 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3874 /* Now pack results in the requested dstFormat */
3876 GLfloat
*dst
= dest
;
3878 for (i
= 0; i
< n
; i
++) {
3879 dst
[rDst
] = rgba
[i
][RCOMP
];
3880 dst
+= dstComponents
;
3885 GLfloat
*dst
= dest
;
3887 for (i
= 0; i
< n
; i
++) {
3888 dst
[gDst
] = rgba
[i
][GCOMP
];
3889 dst
+= dstComponents
;
3894 GLfloat
*dst
= dest
;
3896 for (i
= 0; i
< n
; i
++) {
3897 dst
[bDst
] = rgba
[i
][BCOMP
];
3898 dst
+= dstComponents
;
3903 GLfloat
*dst
= dest
;
3905 for (i
= 0; i
< n
; i
++) {
3906 dst
[aDst
] = rgba
[i
][ACOMP
];
3907 dst
+= dstComponents
;
3912 GLfloat
*dst
= dest
;
3915 assert(dstComponents
== 1);
3916 for (i
= 0; i
< n
; i
++) {
3917 /* Intensity comes from red channel */
3918 dst
[i
] = rgba
[i
][RCOMP
];
3923 GLfloat
*dst
= dest
;
3926 for (i
= 0; i
< n
; i
++) {
3927 /* Luminance comes from red channel */
3928 dst
[0] = rgba
[i
][RCOMP
];
3929 dst
+= dstComponents
;
3939 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3940 * instead of GLubyte.
3941 * No pixel transfer ops are applied.
3944 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3945 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3946 GLenum srcFormat
, GLenum srcType
,
3947 const GLvoid
*source
,
3948 const struct gl_pixelstore_attrib
*srcPacking
)
3950 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3953 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3957 ASSERT(dstFormat
== GL_ALPHA
||
3958 dstFormat
== GL_LUMINANCE
||
3959 dstFormat
== GL_LUMINANCE_ALPHA
||
3960 dstFormat
== GL_INTENSITY
||
3961 dstFormat
== GL_RED
||
3962 dstFormat
== GL_RG
||
3963 dstFormat
== GL_RGB
||
3964 dstFormat
== GL_RGBA
);
3966 ASSERT(srcFormat
== GL_RED
||
3967 srcFormat
== GL_GREEN
||
3968 srcFormat
== GL_BLUE
||
3969 srcFormat
== GL_ALPHA
||
3970 srcFormat
== GL_LUMINANCE
||
3971 srcFormat
== GL_LUMINANCE_ALPHA
||
3972 srcFormat
== GL_INTENSITY
||
3973 srcFormat
== GL_RG
||
3974 srcFormat
== GL_RGB
||
3975 srcFormat
== GL_BGR
||
3976 srcFormat
== GL_RGBA
||
3977 srcFormat
== GL_BGRA
||
3978 srcFormat
== GL_ABGR_EXT
||
3979 srcFormat
== GL_RED_INTEGER_EXT
||
3980 srcFormat
== GL_GREEN_INTEGER_EXT
||
3981 srcFormat
== GL_BLUE_INTEGER_EXT
||
3982 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3983 srcFormat
== GL_RGB_INTEGER_EXT
||
3984 srcFormat
== GL_RGBA_INTEGER_EXT
||
3985 srcFormat
== GL_BGR_INTEGER_EXT
||
3986 srcFormat
== GL_BGRA_INTEGER_EXT
||
3987 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3988 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3990 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3991 srcType
== GL_BYTE
||
3992 srcType
== GL_UNSIGNED_SHORT
||
3993 srcType
== GL_SHORT
||
3994 srcType
== GL_UNSIGNED_INT
||
3995 srcType
== GL_INT
||
3996 srcType
== GL_HALF_FLOAT_ARB
||
3997 srcType
== GL_FLOAT
||
3998 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3999 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4000 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4001 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4002 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4003 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4004 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4005 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4006 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4007 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4008 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4009 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4010 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4011 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4014 /* Extract image data as uint[4] pixels */
4015 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4016 srcPacking
->SwapBytes
);
4018 if (dstFormat
== GL_RGBA
) {
4020 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4024 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4025 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4027 assert(dstComponents
> 0);
4029 get_component_indexes(dstFormat
,
4030 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4032 /* Now pack values in the requested dest format */
4036 for (i
= 0; i
< n
; i
++) {
4037 dst
[rDst
] = rgba
[i
][RCOMP
];
4038 dst
+= dstComponents
;
4045 for (i
= 0; i
< n
; i
++) {
4046 dst
[gDst
] = rgba
[i
][GCOMP
];
4047 dst
+= dstComponents
;
4054 for (i
= 0; i
< n
; i
++) {
4055 dst
[bDst
] = rgba
[i
][BCOMP
];
4056 dst
+= dstComponents
;
4063 for (i
= 0; i
< n
; i
++) {
4064 dst
[aDst
] = rgba
[i
][ACOMP
];
4065 dst
+= dstComponents
;
4073 assert(dstComponents
== 1);
4074 for (i
= 0; i
< n
; i
++) {
4075 /* Intensity comes from red channel */
4076 dst
[i
] = rgba
[i
][RCOMP
];
4084 for (i
= 0; i
< n
; i
++) {
4085 /* Luminance comes from red channel */
4086 dst
[0] = rgba
[i
][RCOMP
];
4087 dst
+= dstComponents
;
4098 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4099 * directly return GLbyte data, no transfer ops apply.
4102 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4103 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4104 GLenum srcFormat
, GLenum srcType
,
4105 const GLvoid
*source
,
4106 const struct gl_pixelstore_attrib
*srcPacking
,
4107 GLbitfield transferOps
)
4109 ASSERT(dstFormat
== GL_DUDV_ATI
);
4110 ASSERT(srcFormat
== GL_DUDV_ATI
||
4111 srcFormat
== GL_DU8DV8_ATI
);
4113 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4114 srcType
== GL_BYTE
||
4115 srcType
== GL_UNSIGNED_SHORT
||
4116 srcType
== GL_SHORT
||
4117 srcType
== GL_UNSIGNED_INT
||
4118 srcType
== GL_INT
||
4119 srcType
== GL_HALF_FLOAT_ARB
||
4120 srcType
== GL_FLOAT
);
4122 /* general solution */
4124 GLint dstComponents
;
4127 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4130 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4134 dstComponents
= _mesa_components_in_format( dstFormat
);
4135 /* source & dest image formats should have been error checked by now */
4136 assert(dstComponents
> 0);
4139 * Extract image data and convert to RGBA floats
4141 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4142 srcPacking
->SwapBytes
);
4145 /* Now determine which color channels we need to produce.
4146 * And determine the dest index (offset) within each color tuple.
4149 /* Now pack results in the requested dstFormat */
4150 for (i
= 0; i
< n
; i
++) {
4151 /* not sure - need clamp[-1,1] here? */
4152 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4153 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4154 dst
+= dstComponents
;
4162 * Unpack a row of color index data from a client buffer according to
4163 * the pixel unpacking parameters.
4164 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4166 * Args: ctx - the context
4167 * n - number of pixels
4168 * dstType - destination data type
4169 * dest - destination array
4170 * srcType - source pixel type
4171 * source - source data pointer
4172 * srcPacking - pixel unpacking parameters
4173 * transferOps - the pixel transfer operations to apply
4176 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4177 GLenum dstType
, GLvoid
*dest
,
4178 GLenum srcType
, const GLvoid
*source
,
4179 const struct gl_pixelstore_attrib
*srcPacking
,
4180 GLbitfield transferOps
)
4182 ASSERT(srcType
== GL_BITMAP
||
4183 srcType
== GL_UNSIGNED_BYTE
||
4184 srcType
== GL_BYTE
||
4185 srcType
== GL_UNSIGNED_SHORT
||
4186 srcType
== GL_SHORT
||
4187 srcType
== GL_UNSIGNED_INT
||
4188 srcType
== GL_INT
||
4189 srcType
== GL_HALF_FLOAT_ARB
||
4190 srcType
== GL_FLOAT
);
4192 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4193 dstType
== GL_UNSIGNED_SHORT
||
4194 dstType
== GL_UNSIGNED_INT
);
4197 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4200 * Try simple cases first
4202 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4203 && dstType
== GL_UNSIGNED_BYTE
) {
4204 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4206 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4207 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4208 memcpy(dest
, source
, n
* sizeof(GLuint
));
4214 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4217 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4221 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4225 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4227 /* convert to dest type */
4229 case GL_UNSIGNED_BYTE
:
4231 GLubyte
*dst
= (GLubyte
*) dest
;
4233 for (i
= 0; i
< n
; i
++) {
4234 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4238 case GL_UNSIGNED_SHORT
:
4240 GLuint
*dst
= (GLuint
*) dest
;
4242 for (i
= 0; i
< n
; i
++) {
4243 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4247 case GL_UNSIGNED_INT
:
4248 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4251 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4260 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4261 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4262 const struct gl_pixelstore_attrib
*dstPacking
,
4263 GLbitfield transferOps
)
4265 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4268 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4272 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4274 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4275 /* make a copy of input */
4276 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4277 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4282 case GL_UNSIGNED_BYTE
:
4284 GLubyte
*dst
= (GLubyte
*) dest
;
4286 for (i
= 0; i
< n
; i
++) {
4287 *dst
++ = (GLubyte
) source
[i
];
4293 GLbyte
*dst
= (GLbyte
*) dest
;
4295 for (i
= 0; i
< n
; i
++) {
4296 dst
[i
] = (GLbyte
) source
[i
];
4300 case GL_UNSIGNED_SHORT
:
4302 GLushort
*dst
= (GLushort
*) dest
;
4304 for (i
= 0; i
< n
; i
++) {
4305 dst
[i
] = (GLushort
) source
[i
];
4307 if (dstPacking
->SwapBytes
) {
4308 _mesa_swap2( (GLushort
*) dst
, n
);
4314 GLshort
*dst
= (GLshort
*) dest
;
4316 for (i
= 0; i
< n
; i
++) {
4317 dst
[i
] = (GLshort
) source
[i
];
4319 if (dstPacking
->SwapBytes
) {
4320 _mesa_swap2( (GLushort
*) dst
, n
);
4324 case GL_UNSIGNED_INT
:
4326 GLuint
*dst
= (GLuint
*) dest
;
4328 for (i
= 0; i
< n
; i
++) {
4329 dst
[i
] = (GLuint
) source
[i
];
4331 if (dstPacking
->SwapBytes
) {
4332 _mesa_swap4( (GLuint
*) dst
, n
);
4338 GLint
*dst
= (GLint
*) dest
;
4340 for (i
= 0; i
< n
; i
++) {
4341 dst
[i
] = (GLint
) source
[i
];
4343 if (dstPacking
->SwapBytes
) {
4344 _mesa_swap4( (GLuint
*) dst
, n
);
4350 GLfloat
*dst
= (GLfloat
*) dest
;
4352 for (i
= 0; i
< n
; i
++) {
4353 dst
[i
] = (GLfloat
) source
[i
];
4355 if (dstPacking
->SwapBytes
) {
4356 _mesa_swap4( (GLuint
*) dst
, n
);
4360 case GL_HALF_FLOAT_ARB
:
4362 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4364 for (i
= 0; i
< n
; i
++) {
4365 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4367 if (dstPacking
->SwapBytes
) {
4368 _mesa_swap2( (GLushort
*) dst
, n
);
4373 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4381 * Unpack a row of stencil data from a client buffer according to
4382 * the pixel unpacking parameters.
4383 * This is (or will be) used by glDrawPixels
4385 * Args: ctx - the context
4386 * n - number of pixels
4387 * dstType - destination data type
4388 * dest - destination array
4389 * srcType - source pixel type
4390 * source - source data pointer
4391 * srcPacking - pixel unpacking parameters
4392 * transferOps - apply offset/bias/lookup ops?
4395 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4396 GLenum dstType
, GLvoid
*dest
,
4397 GLenum srcType
, const GLvoid
*source
,
4398 const struct gl_pixelstore_attrib
*srcPacking
,
4399 GLbitfield transferOps
)
4401 ASSERT(srcType
== GL_BITMAP
||
4402 srcType
== GL_UNSIGNED_BYTE
||
4403 srcType
== GL_BYTE
||
4404 srcType
== GL_UNSIGNED_SHORT
||
4405 srcType
== GL_SHORT
||
4406 srcType
== GL_UNSIGNED_INT
||
4407 srcType
== GL_INT
||
4408 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4409 srcType
== GL_HALF_FLOAT_ARB
||
4410 srcType
== GL_FLOAT
||
4411 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4413 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4414 dstType
== GL_UNSIGNED_SHORT
||
4415 dstType
== GL_UNSIGNED_INT
||
4416 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4418 /* only shift and offset apply to stencil */
4419 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4422 * Try simple cases first
4424 if (transferOps
== 0 &&
4425 !ctx
->Pixel
.MapStencilFlag
&&
4426 srcType
== GL_UNSIGNED_BYTE
&&
4427 dstType
== GL_UNSIGNED_BYTE
) {
4428 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4430 else if (transferOps
== 0 &&
4431 !ctx
->Pixel
.MapStencilFlag
&&
4432 srcType
== GL_UNSIGNED_INT
&&
4433 dstType
== GL_UNSIGNED_INT
&&
4434 !srcPacking
->SwapBytes
) {
4435 memcpy(dest
, source
, n
* sizeof(GLuint
));
4441 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4444 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4448 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4451 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4452 /* shift and offset indexes */
4453 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4456 if (ctx
->Pixel
.MapStencilFlag
) {
4457 /* Apply stencil lookup table */
4458 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4460 for (i
= 0; i
< n
; i
++) {
4461 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4465 /* convert to dest type */
4467 case GL_UNSIGNED_BYTE
:
4469 GLubyte
*dst
= (GLubyte
*) dest
;
4471 for (i
= 0; i
< n
; i
++) {
4472 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4476 case GL_UNSIGNED_SHORT
:
4478 GLuint
*dst
= (GLuint
*) dest
;
4480 for (i
= 0; i
< n
; i
++) {
4481 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4485 case GL_UNSIGNED_INT
:
4486 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4488 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4490 GLuint
*dst
= (GLuint
*) dest
;
4492 for (i
= 0; i
< n
; i
++) {
4493 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4498 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4507 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4508 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4509 const struct gl_pixelstore_attrib
*dstPacking
)
4511 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4514 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4518 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4519 ctx
->Pixel
.MapStencilFlag
) {
4520 /* make a copy of input */
4521 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4522 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4527 case GL_UNSIGNED_BYTE
:
4528 memcpy(dest
, source
, n
);
4532 GLbyte
*dst
= (GLbyte
*) dest
;
4535 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4539 case GL_UNSIGNED_SHORT
:
4541 GLushort
*dst
= (GLushort
*) dest
;
4544 dst
[i
] = (GLushort
) source
[i
];
4546 if (dstPacking
->SwapBytes
) {
4547 _mesa_swap2( (GLushort
*) dst
, n
);
4553 GLshort
*dst
= (GLshort
*) dest
;
4556 dst
[i
] = (GLshort
) source
[i
];
4558 if (dstPacking
->SwapBytes
) {
4559 _mesa_swap2( (GLushort
*) dst
, n
);
4563 case GL_UNSIGNED_INT
:
4565 GLuint
*dst
= (GLuint
*) dest
;
4568 dst
[i
] = (GLuint
) source
[i
];
4570 if (dstPacking
->SwapBytes
) {
4571 _mesa_swap4( (GLuint
*) dst
, n
);
4577 GLint
*dst
= (GLint
*) dest
;
4580 dst
[i
] = (GLint
) source
[i
];
4582 if (dstPacking
->SwapBytes
) {
4583 _mesa_swap4( (GLuint
*) dst
, n
);
4589 GLfloat
*dst
= (GLfloat
*) dest
;
4592 dst
[i
] = (GLfloat
) source
[i
];
4594 if (dstPacking
->SwapBytes
) {
4595 _mesa_swap4( (GLuint
*) dst
, n
);
4599 case GL_HALF_FLOAT_ARB
:
4601 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4604 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4606 if (dstPacking
->SwapBytes
) {
4607 _mesa_swap2( (GLushort
*) dst
, n
);
4612 if (dstPacking
->LsbFirst
) {
4613 GLubyte
*dst
= (GLubyte
*) dest
;
4616 for (i
= 0; i
< n
; i
++) {
4619 *dst
|= ((source
[i
] != 0) << shift
);
4628 GLubyte
*dst
= (GLubyte
*) dest
;
4631 for (i
= 0; i
< n
; i
++) {
4634 *dst
|= ((source
[i
] != 0) << shift
);
4644 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4650 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4653 const GLTYPE *src = (const GLTYPE *)source; \
4654 for (i = 0; i < n; i++) { \
4655 GLTYPE value = src[i]; \
4656 if (srcPacking->SwapBytes) { \
4657 if (sizeof(GLTYPE) == 2) { \
4659 } else if (sizeof(GLTYPE) == 4) { \
4663 depthValues[i] = GLTYPE2FLOAT(value); \
4669 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4670 * or GLfloat values.
4671 * The glPixelTransfer (scale/bias) params will be applied.
4673 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4674 * \param depthMax max value for returned GLushort or GLuint values
4675 * (ignored for GLfloat).
4678 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4679 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4680 GLenum srcType
, const GLvoid
*source
,
4681 const struct gl_pixelstore_attrib
*srcPacking
)
4683 GLfloat
*depthTemp
= NULL
, *depthValues
;
4684 GLboolean needClamp
= GL_FALSE
;
4686 /* Look for special cases first.
4687 * Not only are these faster, they're less prone to numeric conversion
4688 * problems. Otherwise, converting from an int type to a float then
4689 * back to an int type can introduce errors that will show up as
4690 * artifacts in things like depth peeling which uses glCopyTexImage.
4692 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4693 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4694 const GLuint
*src
= (const GLuint
*) source
;
4695 GLushort
*dst
= (GLushort
*) dest
;
4697 for (i
= 0; i
< n
; i
++) {
4698 dst
[i
] = src
[i
] >> 16;
4702 if (srcType
== GL_UNSIGNED_SHORT
4703 && dstType
== GL_UNSIGNED_INT
4704 && depthMax
== 0xffffffff) {
4705 const GLushort
*src
= (const GLushort
*) source
;
4706 GLuint
*dst
= (GLuint
*) dest
;
4708 for (i
= 0; i
< n
; i
++) {
4709 dst
[i
] = src
[i
] | (src
[i
] << 16);
4713 if (srcType
== GL_UNSIGNED_INT_24_8
4714 && dstType
== GL_UNSIGNED_INT
4715 && depthMax
== 0xffffff) {
4716 const GLuint
*src
= (const GLuint
*) source
;
4717 GLuint
*dst
= (GLuint
*) dest
;
4719 for (i
= 0; i
< n
; i
++) {
4720 dst
[i
] = src
[i
] >> 8;
4724 /* XXX may want to add additional cases here someday */
4727 /* general case path follows */
4729 if (dstType
== GL_FLOAT
) {
4730 depthValues
= (GLfloat
*) dest
;
4733 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4735 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4739 depthValues
= depthTemp
;
4742 /* Convert incoming values to GLfloat. Some conversions will require
4747 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4748 needClamp
= GL_TRUE
;
4750 case GL_UNSIGNED_BYTE
:
4751 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4754 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4755 needClamp
= GL_TRUE
;
4757 case GL_UNSIGNED_SHORT
:
4758 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4761 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4762 needClamp
= GL_TRUE
;
4764 case GL_UNSIGNED_INT
:
4765 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4767 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4768 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4769 depthMax
== 0xffffff &&
4770 ctx
->Pixel
.DepthScale
== 1.0 &&
4771 ctx
->Pixel
.DepthBias
== 0.0) {
4772 const GLuint
*src
= (const GLuint
*) source
;
4773 GLuint
*zValues
= (GLuint
*) dest
;
4775 for (i
= 0; i
< n
; i
++) {
4776 GLuint value
= src
[i
];
4777 if (srcPacking
->SwapBytes
) {
4780 zValues
[i
] = value
& 0xffffff00;
4786 const GLuint
*src
= (const GLuint
*) source
;
4787 const GLfloat scale
= 1.0f
/ 0xffffff;
4789 for (i
= 0; i
< n
; i
++) {
4790 GLuint value
= src
[i
];
4791 if (srcPacking
->SwapBytes
) {
4794 depthValues
[i
] = (value
>> 8) * scale
;
4798 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4801 const GLfloat
*src
= (const GLfloat
*)source
;
4802 for (i
= 0; i
< n
; i
++) {
4803 GLfloat value
= src
[i
* 2];
4804 if (srcPacking
->SwapBytes
) {
4807 depthValues
[i
] = value
;
4809 needClamp
= GL_TRUE
;
4813 DEPTH_VALUES(GLfloat
, 1*);
4814 needClamp
= GL_TRUE
;
4816 case GL_HALF_FLOAT_ARB
:
4819 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4820 for (i
= 0; i
< n
; i
++) {
4821 GLhalfARB value
= src
[i
];
4822 if (srcPacking
->SwapBytes
) {
4825 depthValues
[i
] = _mesa_half_to_float(value
);
4827 needClamp
= GL_TRUE
;
4831 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4836 /* apply depth scale and bias */
4838 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4839 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4840 if (scale
!= 1.0 || bias
!= 0.0) {
4842 for (i
= 0; i
< n
; i
++) {
4843 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4845 needClamp
= GL_TRUE
;
4849 /* clamp to [0, 1] */
4852 for (i
= 0; i
< n
; i
++) {
4853 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4858 * Convert values to dstType
4860 if (dstType
== GL_UNSIGNED_INT
) {
4861 GLuint
*zValues
= (GLuint
*) dest
;
4863 if (depthMax
<= 0xffffff) {
4864 /* no overflow worries */
4865 for (i
= 0; i
< n
; i
++) {
4866 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4870 /* need to use double precision to prevent overflow problems */
4871 for (i
= 0; i
< n
; i
++) {
4872 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4873 if (z
>= (GLdouble
) 0xffffffff)
4874 zValues
[i
] = 0xffffffff;
4876 zValues
[i
] = (GLuint
) z
;
4880 else if (dstType
== GL_UNSIGNED_SHORT
) {
4881 GLushort
*zValues
= (GLushort
*) dest
;
4883 ASSERT(depthMax
<= 0xffff);
4884 for (i
= 0; i
< n
; i
++) {
4885 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4888 else if (dstType
== GL_FLOAT
) {
4889 /* Nothing to do. depthValues is pointing to dest. */
4891 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4892 GLfloat
*zValues
= (GLfloat
*) dest
;
4894 for (i
= 0; i
< n
; i
++) {
4895 zValues
[i
*2] = depthValues
[i
];
4907 * Pack an array of depth values. The values are floats in [0,1].
4910 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4911 GLenum dstType
, const GLfloat
*depthSpan
,
4912 const struct gl_pixelstore_attrib
*dstPacking
)
4914 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4916 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4920 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4921 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4922 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4923 depthSpan
= depthCopy
;
4927 case GL_UNSIGNED_BYTE
:
4929 GLubyte
*dst
= (GLubyte
*) dest
;
4931 for (i
= 0; i
< n
; i
++) {
4932 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4938 GLbyte
*dst
= (GLbyte
*) dest
;
4940 for (i
= 0; i
< n
; i
++) {
4941 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4945 case GL_UNSIGNED_SHORT
:
4947 GLushort
*dst
= (GLushort
*) dest
;
4949 for (i
= 0; i
< n
; i
++) {
4950 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4952 if (dstPacking
->SwapBytes
) {
4953 _mesa_swap2( (GLushort
*) dst
, n
);
4959 GLshort
*dst
= (GLshort
*) dest
;
4961 for (i
= 0; i
< n
; i
++) {
4962 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4964 if (dstPacking
->SwapBytes
) {
4965 _mesa_swap2( (GLushort
*) dst
, n
);
4969 case GL_UNSIGNED_INT
:
4971 GLuint
*dst
= (GLuint
*) dest
;
4973 for (i
= 0; i
< n
; i
++) {
4974 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4976 if (dstPacking
->SwapBytes
) {
4977 _mesa_swap4( (GLuint
*) dst
, n
);
4983 GLint
*dst
= (GLint
*) dest
;
4985 for (i
= 0; i
< n
; i
++) {
4986 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4988 if (dstPacking
->SwapBytes
) {
4989 _mesa_swap4( (GLuint
*) dst
, n
);
4995 GLfloat
*dst
= (GLfloat
*) dest
;
4997 for (i
= 0; i
< n
; i
++) {
4998 dst
[i
] = depthSpan
[i
];
5000 if (dstPacking
->SwapBytes
) {
5001 _mesa_swap4( (GLuint
*) dst
, n
);
5005 case GL_HALF_FLOAT_ARB
:
5007 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5009 for (i
= 0; i
< n
; i
++) {
5010 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5012 if (dstPacking
->SwapBytes
) {
5013 _mesa_swap2( (GLushort
*) dst
, n
);
5018 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5027 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5030 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5031 GLenum dstType
, GLuint
*dest
,
5032 const GLfloat
*depthVals
,
5033 const GLubyte
*stencilVals
,
5034 const struct gl_pixelstore_attrib
*dstPacking
)
5036 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5037 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5040 if (!depthCopy
|| !stencilCopy
) {
5041 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5047 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5048 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5049 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5050 depthVals
= depthCopy
;
5053 if (ctx
->Pixel
.IndexShift
||
5054 ctx
->Pixel
.IndexOffset
||
5055 ctx
->Pixel
.MapStencilFlag
) {
5056 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5057 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5058 stencilVals
= stencilCopy
;
5062 case GL_UNSIGNED_INT_24_8
:
5063 for (i
= 0; i
< n
; i
++) {
5064 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5065 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5068 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5069 for (i
= 0; i
< n
; i
++) {
5070 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5071 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5076 if (dstPacking
->SwapBytes
) {
5077 _mesa_swap4(dest
, n
);
5088 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5089 * Return all image data in a contiguous block. This is used when we
5090 * compile glDrawPixels, glTexImage, etc into a display list. We
5091 * need a copy of the data in a standard format.
5094 _mesa_unpack_image( GLuint dimensions
,
5095 GLsizei width
, GLsizei height
, GLsizei depth
,
5096 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5097 const struct gl_pixelstore_attrib
*unpack
)
5099 GLint bytesPerRow
, compsPerRow
;
5100 GLboolean flipBytes
, swap2
, swap4
;
5103 return NULL
; /* not necessarily an error */
5105 if (width
<= 0 || height
<= 0 || depth
<= 0)
5106 return NULL
; /* generate error later */
5108 if (type
== GL_BITMAP
) {
5109 bytesPerRow
= (width
+ 7) >> 3;
5110 flipBytes
= unpack
->LsbFirst
;
5111 swap2
= swap4
= GL_FALSE
;
5115 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5116 GLint components
= _mesa_components_in_format(format
);
5119 if (_mesa_type_is_packed(type
))
5122 if (bytesPerPixel
<= 0 || components
<= 0)
5123 return NULL
; /* bad format or type. generate error later */
5124 bytesPerRow
= bytesPerPixel
* width
;
5125 bytesPerComp
= bytesPerPixel
/ components
;
5126 flipBytes
= GL_FALSE
;
5127 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5128 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5129 compsPerRow
= components
* width
;
5130 assert(compsPerRow
>= width
);
5135 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5139 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5142 for (img
= 0; img
< depth
; img
++) {
5143 for (row
= 0; row
< height
; row
++) {
5144 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5145 width
, height
, format
, type
, img
, row
, 0);
5147 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5149 flipBytes
= GL_FALSE
;
5150 if (unpack
->LsbFirst
) {
5151 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5152 GLubyte dstMask
= 128;
5153 const GLubyte
*s
= src
;
5156 for (i
= 0; i
< width
; i
++) {
5160 if (srcMask
== 128) {
5165 srcMask
= srcMask
<< 1;
5173 dstMask
= dstMask
>> 1;
5178 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5179 GLubyte dstMask
= 128;
5180 const GLubyte
*s
= src
;
5183 for (i
= 0; i
< width
; i
++) {
5192 srcMask
= srcMask
>> 1;
5200 dstMask
= dstMask
>> 1;
5206 memcpy(dst
, src
, bytesPerRow
);
5209 /* byte flipping/swapping */
5211 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5214 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5217 _mesa_swap4((GLuint
*) dst
, compsPerRow
);