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
:
2304 case GL_RGBA_INTEGER
:
2342 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2343 _mesa_lookup_enum_by_nr(format
));
2351 * This function extracts floating point RGBA values from arbitrary
2352 * image data. srcFormat and srcType are the format and type parameters
2353 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2355 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2356 * implements the "Conversion to floating point", "Conversion to RGB",
2357 * and "Final Expansion to RGBA" operations.
2359 * Args: n - number of pixels
2360 * rgba - output colors
2361 * srcFormat - format of incoming data
2362 * srcType - data type of incoming data
2363 * src - source data pointer
2364 * swapBytes - perform byteswapping of incoming data?
2367 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2368 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2369 GLboolean swapBytes
)
2371 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2373 GLint rDst
, bDst
, gDst
, aDst
;
2374 GLboolean intFormat
;
2375 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2377 ASSERT(srcFormat
== GL_RED
||
2378 srcFormat
== GL_GREEN
||
2379 srcFormat
== GL_BLUE
||
2380 srcFormat
== GL_ALPHA
||
2381 srcFormat
== GL_LUMINANCE
||
2382 srcFormat
== GL_LUMINANCE_ALPHA
||
2383 srcFormat
== GL_INTENSITY
||
2384 srcFormat
== GL_RG
||
2385 srcFormat
== GL_RGB
||
2386 srcFormat
== GL_BGR
||
2387 srcFormat
== GL_RGBA
||
2388 srcFormat
== GL_BGRA
||
2389 srcFormat
== GL_ABGR_EXT
||
2390 srcFormat
== GL_DU8DV8_ATI
||
2391 srcFormat
== GL_DUDV_ATI
||
2392 srcFormat
== GL_RED_INTEGER_EXT
||
2393 srcFormat
== GL_GREEN_INTEGER_EXT
||
2394 srcFormat
== GL_BLUE_INTEGER_EXT
||
2395 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2396 srcFormat
== GL_RGB_INTEGER_EXT
||
2397 srcFormat
== GL_RGBA_INTEGER_EXT
||
2398 srcFormat
== GL_BGR_INTEGER_EXT
||
2399 srcFormat
== GL_BGRA_INTEGER_EXT
||
2400 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2401 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2403 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2404 srcType
== GL_BYTE
||
2405 srcType
== GL_UNSIGNED_SHORT
||
2406 srcType
== GL_SHORT
||
2407 srcType
== GL_UNSIGNED_INT
||
2408 srcType
== GL_INT
||
2409 srcType
== GL_HALF_FLOAT_ARB
||
2410 srcType
== GL_FLOAT
||
2411 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2412 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2413 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2414 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2415 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2416 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2417 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2418 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2419 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2420 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2421 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2422 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2423 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2424 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2426 get_component_mapping(srcFormat
,
2427 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2428 &rDst
, &gDst
, &bDst
, &aDst
);
2430 stride
= _mesa_components_in_format(srcFormat
);
2432 intFormat
= _mesa_is_integer_format(srcFormat
);
2434 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2435 if ((SRC_INDEX) < 0) { \
2438 for (i = 0; i < n; i++) { \
2439 rgba[i][DST_INDEX] = DEFAULT_INT; \
2443 for (i = 0; i < n; i++) { \
2444 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2448 else if (swapBytes) { \
2449 const TYPE *s = (const TYPE *) src; \
2451 for (i = 0; i < n; i++) { \
2452 TYPE value = s[SRC_INDEX]; \
2453 if (sizeof(TYPE) == 2) { \
2456 else if (sizeof(TYPE) == 4) { \
2460 rgba[i][DST_INDEX] = (GLfloat) value; \
2462 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2467 const TYPE *s = (const TYPE *) src; \
2470 for (i = 0; i < n; i++) { \
2471 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2476 for (i = 0; i < n; i++) { \
2477 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2484 case GL_UNSIGNED_BYTE
:
2485 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2486 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2487 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2488 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2491 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2492 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2493 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2494 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2496 case GL_UNSIGNED_SHORT
:
2497 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2498 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2499 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2500 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2503 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2504 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2505 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2506 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2508 case GL_UNSIGNED_INT
:
2509 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2510 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2511 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2512 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2515 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2516 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2517 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2518 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2521 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2522 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2523 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2524 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2526 case GL_HALF_FLOAT_ARB
:
2527 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2528 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2529 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2530 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2532 case GL_UNSIGNED_BYTE_3_3_2
:
2534 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2541 for (i
= 0; i
< n
; i
++) {
2542 GLubyte p
= ubsrc
[i
];
2543 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2544 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2545 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2546 rgba
[i
][aDst
] = 1.0F
;
2550 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2552 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2559 for (i
= 0; i
< n
; i
++) {
2560 GLubyte p
= ubsrc
[i
];
2561 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2562 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2563 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2564 rgba
[i
][aDst
] = 1.0F
;
2568 case GL_UNSIGNED_SHORT_5_6_5
:
2575 const GLushort
*ussrc
= (const GLushort
*) src
;
2577 for (i
= 0; i
< n
; i
++) {
2578 GLushort p
= ussrc
[i
];
2580 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2581 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2582 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2583 rgba
[i
][aDst
] = 1.0F
;
2587 const GLushort
*ussrc
= (const GLushort
*) src
;
2589 for (i
= 0; i
< n
; i
++) {
2590 GLushort p
= ussrc
[i
];
2591 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2592 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2593 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2594 rgba
[i
][aDst
] = 1.0F
;
2598 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2605 const GLushort
*ussrc
= (const GLushort
*) src
;
2607 for (i
= 0; i
< n
; i
++) {
2608 GLushort p
= ussrc
[i
];
2610 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2611 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2612 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2613 rgba
[i
][aDst
] = 1.0F
;
2617 const GLushort
*ussrc
= (const GLushort
*) src
;
2619 for (i
= 0; i
< n
; i
++) {
2620 GLushort p
= ussrc
[i
];
2621 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2622 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2623 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2624 rgba
[i
][aDst
] = 1.0F
;
2628 case GL_UNSIGNED_SHORT_4_4_4_4
:
2630 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2633 const GLushort
*ussrc
= (const GLushort
*) src
;
2635 for (i
= 0; i
< n
; i
++) {
2636 GLushort p
= ussrc
[i
];
2638 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2639 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2640 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2641 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2645 const GLushort
*ussrc
= (const GLushort
*) src
;
2647 for (i
= 0; i
< n
; i
++) {
2648 GLushort p
= ussrc
[i
];
2649 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2650 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2651 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2652 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2656 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2658 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2661 const GLushort
*ussrc
= (const GLushort
*) src
;
2663 for (i
= 0; i
< n
; i
++) {
2664 GLushort p
= ussrc
[i
];
2666 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2667 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2668 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2669 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2673 const GLushort
*ussrc
= (const GLushort
*) src
;
2675 for (i
= 0; i
< n
; i
++) {
2676 GLushort p
= ussrc
[i
];
2677 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2678 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2679 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2680 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2684 case GL_UNSIGNED_SHORT_5_5_5_1
:
2686 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2689 const GLushort
*ussrc
= (const GLushort
*) src
;
2691 for (i
= 0; i
< n
; i
++) {
2692 GLushort p
= ussrc
[i
];
2694 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2695 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2696 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2697 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2701 const GLushort
*ussrc
= (const GLushort
*) src
;
2703 for (i
= 0; i
< n
; i
++) {
2704 GLushort p
= ussrc
[i
];
2705 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2706 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2707 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2708 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2712 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2714 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2717 const GLushort
*ussrc
= (const GLushort
*) src
;
2719 for (i
= 0; i
< n
; i
++) {
2720 GLushort p
= ussrc
[i
];
2722 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2723 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2724 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2725 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2729 const GLushort
*ussrc
= (const GLushort
*) src
;
2731 for (i
= 0; i
< n
; i
++) {
2732 GLushort p
= ussrc
[i
];
2733 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2734 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2735 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2736 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2740 case GL_UNSIGNED_INT_8_8_8_8
:
2742 const GLuint
*uisrc
= (const GLuint
*) src
;
2745 for (i
= 0; i
< n
; i
++) {
2746 GLuint p
= uisrc
[i
];
2747 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2748 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2749 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2750 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2754 for (i
= 0; i
< n
; i
++) {
2755 GLuint p
= uisrc
[i
];
2756 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2757 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2758 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2759 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2764 const GLuint
*uisrc
= (const GLuint
*) src
;
2767 for (i
= 0; i
< n
; i
++) {
2768 GLuint p
= uisrc
[i
];
2769 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2770 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2771 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2772 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2776 for (i
= 0; i
< n
; i
++) {
2777 GLuint p
= uisrc
[i
];
2778 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2779 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2780 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2781 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2786 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2788 const GLuint
*uisrc
= (const GLuint
*) src
;
2791 for (i
= 0; i
< n
; i
++) {
2792 GLuint p
= uisrc
[i
];
2793 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2794 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2795 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2796 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2800 for (i
= 0; i
< n
; i
++) {
2801 GLuint p
= uisrc
[i
];
2802 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2803 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2804 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2805 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2810 const GLuint
*uisrc
= (const GLuint
*) src
;
2813 for (i
= 0; i
< n
; i
++) {
2814 GLuint p
= uisrc
[i
];
2815 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2816 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2817 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2818 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2822 for (i
= 0; i
< n
; i
++) {
2823 GLuint p
= uisrc
[i
];
2824 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2825 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2826 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2827 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2832 case GL_UNSIGNED_INT_10_10_10_2
:
2834 rs
= 1.0F
/ 1023.0F
;
2835 gs
= 1.0F
/ 1023.0F
;
2836 bs
= 1.0F
/ 1023.0F
;
2840 const GLuint
*uisrc
= (const GLuint
*) src
;
2842 for (i
= 0; i
< n
; i
++) {
2843 GLuint p
= uisrc
[i
];
2845 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2846 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2847 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2848 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2852 const GLuint
*uisrc
= (const GLuint
*) src
;
2854 for (i
= 0; i
< n
; i
++) {
2855 GLuint p
= uisrc
[i
];
2856 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2857 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2858 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2859 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2863 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2865 rs
= 1.0F
/ 1023.0F
;
2866 gs
= 1.0F
/ 1023.0F
;
2867 bs
= 1.0F
/ 1023.0F
;
2871 const GLuint
*uisrc
= (const GLuint
*) src
;
2873 for (i
= 0; i
< n
; i
++) {
2874 GLuint p
= uisrc
[i
];
2876 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2877 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2878 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2879 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2883 const GLuint
*uisrc
= (const GLuint
*) src
;
2885 for (i
= 0; i
< n
; i
++) {
2886 GLuint p
= uisrc
[i
];
2887 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2888 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2889 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2890 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2894 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2896 const GLuint
*uisrc
= (const GLuint
*) src
;
2899 for (i
= 0; i
< n
; i
++) {
2900 GLuint p
= uisrc
[i
];
2902 rgb9e5_to_float3(p
, f
);
2903 rgba
[i
][rDst
] = f
[0];
2904 rgba
[i
][gDst
] = f
[1];
2905 rgba
[i
][bDst
] = f
[2];
2906 rgba
[i
][aDst
] = 1.0F
;
2910 const GLuint
*uisrc
= (const GLuint
*) src
;
2913 for (i
= 0; i
< n
; i
++) {
2914 rgb9e5_to_float3(uisrc
[i
], f
);
2915 rgba
[i
][rDst
] = f
[0];
2916 rgba
[i
][gDst
] = f
[1];
2917 rgba
[i
][bDst
] = f
[2];
2918 rgba
[i
][aDst
] = 1.0F
;
2922 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2924 const GLuint
*uisrc
= (const GLuint
*) src
;
2927 for (i
= 0; i
< n
; i
++) {
2928 GLuint p
= uisrc
[i
];
2930 r11g11b10f_to_float3(p
, f
);
2931 rgba
[i
][rDst
] = f
[0];
2932 rgba
[i
][gDst
] = f
[1];
2933 rgba
[i
][bDst
] = f
[2];
2934 rgba
[i
][aDst
] = 1.0F
;
2938 const GLuint
*uisrc
= (const GLuint
*) src
;
2941 for (i
= 0; i
< n
; i
++) {
2942 r11g11b10f_to_float3(uisrc
[i
], f
);
2943 rgba
[i
][rDst
] = f
[0];
2944 rgba
[i
][gDst
] = f
[1];
2945 rgba
[i
][bDst
] = f
[2];
2946 rgba
[i
][aDst
] = 1.0F
;
2951 _mesa_problem(NULL
, "bad srcType in extract float data");
2958 static inline GLuint
2959 clamp_byte_to_uint(GLbyte b
)
2961 return b
< 0 ? 0 : b
;
2965 static inline GLuint
2966 clamp_short_to_uint(GLshort s
)
2968 return s
< 0 ? 0 : s
;
2972 static inline GLuint
2973 clamp_int_to_uint(GLint i
)
2975 return i
< 0 ? 0 : i
;
2979 static inline GLuint
2980 clamp_float_to_uint(GLfloat f
)
2982 return f
< 0.0F
? 0 : IROUND(f
);
2986 static inline GLuint
2987 clamp_half_to_uint(GLhalfARB h
)
2989 GLfloat f
= _mesa_half_to_float(h
);
2990 return f
< 0.0F
? 0 : IROUND(f
);
2995 * \sa extract_float_rgba()
2998 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2999 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
3000 GLboolean swapBytes
)
3002 GLint rSrc
, gSrc
, bSrc
, aSrc
;
3004 GLint rDst
, bDst
, gDst
, aDst
;
3006 ASSERT(srcFormat
== GL_RED
||
3007 srcFormat
== GL_GREEN
||
3008 srcFormat
== GL_BLUE
||
3009 srcFormat
== GL_ALPHA
||
3010 srcFormat
== GL_LUMINANCE
||
3011 srcFormat
== GL_LUMINANCE_ALPHA
||
3012 srcFormat
== GL_INTENSITY
||
3013 srcFormat
== GL_RG
||
3014 srcFormat
== GL_RGB
||
3015 srcFormat
== GL_BGR
||
3016 srcFormat
== GL_RGBA
||
3017 srcFormat
== GL_BGRA
||
3018 srcFormat
== GL_ABGR_EXT
||
3019 srcFormat
== GL_DU8DV8_ATI
||
3020 srcFormat
== GL_DUDV_ATI
||
3021 srcFormat
== GL_RED_INTEGER_EXT
||
3022 srcFormat
== GL_GREEN_INTEGER_EXT
||
3023 srcFormat
== GL_BLUE_INTEGER_EXT
||
3024 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3025 srcFormat
== GL_RGB_INTEGER_EXT
||
3026 srcFormat
== GL_RGBA_INTEGER_EXT
||
3027 srcFormat
== GL_BGR_INTEGER_EXT
||
3028 srcFormat
== GL_BGRA_INTEGER_EXT
||
3029 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3030 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3032 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3033 srcType
== GL_BYTE
||
3034 srcType
== GL_UNSIGNED_SHORT
||
3035 srcType
== GL_SHORT
||
3036 srcType
== GL_UNSIGNED_INT
||
3037 srcType
== GL_INT
||
3038 srcType
== GL_HALF_FLOAT_ARB
||
3039 srcType
== GL_FLOAT
||
3040 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3041 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3042 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3043 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3044 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3045 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3046 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3047 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3048 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3049 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3050 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3051 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3052 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3053 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3055 get_component_mapping(srcFormat
,
3056 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3057 &rDst
, &gDst
, &bDst
, &aDst
);
3059 stride
= _mesa_components_in_format(srcFormat
);
3061 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3062 if ((SRC_INDEX) < 0) { \
3064 for (i = 0; i < n; i++) { \
3065 rgba[i][DST_INDEX] = DEFAULT; \
3068 else if (swapBytes) { \
3069 const TYPE *s = (const TYPE *) src; \
3071 for (i = 0; i < n; i++) { \
3072 TYPE value = s[SRC_INDEX]; \
3073 if (sizeof(TYPE) == 2) { \
3076 else if (sizeof(TYPE) == 4) { \
3079 rgba[i][DST_INDEX] = CONVERSION(value); \
3084 const TYPE *s = (const TYPE *) src; \
3086 for (i = 0; i < n; i++) { \
3087 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3093 case GL_UNSIGNED_BYTE
:
3094 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3095 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3096 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3097 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3100 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3101 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3102 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3103 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3105 case GL_UNSIGNED_SHORT
:
3106 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3107 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3108 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3109 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3112 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3113 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3114 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3115 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3117 case GL_UNSIGNED_INT
:
3118 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3119 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3120 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3121 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3124 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3125 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3126 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3127 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3130 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3131 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3132 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3133 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3135 case GL_HALF_FLOAT_ARB
:
3136 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3137 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3138 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3139 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3141 case GL_UNSIGNED_BYTE_3_3_2
:
3143 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3145 for (i
= 0; i
< n
; i
++) {
3146 GLubyte p
= ubsrc
[i
];
3147 rgba
[i
][rDst
] = ((p
>> 5) );
3148 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3149 rgba
[i
][bDst
] = ((p
) & 0x3);
3154 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3156 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3158 for (i
= 0; i
< n
; i
++) {
3159 GLubyte p
= ubsrc
[i
];
3160 rgba
[i
][rDst
] = ((p
) & 0x7);
3161 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3162 rgba
[i
][bDst
] = ((p
>> 6) );
3167 case GL_UNSIGNED_SHORT_5_6_5
:
3169 const GLushort
*ussrc
= (const GLushort
*) src
;
3171 for (i
= 0; i
< n
; i
++) {
3172 GLushort p
= ussrc
[i
];
3174 rgba
[i
][rDst
] = ((p
>> 11) );
3175 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3176 rgba
[i
][bDst
] = ((p
) & 0x1f);
3181 const GLushort
*ussrc
= (const GLushort
*) src
;
3183 for (i
= 0; i
< n
; i
++) {
3184 GLushort p
= ussrc
[i
];
3185 rgba
[i
][rDst
] = ((p
>> 11) );
3186 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3187 rgba
[i
][bDst
] = ((p
) & 0x1f);
3192 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3194 const GLushort
*ussrc
= (const GLushort
*) src
;
3196 for (i
= 0; i
< n
; i
++) {
3197 GLushort p
= ussrc
[i
];
3199 rgba
[i
][rDst
] = ((p
) & 0x1f);
3200 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3201 rgba
[i
][bDst
] = ((p
>> 11) );
3206 const GLushort
*ussrc
= (const GLushort
*) src
;
3208 for (i
= 0; i
< n
; i
++) {
3209 GLushort p
= ussrc
[i
];
3210 rgba
[i
][rDst
] = ((p
) & 0x1f);
3211 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3212 rgba
[i
][bDst
] = ((p
>> 11) );
3217 case GL_UNSIGNED_SHORT_4_4_4_4
:
3219 const GLushort
*ussrc
= (const GLushort
*) src
;
3221 for (i
= 0; i
< n
; i
++) {
3222 GLushort p
= ussrc
[i
];
3224 rgba
[i
][rDst
] = ((p
>> 12) );
3225 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3226 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3227 rgba
[i
][aDst
] = ((p
) & 0xf);
3231 const GLushort
*ussrc
= (const GLushort
*) src
;
3233 for (i
= 0; i
< n
; i
++) {
3234 GLushort p
= ussrc
[i
];
3235 rgba
[i
][rDst
] = ((p
>> 12) );
3236 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3237 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3238 rgba
[i
][aDst
] = ((p
) & 0xf);
3242 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3244 const GLushort
*ussrc
= (const GLushort
*) src
;
3246 for (i
= 0; i
< n
; i
++) {
3247 GLushort p
= ussrc
[i
];
3249 rgba
[i
][rDst
] = ((p
) & 0xf);
3250 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3251 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3252 rgba
[i
][aDst
] = ((p
>> 12) );
3256 const GLushort
*ussrc
= (const GLushort
*) src
;
3258 for (i
= 0; i
< n
; i
++) {
3259 GLushort p
= ussrc
[i
];
3260 rgba
[i
][rDst
] = ((p
) & 0xf);
3261 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3262 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3263 rgba
[i
][aDst
] = ((p
>> 12) );
3267 case GL_UNSIGNED_SHORT_5_5_5_1
:
3269 const GLushort
*ussrc
= (const GLushort
*) src
;
3271 for (i
= 0; i
< n
; i
++) {
3272 GLushort p
= ussrc
[i
];
3274 rgba
[i
][rDst
] = ((p
>> 11) );
3275 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3276 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3277 rgba
[i
][aDst
] = ((p
) & 0x1 );
3281 const GLushort
*ussrc
= (const GLushort
*) src
;
3283 for (i
= 0; i
< n
; i
++) {
3284 GLushort p
= ussrc
[i
];
3285 rgba
[i
][rDst
] = ((p
>> 11) );
3286 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3287 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3288 rgba
[i
][aDst
] = ((p
) & 0x1 );
3292 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3294 const GLushort
*ussrc
= (const GLushort
*) src
;
3296 for (i
= 0; i
< n
; i
++) {
3297 GLushort p
= ussrc
[i
];
3299 rgba
[i
][rDst
] = ((p
) & 0x1f);
3300 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3301 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3302 rgba
[i
][aDst
] = ((p
>> 15) );
3306 const GLushort
*ussrc
= (const GLushort
*) src
;
3308 for (i
= 0; i
< n
; i
++) {
3309 GLushort p
= ussrc
[i
];
3310 rgba
[i
][rDst
] = ((p
) & 0x1f);
3311 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3312 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3313 rgba
[i
][aDst
] = ((p
>> 15) );
3317 case GL_UNSIGNED_INT_8_8_8_8
:
3319 const GLuint
*uisrc
= (const GLuint
*) src
;
3321 for (i
= 0; i
< n
; i
++) {
3322 GLuint p
= uisrc
[i
];
3323 rgba
[i
][rDst
] = ((p
) & 0xff);
3324 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3325 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3326 rgba
[i
][aDst
] = ((p
>> 24) );
3330 const GLuint
*uisrc
= (const GLuint
*) src
;
3332 for (i
= 0; i
< n
; i
++) {
3333 GLuint p
= uisrc
[i
];
3334 rgba
[i
][rDst
] = ((p
>> 24) );
3335 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3336 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3337 rgba
[i
][aDst
] = ((p
) & 0xff);
3341 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3343 const GLuint
*uisrc
= (const GLuint
*) src
;
3345 for (i
= 0; i
< n
; i
++) {
3346 GLuint p
= uisrc
[i
];
3347 rgba
[i
][rDst
] = ((p
>> 24) );
3348 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3349 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3350 rgba
[i
][aDst
] = ((p
) & 0xff);
3354 const GLuint
*uisrc
= (const GLuint
*) src
;
3356 for (i
= 0; i
< n
; i
++) {
3357 GLuint p
= uisrc
[i
];
3358 rgba
[i
][rDst
] = ((p
) & 0xff);
3359 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3360 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3361 rgba
[i
][aDst
] = ((p
>> 24) );
3365 case GL_UNSIGNED_INT_10_10_10_2
:
3367 const GLuint
*uisrc
= (const GLuint
*) src
;
3369 for (i
= 0; i
< n
; i
++) {
3370 GLuint p
= uisrc
[i
];
3372 rgba
[i
][rDst
] = ((p
>> 22) );
3373 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3374 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3375 rgba
[i
][aDst
] = ((p
) & 0x3 );
3379 const GLuint
*uisrc
= (const GLuint
*) src
;
3381 for (i
= 0; i
< n
; i
++) {
3382 GLuint p
= uisrc
[i
];
3383 rgba
[i
][rDst
] = ((p
>> 22) );
3384 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3385 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3386 rgba
[i
][aDst
] = ((p
) & 0x3 );
3390 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3392 const GLuint
*uisrc
= (const GLuint
*) src
;
3394 for (i
= 0; i
< n
; i
++) {
3395 GLuint p
= uisrc
[i
];
3397 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3398 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3399 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3400 rgba
[i
][aDst
] = ((p
>> 30) );
3404 const GLuint
*uisrc
= (const GLuint
*) src
;
3406 for (i
= 0; i
< n
; i
++) {
3407 GLuint p
= uisrc
[i
];
3408 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3409 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3410 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3411 rgba
[i
][aDst
] = ((p
>> 30) );
3415 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3417 const GLuint
*uisrc
= (const GLuint
*) src
;
3420 for (i
= 0; i
< n
; i
++) {
3421 GLuint p
= uisrc
[i
];
3423 rgb9e5_to_float3(p
, f
);
3424 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3425 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3426 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3431 const GLuint
*uisrc
= (const GLuint
*) src
;
3434 for (i
= 0; i
< n
; i
++) {
3435 GLuint p
= uisrc
[i
];
3436 rgb9e5_to_float3(p
, f
);
3437 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3438 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3439 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3444 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3446 const GLuint
*uisrc
= (const GLuint
*) src
;
3449 for (i
= 0; i
< n
; i
++) {
3450 GLuint p
= uisrc
[i
];
3452 r11g11b10f_to_float3(p
, f
);
3453 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3454 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3455 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3460 const GLuint
*uisrc
= (const GLuint
*) src
;
3463 for (i
= 0; i
< n
; i
++) {
3464 GLuint p
= uisrc
[i
];
3465 r11g11b10f_to_float3(p
, f
);
3466 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3467 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3468 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3474 _mesa_problem(NULL
, "bad srcType in extract uint data");
3483 * Unpack a row of color image data from a client buffer according to
3484 * the pixel unpacking parameters.
3485 * Return GLubyte values in the specified dest image format.
3486 * This is used by glDrawPixels and glTexImage?D().
3487 * \param ctx - the context
3488 * n - number of pixels in the span
3489 * dstFormat - format of destination color array
3490 * dest - the destination color array
3491 * srcFormat - source image format
3492 * srcType - source image data type
3493 * source - source image pointer
3494 * srcPacking - pixel unpacking parameters
3495 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3497 * XXX perhaps expand this to process whole images someday.
3500 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3501 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3502 GLenum srcFormat
, GLenum srcType
,
3503 const GLvoid
*source
,
3504 const struct gl_pixelstore_attrib
*srcPacking
,
3505 GLbitfield transferOps
)
3507 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3508 ASSERT(dstFormat
== GL_ALPHA
||
3509 dstFormat
== GL_LUMINANCE
||
3510 dstFormat
== GL_LUMINANCE_ALPHA
||
3511 dstFormat
== GL_INTENSITY
||
3512 dstFormat
== GL_RED
||
3513 dstFormat
== GL_RG
||
3514 dstFormat
== GL_RGB
||
3515 dstFormat
== GL_RGBA
);
3517 ASSERT(srcFormat
== GL_RED
||
3518 srcFormat
== GL_GREEN
||
3519 srcFormat
== GL_BLUE
||
3520 srcFormat
== GL_ALPHA
||
3521 srcFormat
== GL_LUMINANCE
||
3522 srcFormat
== GL_LUMINANCE_ALPHA
||
3523 srcFormat
== GL_INTENSITY
||
3524 srcFormat
== GL_RG
||
3525 srcFormat
== GL_RGB
||
3526 srcFormat
== GL_BGR
||
3527 srcFormat
== GL_RGBA
||
3528 srcFormat
== GL_BGRA
||
3529 srcFormat
== GL_ABGR_EXT
||
3530 srcFormat
== GL_COLOR_INDEX
);
3532 ASSERT(srcType
== GL_BITMAP
||
3533 srcType
== GL_UNSIGNED_BYTE
||
3534 srcType
== GL_BYTE
||
3535 srcType
== GL_UNSIGNED_SHORT
||
3536 srcType
== GL_SHORT
||
3537 srcType
== GL_UNSIGNED_INT
||
3538 srcType
== GL_INT
||
3539 srcType
== GL_HALF_FLOAT_ARB
||
3540 srcType
== GL_FLOAT
||
3541 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3542 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3543 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3544 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3545 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3546 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3547 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3548 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3549 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3550 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3551 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3552 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3553 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3554 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3556 /* EXT_texture_integer specifies no transfer ops on integer
3557 * types in the resolved issues section. Just set them to 0
3558 * for integer surfaces.
3563 /* Try simple cases first */
3564 if (transferOps
== 0) {
3565 if (srcType
== GL_UNSIGNED_BYTE
) {
3566 if (dstFormat
== GL_RGBA
) {
3567 if (srcFormat
== GL_RGBA
) {
3568 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3571 else if (srcFormat
== GL_RGB
) {
3573 const GLubyte
*src
= (const GLubyte
*) source
;
3574 GLubyte
*dst
= dest
;
3575 for (i
= 0; i
< n
; i
++) {
3586 else if (dstFormat
== GL_RGB
) {
3587 if (srcFormat
== GL_RGB
) {
3588 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3591 else if (srcFormat
== GL_RGBA
) {
3593 const GLubyte
*src
= (const GLubyte
*) source
;
3594 GLubyte
*dst
= dest
;
3595 for (i
= 0; i
< n
; i
++) {
3605 else if (dstFormat
== srcFormat
) {
3606 GLint comps
= _mesa_components_in_format(srcFormat
);
3608 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3613 * Common situation, loading 8bit RGBA/RGB source images
3614 * into 16/32 bit destination. (OSMesa16/32)
3616 else if (srcType
== GL_UNSIGNED_BYTE
) {
3617 if (dstFormat
== GL_RGBA
) {
3618 if (srcFormat
== GL_RGB
) {
3620 const GLubyte
*src
= (const GLubyte
*) source
;
3621 GLubyte
*dst
= dest
;
3622 for (i
= 0; i
< n
; i
++) {
3632 else if (srcFormat
== GL_RGBA
) {
3634 const GLubyte
*src
= (const GLubyte
*) source
;
3635 GLubyte
*dst
= dest
;
3636 for (i
= 0; i
< n
; i
++) {
3647 else if (dstFormat
== GL_RGB
) {
3648 if (srcFormat
== GL_RGB
) {
3650 const GLubyte
*src
= (const GLubyte
*) source
;
3651 GLubyte
*dst
= dest
;
3652 for (i
= 0; i
< n
; i
++) {
3661 else if (srcFormat
== GL_RGBA
) {
3663 const GLubyte
*src
= (const GLubyte
*) source
;
3664 GLubyte
*dst
= dest
;
3665 for (i
= 0; i
< n
; i
++) {
3679 /* general solution begins here */
3681 GLint dstComponents
;
3682 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3683 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3686 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3690 dstComponents
= _mesa_components_in_format( dstFormat
);
3691 /* source & dest image formats should have been error checked by now */
3692 assert(dstComponents
> 0);
3695 * Extract image data and convert to RGBA floats
3697 if (srcFormat
== GL_COLOR_INDEX
) {
3698 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3701 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3706 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3709 /* Convert indexes to RGBA */
3710 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3711 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3713 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3715 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3716 * with color indexes.
3718 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3723 /* non-color index data */
3724 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3725 srcPacking
->SwapBytes
);
3728 /* Need to clamp if returning GLubytes */
3729 transferOps
|= IMAGE_CLAMP_BIT
;
3732 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3735 get_component_indexes(dstFormat
,
3736 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3738 /* Now return the GLubyte data in the requested dstFormat */
3740 GLubyte
*dst
= dest
;
3742 for (i
= 0; i
< n
; i
++) {
3743 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3744 dst
+= dstComponents
;
3749 GLubyte
*dst
= dest
;
3751 for (i
= 0; i
< n
; i
++) {
3752 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3753 dst
+= dstComponents
;
3758 GLubyte
*dst
= dest
;
3760 for (i
= 0; i
< n
; i
++) {
3761 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3762 dst
+= dstComponents
;
3767 GLubyte
*dst
= dest
;
3769 for (i
= 0; i
< n
; i
++) {
3770 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3771 dst
+= dstComponents
;
3776 GLubyte
*dst
= dest
;
3779 assert(dstComponents
== 1);
3780 for (i
= 0; i
< n
; i
++) {
3781 /* Intensity comes from red channel */
3782 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3787 GLubyte
*dst
= dest
;
3790 for (i
= 0; i
< n
; i
++) {
3791 /* Luminance comes from red channel */
3792 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3793 dst
+= dstComponents
;
3803 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3804 * instead of GLubyte.
3807 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3808 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3809 GLenum srcFormat
, GLenum srcType
,
3810 const GLvoid
*source
,
3811 const struct gl_pixelstore_attrib
*srcPacking
,
3812 GLbitfield transferOps
)
3814 ASSERT(dstFormat
== GL_ALPHA
||
3815 dstFormat
== GL_LUMINANCE
||
3816 dstFormat
== GL_LUMINANCE_ALPHA
||
3817 dstFormat
== GL_INTENSITY
||
3818 dstFormat
== GL_RED
||
3819 dstFormat
== GL_RG
||
3820 dstFormat
== GL_RGB
||
3821 dstFormat
== GL_RGBA
);
3823 ASSERT(srcFormat
== GL_RED
||
3824 srcFormat
== GL_GREEN
||
3825 srcFormat
== GL_BLUE
||
3826 srcFormat
== GL_ALPHA
||
3827 srcFormat
== GL_LUMINANCE
||
3828 srcFormat
== GL_LUMINANCE_ALPHA
||
3829 srcFormat
== GL_INTENSITY
||
3830 srcFormat
== GL_RG
||
3831 srcFormat
== GL_RGB
||
3832 srcFormat
== GL_BGR
||
3833 srcFormat
== GL_RGBA
||
3834 srcFormat
== GL_BGRA
||
3835 srcFormat
== GL_ABGR_EXT
||
3836 srcFormat
== GL_RED_INTEGER_EXT
||
3837 srcFormat
== GL_GREEN_INTEGER_EXT
||
3838 srcFormat
== GL_BLUE_INTEGER_EXT
||
3839 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3840 srcFormat
== GL_RGB_INTEGER_EXT
||
3841 srcFormat
== GL_RGBA_INTEGER_EXT
||
3842 srcFormat
== GL_BGR_INTEGER_EXT
||
3843 srcFormat
== GL_BGRA_INTEGER_EXT
||
3844 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3845 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3846 srcFormat
== GL_COLOR_INDEX
);
3848 ASSERT(srcType
== GL_BITMAP
||
3849 srcType
== GL_UNSIGNED_BYTE
||
3850 srcType
== GL_BYTE
||
3851 srcType
== GL_UNSIGNED_SHORT
||
3852 srcType
== GL_SHORT
||
3853 srcType
== GL_UNSIGNED_INT
||
3854 srcType
== GL_INT
||
3855 srcType
== GL_HALF_FLOAT_ARB
||
3856 srcType
== GL_FLOAT
||
3857 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3858 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3859 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3860 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3861 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3862 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3863 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3864 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3865 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3866 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3867 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3868 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3869 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3870 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3872 /* general solution, no special cases, yet */
3874 GLint dstComponents
;
3875 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3876 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3877 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3880 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3884 dstComponents
= _mesa_components_in_format( dstFormat
);
3885 /* source & dest image formats should have been error checked by now */
3886 assert(dstComponents
> 0);
3888 /* EXT_texture_integer specifies no transfer ops on integer
3889 * types in the resolved issues section. Just set them to 0
3890 * for integer surfaces.
3896 * Extract image data and convert to RGBA floats
3898 if (srcFormat
== GL_COLOR_INDEX
) {
3899 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3902 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3907 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3910 /* Convert indexes to RGBA */
3911 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3912 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3914 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3916 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3917 * with color indexes.
3919 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3924 /* non-color index data */
3925 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3926 srcPacking
->SwapBytes
);
3930 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3933 get_component_indexes(dstFormat
,
3934 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3936 /* Now pack results in the requested dstFormat */
3938 GLfloat
*dst
= dest
;
3940 for (i
= 0; i
< n
; i
++) {
3941 dst
[rDst
] = rgba
[i
][RCOMP
];
3942 dst
+= dstComponents
;
3947 GLfloat
*dst
= dest
;
3949 for (i
= 0; i
< n
; i
++) {
3950 dst
[gDst
] = rgba
[i
][GCOMP
];
3951 dst
+= dstComponents
;
3956 GLfloat
*dst
= dest
;
3958 for (i
= 0; i
< n
; i
++) {
3959 dst
[bDst
] = rgba
[i
][BCOMP
];
3960 dst
+= dstComponents
;
3965 GLfloat
*dst
= dest
;
3967 for (i
= 0; i
< n
; i
++) {
3968 dst
[aDst
] = rgba
[i
][ACOMP
];
3969 dst
+= dstComponents
;
3974 GLfloat
*dst
= dest
;
3977 assert(dstComponents
== 1);
3978 for (i
= 0; i
< n
; i
++) {
3979 /* Intensity comes from red channel */
3980 dst
[i
] = rgba
[i
][RCOMP
];
3985 GLfloat
*dst
= dest
;
3988 for (i
= 0; i
< n
; i
++) {
3989 /* Luminance comes from red channel */
3990 dst
[0] = rgba
[i
][RCOMP
];
3991 dst
+= dstComponents
;
4001 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
4002 * instead of GLubyte.
4003 * No pixel transfer ops are applied.
4006 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
4007 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
4008 GLenum srcFormat
, GLenum srcType
,
4009 const GLvoid
*source
,
4010 const struct gl_pixelstore_attrib
*srcPacking
)
4012 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
4015 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4019 ASSERT(dstFormat
== GL_ALPHA
||
4020 dstFormat
== GL_LUMINANCE
||
4021 dstFormat
== GL_LUMINANCE_ALPHA
||
4022 dstFormat
== GL_INTENSITY
||
4023 dstFormat
== GL_RED
||
4024 dstFormat
== GL_RG
||
4025 dstFormat
== GL_RGB
||
4026 dstFormat
== GL_RGBA
);
4028 ASSERT(srcFormat
== GL_RED
||
4029 srcFormat
== GL_GREEN
||
4030 srcFormat
== GL_BLUE
||
4031 srcFormat
== GL_ALPHA
||
4032 srcFormat
== GL_LUMINANCE
||
4033 srcFormat
== GL_LUMINANCE_ALPHA
||
4034 srcFormat
== GL_INTENSITY
||
4035 srcFormat
== GL_RG
||
4036 srcFormat
== GL_RGB
||
4037 srcFormat
== GL_BGR
||
4038 srcFormat
== GL_RGBA
||
4039 srcFormat
== GL_BGRA
||
4040 srcFormat
== GL_ABGR_EXT
||
4041 srcFormat
== GL_RED_INTEGER_EXT
||
4042 srcFormat
== GL_GREEN_INTEGER_EXT
||
4043 srcFormat
== GL_BLUE_INTEGER_EXT
||
4044 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4045 srcFormat
== GL_RGB_INTEGER_EXT
||
4046 srcFormat
== GL_RGBA_INTEGER_EXT
||
4047 srcFormat
== GL_BGR_INTEGER_EXT
||
4048 srcFormat
== GL_BGRA_INTEGER_EXT
||
4049 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4050 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4052 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4053 srcType
== GL_BYTE
||
4054 srcType
== GL_UNSIGNED_SHORT
||
4055 srcType
== GL_SHORT
||
4056 srcType
== GL_UNSIGNED_INT
||
4057 srcType
== GL_INT
||
4058 srcType
== GL_HALF_FLOAT_ARB
||
4059 srcType
== GL_FLOAT
||
4060 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4061 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4062 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4063 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4064 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4065 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4066 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4067 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4068 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4069 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4070 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4071 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4072 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4073 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4076 /* Extract image data as uint[4] pixels */
4077 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4078 srcPacking
->SwapBytes
);
4080 if (dstFormat
== GL_RGBA
) {
4082 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4086 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4087 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4089 assert(dstComponents
> 0);
4091 get_component_indexes(dstFormat
,
4092 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4094 /* Now pack values in the requested dest format */
4098 for (i
= 0; i
< n
; i
++) {
4099 dst
[rDst
] = rgba
[i
][RCOMP
];
4100 dst
+= dstComponents
;
4107 for (i
= 0; i
< n
; i
++) {
4108 dst
[gDst
] = rgba
[i
][GCOMP
];
4109 dst
+= dstComponents
;
4116 for (i
= 0; i
< n
; i
++) {
4117 dst
[bDst
] = rgba
[i
][BCOMP
];
4118 dst
+= dstComponents
;
4125 for (i
= 0; i
< n
; i
++) {
4126 dst
[aDst
] = rgba
[i
][ACOMP
];
4127 dst
+= dstComponents
;
4135 assert(dstComponents
== 1);
4136 for (i
= 0; i
< n
; i
++) {
4137 /* Intensity comes from red channel */
4138 dst
[i
] = rgba
[i
][RCOMP
];
4146 for (i
= 0; i
< n
; i
++) {
4147 /* Luminance comes from red channel */
4148 dst
[0] = rgba
[i
][RCOMP
];
4149 dst
+= dstComponents
;
4160 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4161 * directly return GLbyte data, no transfer ops apply.
4164 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4165 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4166 GLenum srcFormat
, GLenum srcType
,
4167 const GLvoid
*source
,
4168 const struct gl_pixelstore_attrib
*srcPacking
,
4169 GLbitfield transferOps
)
4171 ASSERT(dstFormat
== GL_DUDV_ATI
);
4172 ASSERT(srcFormat
== GL_DUDV_ATI
||
4173 srcFormat
== GL_DU8DV8_ATI
);
4175 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4176 srcType
== GL_BYTE
||
4177 srcType
== GL_UNSIGNED_SHORT
||
4178 srcType
== GL_SHORT
||
4179 srcType
== GL_UNSIGNED_INT
||
4180 srcType
== GL_INT
||
4181 srcType
== GL_HALF_FLOAT_ARB
||
4182 srcType
== GL_FLOAT
);
4184 /* general solution */
4186 GLint dstComponents
;
4189 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4192 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4196 dstComponents
= _mesa_components_in_format( dstFormat
);
4197 /* source & dest image formats should have been error checked by now */
4198 assert(dstComponents
> 0);
4201 * Extract image data and convert to RGBA floats
4203 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4204 srcPacking
->SwapBytes
);
4207 /* Now determine which color channels we need to produce.
4208 * And determine the dest index (offset) within each color tuple.
4211 /* Now pack results in the requested dstFormat */
4212 for (i
= 0; i
< n
; i
++) {
4213 /* not sure - need clamp[-1,1] here? */
4214 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4215 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4216 dst
+= dstComponents
;
4224 * Unpack a row of color index data from a client buffer according to
4225 * the pixel unpacking parameters.
4226 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4228 * Args: ctx - the context
4229 * n - number of pixels
4230 * dstType - destination data type
4231 * dest - destination array
4232 * srcType - source pixel type
4233 * source - source data pointer
4234 * srcPacking - pixel unpacking parameters
4235 * transferOps - the pixel transfer operations to apply
4238 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4239 GLenum dstType
, GLvoid
*dest
,
4240 GLenum srcType
, const GLvoid
*source
,
4241 const struct gl_pixelstore_attrib
*srcPacking
,
4242 GLbitfield transferOps
)
4244 ASSERT(srcType
== GL_BITMAP
||
4245 srcType
== GL_UNSIGNED_BYTE
||
4246 srcType
== GL_BYTE
||
4247 srcType
== GL_UNSIGNED_SHORT
||
4248 srcType
== GL_SHORT
||
4249 srcType
== GL_UNSIGNED_INT
||
4250 srcType
== GL_INT
||
4251 srcType
== GL_HALF_FLOAT_ARB
||
4252 srcType
== GL_FLOAT
);
4254 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4255 dstType
== GL_UNSIGNED_SHORT
||
4256 dstType
== GL_UNSIGNED_INT
);
4259 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4262 * Try simple cases first
4264 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4265 && dstType
== GL_UNSIGNED_BYTE
) {
4266 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4268 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4269 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4270 memcpy(dest
, source
, n
* sizeof(GLuint
));
4276 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4279 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4283 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4287 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4289 /* convert to dest type */
4291 case GL_UNSIGNED_BYTE
:
4293 GLubyte
*dst
= (GLubyte
*) dest
;
4295 for (i
= 0; i
< n
; i
++) {
4296 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4300 case GL_UNSIGNED_SHORT
:
4302 GLuint
*dst
= (GLuint
*) dest
;
4304 for (i
= 0; i
< n
; i
++) {
4305 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4309 case GL_UNSIGNED_INT
:
4310 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4313 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4322 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4323 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4324 const struct gl_pixelstore_attrib
*dstPacking
,
4325 GLbitfield transferOps
)
4327 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4330 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4334 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4336 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4337 /* make a copy of input */
4338 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4339 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4344 case GL_UNSIGNED_BYTE
:
4346 GLubyte
*dst
= (GLubyte
*) dest
;
4348 for (i
= 0; i
< n
; i
++) {
4349 *dst
++ = (GLubyte
) source
[i
];
4355 GLbyte
*dst
= (GLbyte
*) dest
;
4357 for (i
= 0; i
< n
; i
++) {
4358 dst
[i
] = (GLbyte
) source
[i
];
4362 case GL_UNSIGNED_SHORT
:
4364 GLushort
*dst
= (GLushort
*) dest
;
4366 for (i
= 0; i
< n
; i
++) {
4367 dst
[i
] = (GLushort
) source
[i
];
4369 if (dstPacking
->SwapBytes
) {
4370 _mesa_swap2( (GLushort
*) dst
, n
);
4376 GLshort
*dst
= (GLshort
*) dest
;
4378 for (i
= 0; i
< n
; i
++) {
4379 dst
[i
] = (GLshort
) source
[i
];
4381 if (dstPacking
->SwapBytes
) {
4382 _mesa_swap2( (GLushort
*) dst
, n
);
4386 case GL_UNSIGNED_INT
:
4388 GLuint
*dst
= (GLuint
*) dest
;
4390 for (i
= 0; i
< n
; i
++) {
4391 dst
[i
] = (GLuint
) source
[i
];
4393 if (dstPacking
->SwapBytes
) {
4394 _mesa_swap4( (GLuint
*) dst
, n
);
4400 GLint
*dst
= (GLint
*) dest
;
4402 for (i
= 0; i
< n
; i
++) {
4403 dst
[i
] = (GLint
) source
[i
];
4405 if (dstPacking
->SwapBytes
) {
4406 _mesa_swap4( (GLuint
*) dst
, n
);
4412 GLfloat
*dst
= (GLfloat
*) dest
;
4414 for (i
= 0; i
< n
; i
++) {
4415 dst
[i
] = (GLfloat
) source
[i
];
4417 if (dstPacking
->SwapBytes
) {
4418 _mesa_swap4( (GLuint
*) dst
, n
);
4422 case GL_HALF_FLOAT_ARB
:
4424 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4426 for (i
= 0; i
< n
; i
++) {
4427 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4429 if (dstPacking
->SwapBytes
) {
4430 _mesa_swap2( (GLushort
*) dst
, n
);
4435 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4443 * Unpack a row of stencil data from a client buffer according to
4444 * the pixel unpacking parameters.
4445 * This is (or will be) used by glDrawPixels
4447 * Args: ctx - the context
4448 * n - number of pixels
4449 * dstType - destination data type
4450 * dest - destination array
4451 * srcType - source pixel type
4452 * source - source data pointer
4453 * srcPacking - pixel unpacking parameters
4454 * transferOps - apply offset/bias/lookup ops?
4457 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4458 GLenum dstType
, GLvoid
*dest
,
4459 GLenum srcType
, const GLvoid
*source
,
4460 const struct gl_pixelstore_attrib
*srcPacking
,
4461 GLbitfield transferOps
)
4463 ASSERT(srcType
== GL_BITMAP
||
4464 srcType
== GL_UNSIGNED_BYTE
||
4465 srcType
== GL_BYTE
||
4466 srcType
== GL_UNSIGNED_SHORT
||
4467 srcType
== GL_SHORT
||
4468 srcType
== GL_UNSIGNED_INT
||
4469 srcType
== GL_INT
||
4470 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4471 srcType
== GL_HALF_FLOAT_ARB
||
4472 srcType
== GL_FLOAT
||
4473 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4475 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4476 dstType
== GL_UNSIGNED_SHORT
||
4477 dstType
== GL_UNSIGNED_INT
||
4478 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4480 /* only shift and offset apply to stencil */
4481 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4484 * Try simple cases first
4486 if (transferOps
== 0 &&
4487 !ctx
->Pixel
.MapStencilFlag
&&
4488 srcType
== GL_UNSIGNED_BYTE
&&
4489 dstType
== GL_UNSIGNED_BYTE
) {
4490 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4492 else if (transferOps
== 0 &&
4493 !ctx
->Pixel
.MapStencilFlag
&&
4494 srcType
== GL_UNSIGNED_INT
&&
4495 dstType
== GL_UNSIGNED_INT
&&
4496 !srcPacking
->SwapBytes
) {
4497 memcpy(dest
, source
, n
* sizeof(GLuint
));
4503 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4506 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4510 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4513 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4514 /* shift and offset indexes */
4515 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4518 if (ctx
->Pixel
.MapStencilFlag
) {
4519 /* Apply stencil lookup table */
4520 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4522 for (i
= 0; i
< n
; i
++) {
4523 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4527 /* convert to dest type */
4529 case GL_UNSIGNED_BYTE
:
4531 GLubyte
*dst
= (GLubyte
*) dest
;
4533 for (i
= 0; i
< n
; i
++) {
4534 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4538 case GL_UNSIGNED_SHORT
:
4540 GLuint
*dst
= (GLuint
*) dest
;
4542 for (i
= 0; i
< n
; i
++) {
4543 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4547 case GL_UNSIGNED_INT
:
4548 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4550 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4552 GLuint
*dst
= (GLuint
*) dest
;
4554 for (i
= 0; i
< n
; i
++) {
4555 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4560 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4569 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4570 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4571 const struct gl_pixelstore_attrib
*dstPacking
)
4573 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4576 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4580 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4581 ctx
->Pixel
.MapStencilFlag
) {
4582 /* make a copy of input */
4583 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4584 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4589 case GL_UNSIGNED_BYTE
:
4590 memcpy(dest
, source
, n
);
4594 GLbyte
*dst
= (GLbyte
*) dest
;
4597 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4601 case GL_UNSIGNED_SHORT
:
4603 GLushort
*dst
= (GLushort
*) dest
;
4606 dst
[i
] = (GLushort
) source
[i
];
4608 if (dstPacking
->SwapBytes
) {
4609 _mesa_swap2( (GLushort
*) dst
, n
);
4615 GLshort
*dst
= (GLshort
*) dest
;
4618 dst
[i
] = (GLshort
) source
[i
];
4620 if (dstPacking
->SwapBytes
) {
4621 _mesa_swap2( (GLushort
*) dst
, n
);
4625 case GL_UNSIGNED_INT
:
4627 GLuint
*dst
= (GLuint
*) dest
;
4630 dst
[i
] = (GLuint
) source
[i
];
4632 if (dstPacking
->SwapBytes
) {
4633 _mesa_swap4( (GLuint
*) dst
, n
);
4639 GLint
*dst
= (GLint
*) dest
;
4642 dst
[i
] = (GLint
) source
[i
];
4644 if (dstPacking
->SwapBytes
) {
4645 _mesa_swap4( (GLuint
*) dst
, n
);
4651 GLfloat
*dst
= (GLfloat
*) dest
;
4654 dst
[i
] = (GLfloat
) source
[i
];
4656 if (dstPacking
->SwapBytes
) {
4657 _mesa_swap4( (GLuint
*) dst
, n
);
4661 case GL_HALF_FLOAT_ARB
:
4663 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4666 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4668 if (dstPacking
->SwapBytes
) {
4669 _mesa_swap2( (GLushort
*) dst
, n
);
4674 if (dstPacking
->LsbFirst
) {
4675 GLubyte
*dst
= (GLubyte
*) dest
;
4678 for (i
= 0; i
< n
; i
++) {
4681 *dst
|= ((source
[i
] != 0) << shift
);
4690 GLubyte
*dst
= (GLubyte
*) dest
;
4693 for (i
= 0; i
< n
; i
++) {
4696 *dst
|= ((source
[i
] != 0) << shift
);
4706 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4712 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4715 const GLTYPE *src = (const GLTYPE *)source; \
4716 for (i = 0; i < n; i++) { \
4717 GLTYPE value = src[i]; \
4718 if (srcPacking->SwapBytes) { \
4719 if (sizeof(GLTYPE) == 2) { \
4721 } else if (sizeof(GLTYPE) == 4) { \
4725 depthValues[i] = GLTYPE2FLOAT(value); \
4731 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4732 * or GLfloat values.
4733 * The glPixelTransfer (scale/bias) params will be applied.
4735 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4736 * \param depthMax max value for returned GLushort or GLuint values
4737 * (ignored for GLfloat).
4740 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4741 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4742 GLenum srcType
, const GLvoid
*source
,
4743 const struct gl_pixelstore_attrib
*srcPacking
)
4745 GLfloat
*depthTemp
= NULL
, *depthValues
;
4746 GLboolean needClamp
= GL_FALSE
;
4748 /* Look for special cases first.
4749 * Not only are these faster, they're less prone to numeric conversion
4750 * problems. Otherwise, converting from an int type to a float then
4751 * back to an int type can introduce errors that will show up as
4752 * artifacts in things like depth peeling which uses glCopyTexImage.
4754 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4755 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4756 const GLuint
*src
= (const GLuint
*) source
;
4757 GLushort
*dst
= (GLushort
*) dest
;
4759 for (i
= 0; i
< n
; i
++) {
4760 dst
[i
] = src
[i
] >> 16;
4764 if (srcType
== GL_UNSIGNED_SHORT
4765 && dstType
== GL_UNSIGNED_INT
4766 && depthMax
== 0xffffffff) {
4767 const GLushort
*src
= (const GLushort
*) source
;
4768 GLuint
*dst
= (GLuint
*) dest
;
4770 for (i
= 0; i
< n
; i
++) {
4771 dst
[i
] = src
[i
] | (src
[i
] << 16);
4775 if (srcType
== GL_UNSIGNED_INT_24_8
4776 && dstType
== GL_UNSIGNED_INT
4777 && depthMax
== 0xffffff) {
4778 const GLuint
*src
= (const GLuint
*) source
;
4779 GLuint
*dst
= (GLuint
*) dest
;
4781 for (i
= 0; i
< n
; i
++) {
4782 dst
[i
] = src
[i
] >> 8;
4786 /* XXX may want to add additional cases here someday */
4789 /* general case path follows */
4791 if (dstType
== GL_FLOAT
) {
4792 depthValues
= (GLfloat
*) dest
;
4795 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4797 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4801 depthValues
= depthTemp
;
4804 /* Convert incoming values to GLfloat. Some conversions will require
4809 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4810 needClamp
= GL_TRUE
;
4812 case GL_UNSIGNED_BYTE
:
4813 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4816 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4817 needClamp
= GL_TRUE
;
4819 case GL_UNSIGNED_SHORT
:
4820 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4823 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4824 needClamp
= GL_TRUE
;
4826 case GL_UNSIGNED_INT
:
4827 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4829 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4830 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4831 depthMax
== 0xffffff &&
4832 ctx
->Pixel
.DepthScale
== 1.0 &&
4833 ctx
->Pixel
.DepthBias
== 0.0) {
4834 const GLuint
*src
= (const GLuint
*) source
;
4835 GLuint
*zValues
= (GLuint
*) dest
;
4837 for (i
= 0; i
< n
; i
++) {
4838 GLuint value
= src
[i
];
4839 if (srcPacking
->SwapBytes
) {
4842 zValues
[i
] = value
& 0xffffff00;
4848 const GLuint
*src
= (const GLuint
*) source
;
4849 const GLfloat scale
= 1.0f
/ 0xffffff;
4851 for (i
= 0; i
< n
; i
++) {
4852 GLuint value
= src
[i
];
4853 if (srcPacking
->SwapBytes
) {
4856 depthValues
[i
] = (value
>> 8) * scale
;
4860 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4863 const GLfloat
*src
= (const GLfloat
*)source
;
4864 for (i
= 0; i
< n
; i
++) {
4865 GLfloat value
= src
[i
* 2];
4866 if (srcPacking
->SwapBytes
) {
4869 depthValues
[i
] = value
;
4871 needClamp
= GL_TRUE
;
4875 DEPTH_VALUES(GLfloat
, 1*);
4876 needClamp
= GL_TRUE
;
4878 case GL_HALF_FLOAT_ARB
:
4881 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4882 for (i
= 0; i
< n
; i
++) {
4883 GLhalfARB value
= src
[i
];
4884 if (srcPacking
->SwapBytes
) {
4887 depthValues
[i
] = _mesa_half_to_float(value
);
4889 needClamp
= GL_TRUE
;
4893 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4898 /* apply depth scale and bias */
4900 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4901 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4902 if (scale
!= 1.0 || bias
!= 0.0) {
4904 for (i
= 0; i
< n
; i
++) {
4905 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4907 needClamp
= GL_TRUE
;
4911 /* clamp to [0, 1] */
4914 for (i
= 0; i
< n
; i
++) {
4915 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4920 * Convert values to dstType
4922 if (dstType
== GL_UNSIGNED_INT
) {
4923 GLuint
*zValues
= (GLuint
*) dest
;
4925 if (depthMax
<= 0xffffff) {
4926 /* no overflow worries */
4927 for (i
= 0; i
< n
; i
++) {
4928 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4932 /* need to use double precision to prevent overflow problems */
4933 for (i
= 0; i
< n
; i
++) {
4934 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4935 if (z
>= (GLdouble
) 0xffffffff)
4936 zValues
[i
] = 0xffffffff;
4938 zValues
[i
] = (GLuint
) z
;
4942 else if (dstType
== GL_UNSIGNED_SHORT
) {
4943 GLushort
*zValues
= (GLushort
*) dest
;
4945 ASSERT(depthMax
<= 0xffff);
4946 for (i
= 0; i
< n
; i
++) {
4947 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4950 else if (dstType
== GL_FLOAT
) {
4951 /* Nothing to do. depthValues is pointing to dest. */
4953 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4954 GLfloat
*zValues
= (GLfloat
*) dest
;
4956 for (i
= 0; i
< n
; i
++) {
4957 zValues
[i
*2] = depthValues
[i
];
4969 * Pack an array of depth values. The values are floats in [0,1].
4972 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4973 GLenum dstType
, const GLfloat
*depthSpan
,
4974 const struct gl_pixelstore_attrib
*dstPacking
)
4976 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4978 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4982 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4983 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4984 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4985 depthSpan
= depthCopy
;
4989 case GL_UNSIGNED_BYTE
:
4991 GLubyte
*dst
= (GLubyte
*) dest
;
4993 for (i
= 0; i
< n
; i
++) {
4994 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
5000 GLbyte
*dst
= (GLbyte
*) dest
;
5002 for (i
= 0; i
< n
; i
++) {
5003 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
5007 case GL_UNSIGNED_SHORT
:
5009 GLushort
*dst
= (GLushort
*) dest
;
5011 for (i
= 0; i
< n
; i
++) {
5012 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
5014 if (dstPacking
->SwapBytes
) {
5015 _mesa_swap2( (GLushort
*) dst
, n
);
5021 GLshort
*dst
= (GLshort
*) dest
;
5023 for (i
= 0; i
< n
; i
++) {
5024 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
5026 if (dstPacking
->SwapBytes
) {
5027 _mesa_swap2( (GLushort
*) dst
, n
);
5031 case GL_UNSIGNED_INT
:
5033 GLuint
*dst
= (GLuint
*) dest
;
5035 for (i
= 0; i
< n
; i
++) {
5036 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5038 if (dstPacking
->SwapBytes
) {
5039 _mesa_swap4( (GLuint
*) dst
, n
);
5045 GLint
*dst
= (GLint
*) dest
;
5047 for (i
= 0; i
< n
; i
++) {
5048 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5050 if (dstPacking
->SwapBytes
) {
5051 _mesa_swap4( (GLuint
*) dst
, n
);
5057 GLfloat
*dst
= (GLfloat
*) dest
;
5059 for (i
= 0; i
< n
; i
++) {
5060 dst
[i
] = depthSpan
[i
];
5062 if (dstPacking
->SwapBytes
) {
5063 _mesa_swap4( (GLuint
*) dst
, n
);
5067 case GL_HALF_FLOAT_ARB
:
5069 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5071 for (i
= 0; i
< n
; i
++) {
5072 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5074 if (dstPacking
->SwapBytes
) {
5075 _mesa_swap2( (GLushort
*) dst
, n
);
5080 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5089 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5092 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5093 GLenum dstType
, GLuint
*dest
,
5094 const GLfloat
*depthVals
,
5095 const GLubyte
*stencilVals
,
5096 const struct gl_pixelstore_attrib
*dstPacking
)
5098 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5099 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
5102 if (!depthCopy
|| !stencilCopy
) {
5103 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5109 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5110 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5111 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5112 depthVals
= depthCopy
;
5115 if (ctx
->Pixel
.IndexShift
||
5116 ctx
->Pixel
.IndexOffset
||
5117 ctx
->Pixel
.MapStencilFlag
) {
5118 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
5119 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5120 stencilVals
= stencilCopy
;
5124 case GL_UNSIGNED_INT_24_8
:
5125 for (i
= 0; i
< n
; i
++) {
5126 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5127 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5130 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5131 for (i
= 0; i
< n
; i
++) {
5132 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5133 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5138 if (dstPacking
->SwapBytes
) {
5139 _mesa_swap4(dest
, n
);
5150 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5151 * Return all image data in a contiguous block. This is used when we
5152 * compile glDrawPixels, glTexImage, etc into a display list. We
5153 * need a copy of the data in a standard format.
5156 _mesa_unpack_image( GLuint dimensions
,
5157 GLsizei width
, GLsizei height
, GLsizei depth
,
5158 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5159 const struct gl_pixelstore_attrib
*unpack
)
5161 GLint bytesPerRow
, compsPerRow
;
5162 GLboolean flipBytes
, swap2
, swap4
;
5165 return NULL
; /* not necessarily an error */
5167 if (width
<= 0 || height
<= 0 || depth
<= 0)
5168 return NULL
; /* generate error later */
5170 if (type
== GL_BITMAP
) {
5171 bytesPerRow
= (width
+ 7) >> 3;
5172 flipBytes
= unpack
->LsbFirst
;
5173 swap2
= swap4
= GL_FALSE
;
5177 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5178 GLint components
= _mesa_components_in_format(format
);
5181 if (_mesa_type_is_packed(type
))
5184 if (bytesPerPixel
<= 0 || components
<= 0)
5185 return NULL
; /* bad format or type. generate error later */
5186 bytesPerRow
= bytesPerPixel
* width
;
5187 bytesPerComp
= bytesPerPixel
/ components
;
5188 flipBytes
= GL_FALSE
;
5189 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5190 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5191 compsPerRow
= components
* width
;
5192 assert(compsPerRow
>= width
);
5197 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5201 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5204 for (img
= 0; img
< depth
; img
++) {
5205 for (row
= 0; row
< height
; row
++) {
5206 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5207 width
, height
, format
, type
, img
, row
, 0);
5209 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5211 flipBytes
= GL_FALSE
;
5212 if (unpack
->LsbFirst
) {
5213 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5214 GLubyte dstMask
= 128;
5215 const GLubyte
*s
= src
;
5218 for (i
= 0; i
< width
; i
++) {
5222 if (srcMask
== 128) {
5227 srcMask
= srcMask
<< 1;
5235 dstMask
= dstMask
>> 1;
5240 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5241 GLubyte dstMask
= 128;
5242 const GLubyte
*s
= src
;
5245 for (i
= 0; i
< width
; i
++) {
5254 srcMask
= srcMask
>> 1;
5262 dstMask
= dstMask
>> 1;
5268 memcpy(dst
, src
, bytesPerRow
);
5271 /* byte flipping/swapping */
5273 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5276 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5279 _mesa_swap4((GLuint
*) dst
, compsPerRow
);