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.
39 #include "pixeltransfer.h"
41 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
42 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
47 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
48 * we later convert the float to a packed integer value (such as for
49 * GL_RGB5_A1) because we'll wind up with a non-zero value.
51 * We redefine the macros here so zero is handled correctly.
54 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
57 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
61 /** Compute ceiling of integer quotient of A divided by B. */
62 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
66 * Flip the 8 bits in each byte of the given array.
69 * \param n number of bytes.
71 * \todo try this trick to flip bytes someday:
73 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
74 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
75 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
79 flip_bytes( GLubyte
*p
, GLuint n
)
82 for (i
= 0; i
< n
; i
++) {
83 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
84 a
= ((b
& 0x01) << 7) |
99 * Unpack a 32x32 pixel polygon stipple from user memory using the
100 * current pixel unpack settings.
103 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
104 const struct gl_pixelstore_attrib
*unpacking
)
106 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
108 /* Convert pattern from GLubytes to GLuints and handle big/little
113 for (i
= 0; i
< 32; i
++) {
114 dest
[i
] = (p
[0] << 24)
126 * Pack polygon stipple into user memory given current pixel packing
130 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
131 const struct gl_pixelstore_attrib
*packing
)
133 /* Convert pattern from GLuints to GLubytes to handle big/little
134 * endian differences.
138 for (i
= 0; i
< 32; i
++) {
139 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
140 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
141 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
142 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
145 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
150 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
151 * order with row alignment = 1 byte.
154 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
155 const struct gl_pixelstore_attrib
*packing
)
157 GLint bytes
, row
, width_in_bytes
;
158 GLubyte
*buffer
, *dst
;
163 /* Alloc dest storage */
164 bytes
= ((width
+ 7) / 8 * height
);
165 buffer
= (GLubyte
*) malloc( bytes
);
169 width_in_bytes
= CEILING( width
, 8 );
171 for (row
= 0; row
< height
; row
++) {
172 const GLubyte
*src
= (const GLubyte
*)
173 _mesa_image_address2d(packing
, pixels
, width
, height
,
174 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
180 if ((packing
->SkipPixels
& 7) == 0) {
181 memcpy( dst
, src
, width_in_bytes
);
182 if (packing
->LsbFirst
) {
183 flip_bytes( dst
, width_in_bytes
);
187 /* handling SkipPixels is a bit tricky (no pun intended!) */
189 if (packing
->LsbFirst
) {
190 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
191 GLubyte dstMask
= 128;
192 const GLubyte
*s
= src
;
195 for (i
= 0; i
< width
; i
++) {
199 if (srcMask
== 128) {
204 srcMask
= srcMask
<< 1;
212 dstMask
= dstMask
>> 1;
217 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
218 GLubyte dstMask
= 128;
219 const GLubyte
*s
= src
;
222 for (i
= 0; i
< width
; i
++) {
231 srcMask
= srcMask
>> 1;
239 dstMask
= dstMask
>> 1;
244 dst
+= width_in_bytes
;
255 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
256 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
258 GLint row
, width_in_bytes
;
264 width_in_bytes
= CEILING( width
, 8 );
266 for (row
= 0; row
< height
; row
++) {
267 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
268 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
272 if ((packing
->SkipPixels
& 7) == 0) {
273 memcpy( dst
, src
, width_in_bytes
);
274 if (packing
->LsbFirst
) {
275 flip_bytes( dst
, width_in_bytes
);
279 /* handling SkipPixels is a bit tricky (no pun intended!) */
281 if (packing
->LsbFirst
) {
282 GLubyte srcMask
= 128;
283 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
284 const GLubyte
*s
= src
;
287 for (i
= 0; i
< width
; i
++) {
296 srcMask
= srcMask
>> 1;
298 if (dstMask
== 128) {
304 dstMask
= dstMask
<< 1;
309 GLubyte srcMask
= 128;
310 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
311 const GLubyte
*s
= src
;
314 for (i
= 0; i
< width
; i
++) {
323 srcMask
= srcMask
>> 1;
331 dstMask
= dstMask
>> 1;
336 src
+= width_in_bytes
;
342 * Get indexes of color components for a basic color format, such as
343 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
347 get_component_indexes(GLenum format
,
352 GLint
*luminanceIndex
,
353 GLint
*intensityIndex
)
359 *luminanceIndex
= -1;
360 *intensityIndex
= -1;
364 case GL_LUMINANCE_INTEGER_EXT
:
367 case GL_LUMINANCE_ALPHA
:
368 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
376 case GL_RED_INTEGER_EXT
:
380 case GL_GREEN_INTEGER_EXT
:
384 case GL_BLUE_INTEGER_EXT
:
388 case GL_ALPHA_INTEGER_EXT
:
397 case GL_RGB_INTEGER_EXT
:
403 case GL_BGR_INTEGER_EXT
:
409 case GL_RGBA_INTEGER_EXT
:
416 case GL_BGRA_INTEGER
:
434 assert(0 && "bad format in get_component_indexes()");
441 * For small integer types, return the min and max possible values.
442 * Used for clamping floats to unscaled integer types.
443 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
446 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
453 case GL_UNSIGNED_BYTE
:
461 case GL_UNSIGNED_SHORT
:
473 * Used to pack an array [][4] of RGBA float colors as specified
474 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
475 * Historically, the RGBA values were in [0,1] and rescaled to fit
476 * into GLubytes, etc. But with new integer formats, the RGBA values
477 * may have any value and we don't always rescale when converting to
480 * Note: the rgba values will be modified by this function when any pixel
481 * transfer ops are enabled.
484 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
485 GLenum dstFormat
, GLenum dstType
,
487 const struct gl_pixelstore_attrib
*dstPacking
,
488 GLbitfield transferOps
)
491 const GLint comps
= _mesa_components_in_format(dstFormat
);
492 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
495 if (dstFormat
== GL_LUMINANCE
||
496 dstFormat
== GL_LUMINANCE_ALPHA
||
497 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
498 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
499 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
501 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
509 /* EXT_texture_integer specifies no transfer ops on integer
510 * types in the resolved issues section. Just set them to 0
511 * for integer surfaces.
517 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
521 * Component clamping (besides clamping to [0,1] in
522 * _mesa_apply_rgba_transfer_ops()).
525 /* clamping to dest type's min/max values */
527 if (get_type_min_max(dstType
, &min
, &max
)) {
528 for (i
= 0; i
< n
; i
++) {
529 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
530 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
531 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
532 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
536 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
537 /* compute luminance values */
538 if (transferOps
& IMAGE_CLAMP_BIT
) {
539 for (i
= 0; i
< n
; i
++) {
540 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
541 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
545 for (i
= 0; i
< n
; i
++) {
546 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
552 * Pack/store the pixels. Ugh! Lots of cases!!!
555 case GL_UNSIGNED_BYTE
:
557 GLubyte
*dst
= (GLubyte
*) dstAddr
;
561 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
565 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
569 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
573 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
577 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
579 case GL_LUMINANCE_ALPHA
:
581 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
582 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
587 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
588 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
593 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
594 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
595 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
600 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
601 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
602 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
603 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
608 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
609 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
610 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
615 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
616 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
617 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
618 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
623 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
624 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
625 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
626 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
629 case GL_RED_INTEGER_EXT
:
631 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
634 case GL_GREEN_INTEGER_EXT
:
636 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
639 case GL_BLUE_INTEGER_EXT
:
641 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
644 case GL_ALPHA_INTEGER_EXT
:
646 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
649 case GL_RGB_INTEGER_EXT
:
651 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
652 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
653 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
656 case GL_RGBA_INTEGER_EXT
:
658 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
659 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
660 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
661 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
664 case GL_BGR_INTEGER_EXT
:
666 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
667 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
668 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
671 case GL_BGRA_INTEGER_EXT
:
673 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
674 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
675 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
676 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
679 case GL_LUMINANCE_INTEGER_EXT
:
681 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
684 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
687 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
689 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
697 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
698 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
702 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
708 GLbyte
*dst
= (GLbyte
*) dstAddr
;
712 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
716 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
720 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
724 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
728 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
730 case GL_LUMINANCE_ALPHA
:
732 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
733 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
738 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
739 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
744 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
745 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
746 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
751 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
752 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
753 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
754 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
759 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
760 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
761 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
766 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
767 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
768 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
769 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
774 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
775 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
776 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
777 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
780 case GL_RED_INTEGER_EXT
:
782 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
785 case GL_GREEN_INTEGER_EXT
:
787 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
790 case GL_BLUE_INTEGER_EXT
:
792 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
795 case GL_ALPHA_INTEGER_EXT
:
797 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
800 case GL_RGB_INTEGER_EXT
:
802 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
803 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
804 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
807 case GL_RGBA_INTEGER_EXT
:
809 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
810 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
811 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
812 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
815 case GL_BGR_INTEGER_EXT
:
817 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
818 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
819 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
822 case GL_BGRA_INTEGER_EXT
:
824 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
825 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
826 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
827 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
830 case GL_LUMINANCE_INTEGER_EXT
:
832 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
835 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
838 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
840 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
848 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
849 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
853 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
857 case GL_UNSIGNED_SHORT
:
859 GLushort
*dst
= (GLushort
*) dstAddr
;
863 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
867 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
871 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
875 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
879 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
881 case GL_LUMINANCE_ALPHA
:
883 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
884 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
889 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
890 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
895 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
896 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
897 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
902 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
903 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
904 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
905 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
910 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
911 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
912 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
917 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
920 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
925 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
926 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
927 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
928 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
931 case GL_RED_INTEGER_EXT
:
933 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
936 case GL_GREEN_INTEGER_EXT
:
938 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
941 case GL_BLUE_INTEGER_EXT
:
943 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
946 case GL_ALPHA_INTEGER_EXT
:
948 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
951 case GL_RGB_INTEGER_EXT
:
953 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
954 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
955 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
958 case GL_RGBA_INTEGER_EXT
:
960 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
961 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
962 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
963 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
966 case GL_BGR_INTEGER_EXT
:
968 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
969 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
970 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
973 case GL_BGRA_INTEGER_EXT
:
975 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
976 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
977 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
978 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
981 case GL_LUMINANCE_INTEGER_EXT
:
983 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
986 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
989 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
991 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
999 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1000 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1004 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1010 GLshort
*dst
= (GLshort
*) dstAddr
;
1011 switch (dstFormat
) {
1014 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1018 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1022 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1026 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1030 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1032 case GL_LUMINANCE_ALPHA
:
1034 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1035 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1040 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1041 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1046 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1047 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1048 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1053 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1054 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1055 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1056 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1061 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1062 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1063 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1068 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1069 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1070 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1071 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1076 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1077 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1078 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1079 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1082 case GL_RED_INTEGER_EXT
:
1084 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1087 case GL_GREEN_INTEGER_EXT
:
1089 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1092 case GL_BLUE_INTEGER_EXT
:
1094 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1097 case GL_ALPHA_INTEGER_EXT
:
1099 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1102 case GL_RGB_INTEGER_EXT
:
1104 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1105 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1106 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1109 case GL_RGBA_INTEGER_EXT
:
1111 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1112 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1113 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1114 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1117 case GL_BGR_INTEGER_EXT
:
1119 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1120 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1121 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1124 case GL_BGRA_INTEGER_EXT
:
1126 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1127 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1128 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1129 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1132 case GL_LUMINANCE_INTEGER_EXT
:
1134 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1137 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1140 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1142 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1150 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1151 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1155 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1159 case GL_UNSIGNED_INT
:
1161 GLuint
*dst
= (GLuint
*) dstAddr
;
1162 switch (dstFormat
) {
1165 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1169 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1173 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1177 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1181 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1183 case GL_LUMINANCE_ALPHA
:
1185 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1186 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1191 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1192 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1197 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1198 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1199 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1204 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1205 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1206 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1207 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1212 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1213 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1214 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1219 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1220 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1221 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1222 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1227 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1228 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1229 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1230 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1233 case GL_RED_INTEGER_EXT
:
1235 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1238 case GL_GREEN_INTEGER_EXT
:
1240 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1243 case GL_BLUE_INTEGER_EXT
:
1245 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1248 case GL_ALPHA_INTEGER_EXT
:
1250 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1253 case GL_RGB_INTEGER_EXT
:
1255 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1256 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1257 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1260 case GL_RGBA_INTEGER_EXT
:
1262 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1263 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1264 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1265 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1268 case GL_BGR_INTEGER_EXT
:
1270 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1271 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1272 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1275 case GL_BGRA_INTEGER_EXT
:
1277 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1278 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1279 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1280 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1283 case GL_LUMINANCE_INTEGER_EXT
:
1285 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1288 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1291 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1293 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1301 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1302 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1306 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1312 GLint
*dst
= (GLint
*) dstAddr
;
1313 switch (dstFormat
) {
1316 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1320 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1324 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1328 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1332 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1334 case GL_LUMINANCE_ALPHA
:
1336 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1337 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1342 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1343 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1348 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1349 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1350 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1355 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1356 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1357 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1358 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1363 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1364 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1365 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1370 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1371 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1372 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1373 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1378 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1379 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1380 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1381 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1387 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1388 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1391 case GL_RED_INTEGER_EXT
:
1393 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1396 case GL_GREEN_INTEGER_EXT
:
1398 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1401 case GL_BLUE_INTEGER_EXT
:
1403 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1406 case GL_ALPHA_INTEGER_EXT
:
1408 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1411 case GL_RGB_INTEGER_EXT
:
1413 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1414 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1415 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1418 case GL_RGBA_INTEGER_EXT
:
1420 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1421 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1422 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1423 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1426 case GL_BGR_INTEGER_EXT
:
1428 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1429 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1430 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1433 case GL_BGRA_INTEGER_EXT
:
1435 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1436 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1437 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1438 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1441 case GL_LUMINANCE_INTEGER_EXT
:
1443 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1446 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1449 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1451 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1457 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1463 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1464 switch (dstFormat
) {
1467 dst
[i
] = rgba
[i
][RCOMP
];
1471 dst
[i
] = rgba
[i
][GCOMP
];
1475 dst
[i
] = rgba
[i
][BCOMP
];
1479 dst
[i
] = rgba
[i
][ACOMP
];
1483 dst
[i
] = luminance
[i
];
1485 case GL_LUMINANCE_ALPHA
:
1487 dst
[i
*2+0] = luminance
[i
];
1488 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1493 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1494 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1499 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1500 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1501 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1506 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1507 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1508 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1509 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1514 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1515 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1516 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1521 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1522 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1523 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1524 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1529 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1530 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1531 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1532 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1538 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1539 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1543 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1547 case GL_HALF_FLOAT_ARB
:
1549 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1550 switch (dstFormat
) {
1553 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1557 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1561 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1565 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1569 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1571 case GL_LUMINANCE_ALPHA
:
1573 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1574 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1579 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1580 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1585 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1586 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1587 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1592 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1593 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1594 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1595 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1600 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1601 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1602 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1607 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1608 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1609 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1610 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1615 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1616 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1617 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1618 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1624 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1625 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1629 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1633 case GL_UNSIGNED_BYTE_3_3_2
:
1634 if (dstFormat
== GL_RGB
) {
1635 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1637 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1638 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1639 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1643 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1644 if (dstFormat
== GL_RGB
) {
1645 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1647 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1648 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1649 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1653 case GL_UNSIGNED_SHORT_5_6_5
:
1654 if (dstFormat
== GL_RGB
) {
1655 GLushort
*dst
= (GLushort
*) dstAddr
;
1657 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1658 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1659 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1663 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1664 if (dstFormat
== GL_RGB
) {
1665 GLushort
*dst
= (GLushort
*) dstAddr
;
1667 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1668 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1669 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1673 case GL_UNSIGNED_SHORT_4_4_4_4
:
1674 if (dstFormat
== GL_RGBA
) {
1675 GLushort
*dst
= (GLushort
*) dstAddr
;
1677 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1678 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1679 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1680 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1683 else if (dstFormat
== GL_BGRA
) {
1684 GLushort
*dst
= (GLushort
*) dstAddr
;
1686 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1687 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1688 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1689 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1692 else if (dstFormat
== GL_ABGR_EXT
) {
1693 GLushort
*dst
= (GLushort
*) dstAddr
;
1695 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1696 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1697 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1698 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1702 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1703 if (dstFormat
== GL_RGBA
) {
1704 GLushort
*dst
= (GLushort
*) dstAddr
;
1706 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1707 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1708 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1709 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1712 else if (dstFormat
== GL_BGRA
) {
1713 GLushort
*dst
= (GLushort
*) dstAddr
;
1715 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1716 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1717 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1718 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1721 else if (dstFormat
== GL_ABGR_EXT
) {
1722 GLushort
*dst
= (GLushort
*) dstAddr
;
1724 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1725 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1726 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1727 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1731 case GL_UNSIGNED_SHORT_5_5_5_1
:
1732 if (dstFormat
== GL_RGBA
) {
1733 GLushort
*dst
= (GLushort
*) dstAddr
;
1735 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1736 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1737 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1738 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1741 else if (dstFormat
== GL_BGRA
) {
1742 GLushort
*dst
= (GLushort
*) dstAddr
;
1744 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1745 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1746 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1747 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1750 else if (dstFormat
== GL_ABGR_EXT
) {
1751 GLushort
*dst
= (GLushort
*) dstAddr
;
1753 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1754 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1755 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1756 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1760 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1761 if (dstFormat
== GL_RGBA
) {
1762 GLushort
*dst
= (GLushort
*) dstAddr
;
1764 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1765 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1766 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1767 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1770 else if (dstFormat
== GL_BGRA
) {
1771 GLushort
*dst
= (GLushort
*) dstAddr
;
1773 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1774 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1775 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1776 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1779 else if (dstFormat
== GL_ABGR_EXT
) {
1780 GLushort
*dst
= (GLushort
*) dstAddr
;
1782 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1783 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1784 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1785 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1789 case GL_UNSIGNED_INT_8_8_8_8
:
1790 if (dstFormat
== GL_RGBA
) {
1791 GLuint
*dst
= (GLuint
*) dstAddr
;
1793 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1794 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1795 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1796 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1799 else if (dstFormat
== GL_BGRA
) {
1800 GLuint
*dst
= (GLuint
*) dstAddr
;
1802 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1803 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1804 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1805 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1808 else if (dstFormat
== GL_ABGR_EXT
) {
1809 GLuint
*dst
= (GLuint
*) dstAddr
;
1811 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1812 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1813 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1814 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1818 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1819 if (dstFormat
== GL_RGBA
) {
1820 GLuint
*dst
= (GLuint
*) dstAddr
;
1822 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1823 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1824 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1825 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1828 else if (dstFormat
== GL_BGRA
) {
1829 GLuint
*dst
= (GLuint
*) dstAddr
;
1831 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1832 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1833 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1834 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1837 else if (dstFormat
== GL_ABGR_EXT
) {
1838 GLuint
*dst
= (GLuint
*) dstAddr
;
1840 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1841 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1842 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1843 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1847 case GL_UNSIGNED_INT_10_10_10_2
:
1848 if (dstFormat
== GL_RGBA
) {
1849 GLuint
*dst
= (GLuint
*) dstAddr
;
1851 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1852 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1853 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1854 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1857 else if (dstFormat
== GL_BGRA
) {
1858 GLuint
*dst
= (GLuint
*) dstAddr
;
1860 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1861 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1862 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1863 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1866 else if (dstFormat
== GL_ABGR_EXT
) {
1867 GLuint
*dst
= (GLuint
*) dstAddr
;
1869 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1870 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1871 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1872 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1876 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1877 if (dstFormat
== GL_RGBA
) {
1878 GLuint
*dst
= (GLuint
*) dstAddr
;
1880 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1881 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1882 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1883 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1886 else if (dstFormat
== GL_BGRA
) {
1887 GLuint
*dst
= (GLuint
*) dstAddr
;
1889 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1890 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1891 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1892 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1895 else if (dstFormat
== GL_ABGR_EXT
) {
1896 GLuint
*dst
= (GLuint
*) dstAddr
;
1898 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1899 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1900 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1901 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1905 case GL_UNSIGNED_INT_5_9_9_9_REV
:
1907 GLuint
*dst
= (GLuint
*) dstAddr
;
1908 for (i
= 0; i
< n
; i
++) {
1909 dst
[i
] = float3_to_rgb9e5(rgba
[i
]);
1913 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
1915 GLuint
*dst
= (GLuint
*) dstAddr
;
1916 for (i
= 0; i
< n
; i
++) {
1917 dst
[i
] = float3_to_r11g11b10f(rgba
[i
]);
1922 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1926 if (dstPacking
->SwapBytes
) {
1927 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1928 if (swapSize
== 2) {
1929 if (dstPacking
->SwapBytes
) {
1930 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1933 else if (swapSize
== 4) {
1934 if (dstPacking
->SwapBytes
) {
1935 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1945 #define SWAP2BYTE(VALUE) \
1947 GLubyte *bytes = (GLubyte *) &(VALUE); \
1948 GLubyte tmp = bytes[0]; \
1949 bytes[0] = bytes[1]; \
1953 #define SWAP4BYTE(VALUE) \
1955 GLubyte *bytes = (GLubyte *) &(VALUE); \
1956 GLubyte tmp = bytes[0]; \
1957 bytes[0] = bytes[3]; \
1960 bytes[1] = bytes[2]; \
1966 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1967 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1968 const struct gl_pixelstore_attrib
*unpack
)
1970 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1972 ASSERT(srcType
== GL_BITMAP
||
1973 srcType
== GL_UNSIGNED_BYTE
||
1974 srcType
== GL_BYTE
||
1975 srcType
== GL_UNSIGNED_SHORT
||
1976 srcType
== GL_SHORT
||
1977 srcType
== GL_UNSIGNED_INT
||
1978 srcType
== GL_INT
||
1979 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1980 srcType
== GL_HALF_FLOAT_ARB
||
1981 srcType
== GL_FLOAT
||
1982 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
1987 GLubyte
*ubsrc
= (GLubyte
*) src
;
1988 if (unpack
->LsbFirst
) {
1989 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1991 for (i
= 0; i
< n
; i
++) {
1992 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2003 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2005 for (i
= 0; i
< n
; i
++) {
2006 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2018 case GL_UNSIGNED_BYTE
:
2021 const GLubyte
*s
= (const GLubyte
*) src
;
2022 for (i
= 0; i
< n
; i
++)
2029 const GLbyte
*s
= (const GLbyte
*) src
;
2030 for (i
= 0; i
< n
; i
++)
2034 case GL_UNSIGNED_SHORT
:
2037 const GLushort
*s
= (const GLushort
*) src
;
2038 if (unpack
->SwapBytes
) {
2039 for (i
= 0; i
< n
; i
++) {
2040 GLushort value
= s
[i
];
2046 for (i
= 0; i
< n
; i
++)
2054 const GLshort
*s
= (const GLshort
*) src
;
2055 if (unpack
->SwapBytes
) {
2056 for (i
= 0; i
< n
; i
++) {
2057 GLshort value
= s
[i
];
2063 for (i
= 0; i
< n
; i
++)
2068 case GL_UNSIGNED_INT
:
2071 const GLuint
*s
= (const GLuint
*) src
;
2072 if (unpack
->SwapBytes
) {
2073 for (i
= 0; i
< n
; i
++) {
2074 GLuint value
= s
[i
];
2080 for (i
= 0; i
< n
; i
++)
2088 const GLint
*s
= (const GLint
*) src
;
2089 if (unpack
->SwapBytes
) {
2090 for (i
= 0; i
< n
; i
++) {
2097 for (i
= 0; i
< n
; i
++)
2105 const GLfloat
*s
= (const GLfloat
*) src
;
2106 if (unpack
->SwapBytes
) {
2107 for (i
= 0; i
< n
; i
++) {
2108 GLfloat value
= s
[i
];
2110 indexes
[i
] = (GLuint
) value
;
2114 for (i
= 0; i
< n
; i
++)
2115 indexes
[i
] = (GLuint
) s
[i
];
2119 case GL_HALF_FLOAT_ARB
:
2122 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2123 if (unpack
->SwapBytes
) {
2124 for (i
= 0; i
< n
; i
++) {
2125 GLhalfARB value
= s
[i
];
2127 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2131 for (i
= 0; i
< n
; i
++)
2132 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2136 case GL_UNSIGNED_INT_24_8_EXT
:
2139 const GLuint
*s
= (const GLuint
*) src
;
2140 if (unpack
->SwapBytes
) {
2141 for (i
= 0; i
< n
; i
++) {
2142 GLuint value
= s
[i
];
2144 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2148 for (i
= 0; i
< n
; i
++)
2149 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2153 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2156 const GLuint
*s
= (const GLuint
*) src
;
2157 if (unpack
->SwapBytes
) {
2158 for (i
= 0; i
< n
; i
++) {
2159 GLuint value
= s
[i
*2+1];
2161 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2165 for (i
= 0; i
< n
; i
++)
2166 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2172 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2179 * Return source/dest RGBA indexes for unpacking pixels.
2182 get_component_mapping(GLenum format
,
2194 case GL_RED_INTEGER_EXT
:
2196 *gSrc
= *bSrc
= *aSrc
= -1;
2199 case GL_GREEN_INTEGER_EXT
:
2201 *rSrc
= *bSrc
= *aSrc
= -1;
2204 case GL_BLUE_INTEGER_EXT
:
2206 *rSrc
= *gSrc
= *aSrc
= -1;
2209 case GL_ALPHA_INTEGER_EXT
:
2210 *rSrc
= *gSrc
= *bSrc
= -1;
2214 case GL_LUMINANCE_INTEGER_EXT
:
2215 *rSrc
= *gSrc
= *bSrc
= 0;
2218 case GL_LUMINANCE_ALPHA
:
2219 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2220 *rSrc
= *gSrc
= *bSrc
= 0;
2224 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2238 case GL_RGB_INTEGER
:
2259 case GL_RGBA_INTEGER
:
2297 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2298 _mesa_lookup_enum_by_nr(format
));
2306 * This function extracts floating point RGBA values from arbitrary
2307 * image data. srcFormat and srcType are the format and type parameters
2308 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2310 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2311 * implements the "Conversion to floating point", "Conversion to RGB",
2312 * and "Final Expansion to RGBA" operations.
2314 * Args: n - number of pixels
2315 * rgba - output colors
2316 * srcFormat - format of incoming data
2317 * srcType - data type of incoming data
2318 * src - source data pointer
2319 * swapBytes - perform byteswapping of incoming data?
2322 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2323 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2324 GLboolean swapBytes
)
2326 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2328 GLint rDst
, bDst
, gDst
, aDst
;
2329 GLboolean intFormat
;
2330 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2332 ASSERT(srcFormat
== GL_RED
||
2333 srcFormat
== GL_GREEN
||
2334 srcFormat
== GL_BLUE
||
2335 srcFormat
== GL_ALPHA
||
2336 srcFormat
== GL_LUMINANCE
||
2337 srcFormat
== GL_LUMINANCE_ALPHA
||
2338 srcFormat
== GL_INTENSITY
||
2339 srcFormat
== GL_RG
||
2340 srcFormat
== GL_RGB
||
2341 srcFormat
== GL_BGR
||
2342 srcFormat
== GL_RGBA
||
2343 srcFormat
== GL_BGRA
||
2344 srcFormat
== GL_ABGR_EXT
||
2345 srcFormat
== GL_DU8DV8_ATI
||
2346 srcFormat
== GL_DUDV_ATI
||
2347 srcFormat
== GL_RED_INTEGER_EXT
||
2348 srcFormat
== GL_GREEN_INTEGER_EXT
||
2349 srcFormat
== GL_BLUE_INTEGER_EXT
||
2350 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2351 srcFormat
== GL_RGB_INTEGER_EXT
||
2352 srcFormat
== GL_RGBA_INTEGER_EXT
||
2353 srcFormat
== GL_BGR_INTEGER_EXT
||
2354 srcFormat
== GL_BGRA_INTEGER_EXT
||
2355 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2356 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2358 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2359 srcType
== GL_BYTE
||
2360 srcType
== GL_UNSIGNED_SHORT
||
2361 srcType
== GL_SHORT
||
2362 srcType
== GL_UNSIGNED_INT
||
2363 srcType
== GL_INT
||
2364 srcType
== GL_HALF_FLOAT_ARB
||
2365 srcType
== GL_FLOAT
||
2366 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2367 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2368 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2369 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2370 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2371 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2372 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2373 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2374 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2375 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2376 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2377 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2378 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2379 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2381 get_component_mapping(srcFormat
,
2382 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2383 &rDst
, &gDst
, &bDst
, &aDst
);
2385 stride
= _mesa_components_in_format(srcFormat
);
2387 intFormat
= _mesa_is_integer_format(srcFormat
);
2389 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2390 if ((SRC_INDEX) < 0) { \
2393 for (i = 0; i < n; i++) { \
2394 rgba[i][DST_INDEX] = DEFAULT_INT; \
2398 for (i = 0; i < n; i++) { \
2399 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2403 else if (swapBytes) { \
2404 const TYPE *s = (const TYPE *) src; \
2406 for (i = 0; i < n; i++) { \
2407 TYPE value = s[SRC_INDEX]; \
2408 if (sizeof(TYPE) == 2) { \
2411 else if (sizeof(TYPE) == 4) { \
2415 rgba[i][DST_INDEX] = (GLfloat) value; \
2417 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2422 const TYPE *s = (const TYPE *) src; \
2425 for (i = 0; i < n; i++) { \
2426 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2431 for (i = 0; i < n; i++) { \
2432 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2439 case GL_UNSIGNED_BYTE
:
2440 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2441 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2442 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2443 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2446 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2447 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2448 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2449 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2451 case GL_UNSIGNED_SHORT
:
2452 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2453 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2454 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2455 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2458 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2459 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2460 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2461 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2463 case GL_UNSIGNED_INT
:
2464 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2465 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2466 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2467 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2470 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2471 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2472 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2473 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2476 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2477 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2478 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2479 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2481 case GL_HALF_FLOAT_ARB
:
2482 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2483 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2484 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2485 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2487 case GL_UNSIGNED_BYTE_3_3_2
:
2489 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2496 for (i
= 0; i
< n
; i
++) {
2497 GLubyte p
= ubsrc
[i
];
2498 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2499 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2500 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2501 rgba
[i
][aDst
] = 1.0F
;
2505 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2507 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2514 for (i
= 0; i
< n
; i
++) {
2515 GLubyte p
= ubsrc
[i
];
2516 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2517 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2518 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2519 rgba
[i
][aDst
] = 1.0F
;
2523 case GL_UNSIGNED_SHORT_5_6_5
:
2530 const GLushort
*ussrc
= (const GLushort
*) src
;
2532 for (i
= 0; i
< n
; i
++) {
2533 GLushort p
= ussrc
[i
];
2535 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2536 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2537 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2538 rgba
[i
][aDst
] = 1.0F
;
2542 const GLushort
*ussrc
= (const GLushort
*) src
;
2544 for (i
= 0; i
< n
; i
++) {
2545 GLushort p
= ussrc
[i
];
2546 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2547 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2548 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2549 rgba
[i
][aDst
] = 1.0F
;
2553 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2560 const GLushort
*ussrc
= (const GLushort
*) src
;
2562 for (i
= 0; i
< n
; i
++) {
2563 GLushort p
= ussrc
[i
];
2565 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2566 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2567 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2568 rgba
[i
][aDst
] = 1.0F
;
2572 const GLushort
*ussrc
= (const GLushort
*) src
;
2574 for (i
= 0; i
< n
; i
++) {
2575 GLushort p
= ussrc
[i
];
2576 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2577 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2578 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2579 rgba
[i
][aDst
] = 1.0F
;
2583 case GL_UNSIGNED_SHORT_4_4_4_4
:
2585 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2588 const GLushort
*ussrc
= (const GLushort
*) src
;
2590 for (i
= 0; i
< n
; i
++) {
2591 GLushort p
= ussrc
[i
];
2593 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2594 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2595 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2596 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2600 const GLushort
*ussrc
= (const GLushort
*) src
;
2602 for (i
= 0; i
< n
; i
++) {
2603 GLushort p
= ussrc
[i
];
2604 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2605 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2606 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2607 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2611 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2613 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2616 const GLushort
*ussrc
= (const GLushort
*) src
;
2618 for (i
= 0; i
< n
; i
++) {
2619 GLushort p
= ussrc
[i
];
2621 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2622 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2623 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2624 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2628 const GLushort
*ussrc
= (const GLushort
*) src
;
2630 for (i
= 0; i
< n
; i
++) {
2631 GLushort p
= ussrc
[i
];
2632 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2633 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2634 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2635 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2639 case GL_UNSIGNED_SHORT_5_5_5_1
:
2641 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2644 const GLushort
*ussrc
= (const GLushort
*) src
;
2646 for (i
= 0; i
< n
; i
++) {
2647 GLushort p
= ussrc
[i
];
2649 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2650 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2651 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2652 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2656 const GLushort
*ussrc
= (const GLushort
*) src
;
2658 for (i
= 0; i
< n
; i
++) {
2659 GLushort p
= ussrc
[i
];
2660 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2661 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2662 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2663 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2667 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2669 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2672 const GLushort
*ussrc
= (const GLushort
*) src
;
2674 for (i
= 0; i
< n
; i
++) {
2675 GLushort p
= ussrc
[i
];
2677 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2678 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2679 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2680 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2684 const GLushort
*ussrc
= (const GLushort
*) src
;
2686 for (i
= 0; i
< n
; i
++) {
2687 GLushort p
= ussrc
[i
];
2688 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2689 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2690 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2691 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2695 case GL_UNSIGNED_INT_8_8_8_8
:
2697 const GLuint
*uisrc
= (const GLuint
*) src
;
2700 for (i
= 0; i
< n
; i
++) {
2701 GLuint p
= uisrc
[i
];
2702 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2703 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2704 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2705 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2709 for (i
= 0; i
< n
; i
++) {
2710 GLuint p
= uisrc
[i
];
2711 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2712 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2713 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2714 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2719 const GLuint
*uisrc
= (const GLuint
*) src
;
2722 for (i
= 0; i
< n
; i
++) {
2723 GLuint p
= uisrc
[i
];
2724 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2725 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2726 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2727 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2731 for (i
= 0; i
< n
; i
++) {
2732 GLuint p
= uisrc
[i
];
2733 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2734 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2735 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2736 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2741 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2743 const GLuint
*uisrc
= (const GLuint
*) src
;
2746 for (i
= 0; i
< n
; i
++) {
2747 GLuint p
= uisrc
[i
];
2748 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2749 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2750 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2751 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2755 for (i
= 0; i
< n
; i
++) {
2756 GLuint p
= uisrc
[i
];
2757 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2758 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2759 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2760 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2765 const GLuint
*uisrc
= (const GLuint
*) src
;
2768 for (i
= 0; i
< n
; i
++) {
2769 GLuint p
= uisrc
[i
];
2770 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2771 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2772 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2773 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2777 for (i
= 0; i
< n
; i
++) {
2778 GLuint p
= uisrc
[i
];
2779 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2780 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2781 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2782 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2787 case GL_UNSIGNED_INT_10_10_10_2
:
2789 rs
= 1.0F
/ 1023.0F
;
2790 gs
= 1.0F
/ 1023.0F
;
2791 bs
= 1.0F
/ 1023.0F
;
2795 const GLuint
*uisrc
= (const GLuint
*) src
;
2797 for (i
= 0; i
< n
; i
++) {
2798 GLuint p
= uisrc
[i
];
2800 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2801 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2802 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2803 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2807 const GLuint
*uisrc
= (const GLuint
*) src
;
2809 for (i
= 0; i
< n
; i
++) {
2810 GLuint p
= uisrc
[i
];
2811 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2812 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2813 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2814 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2818 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2820 rs
= 1.0F
/ 1023.0F
;
2821 gs
= 1.0F
/ 1023.0F
;
2822 bs
= 1.0F
/ 1023.0F
;
2826 const GLuint
*uisrc
= (const GLuint
*) src
;
2828 for (i
= 0; i
< n
; i
++) {
2829 GLuint p
= uisrc
[i
];
2831 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2832 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2833 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2834 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2838 const GLuint
*uisrc
= (const GLuint
*) src
;
2840 for (i
= 0; i
< n
; i
++) {
2841 GLuint p
= uisrc
[i
];
2842 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2843 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2844 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2845 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2849 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2851 const GLuint
*uisrc
= (const GLuint
*) src
;
2854 for (i
= 0; i
< n
; i
++) {
2855 GLuint p
= uisrc
[i
];
2857 rgb9e5_to_float3(p
, f
);
2858 rgba
[i
][rDst
] = f
[0];
2859 rgba
[i
][gDst
] = f
[1];
2860 rgba
[i
][bDst
] = f
[2];
2861 rgba
[i
][aDst
] = 1.0F
;
2865 const GLuint
*uisrc
= (const GLuint
*) src
;
2868 for (i
= 0; i
< n
; i
++) {
2869 rgb9e5_to_float3(uisrc
[i
], f
);
2870 rgba
[i
][rDst
] = f
[0];
2871 rgba
[i
][gDst
] = f
[1];
2872 rgba
[i
][bDst
] = f
[2];
2873 rgba
[i
][aDst
] = 1.0F
;
2877 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2879 const GLuint
*uisrc
= (const GLuint
*) src
;
2882 for (i
= 0; i
< n
; i
++) {
2883 GLuint p
= uisrc
[i
];
2885 r11g11b10f_to_float3(p
, f
);
2886 rgba
[i
][rDst
] = f
[0];
2887 rgba
[i
][gDst
] = f
[1];
2888 rgba
[i
][bDst
] = f
[2];
2889 rgba
[i
][aDst
] = 1.0F
;
2893 const GLuint
*uisrc
= (const GLuint
*) src
;
2896 for (i
= 0; i
< n
; i
++) {
2897 r11g11b10f_to_float3(uisrc
[i
], f
);
2898 rgba
[i
][rDst
] = f
[0];
2899 rgba
[i
][gDst
] = f
[1];
2900 rgba
[i
][bDst
] = f
[2];
2901 rgba
[i
][aDst
] = 1.0F
;
2906 _mesa_problem(NULL
, "bad srcType in extract float data");
2913 static inline GLuint
2914 clamp_byte_to_uint(GLbyte b
)
2916 return b
< 0 ? 0 : b
;
2920 static inline GLuint
2921 clamp_short_to_uint(GLshort s
)
2923 return s
< 0 ? 0 : s
;
2927 static inline GLuint
2928 clamp_int_to_uint(GLint i
)
2930 return i
< 0 ? 0 : i
;
2934 static inline GLuint
2935 clamp_float_to_uint(GLfloat f
)
2937 return f
< 0.0F
? 0 : IROUND(f
);
2941 static inline GLuint
2942 clamp_half_to_uint(GLhalfARB h
)
2944 GLfloat f
= _mesa_half_to_float(h
);
2945 return f
< 0.0F
? 0 : IROUND(f
);
2950 * \sa extract_float_rgba()
2953 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2954 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2955 GLboolean swapBytes
)
2957 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2959 GLint rDst
, bDst
, gDst
, aDst
;
2961 ASSERT(srcFormat
== GL_RED
||
2962 srcFormat
== GL_GREEN
||
2963 srcFormat
== GL_BLUE
||
2964 srcFormat
== GL_ALPHA
||
2965 srcFormat
== GL_LUMINANCE
||
2966 srcFormat
== GL_LUMINANCE_ALPHA
||
2967 srcFormat
== GL_INTENSITY
||
2968 srcFormat
== GL_RG
||
2969 srcFormat
== GL_RGB
||
2970 srcFormat
== GL_BGR
||
2971 srcFormat
== GL_RGBA
||
2972 srcFormat
== GL_BGRA
||
2973 srcFormat
== GL_ABGR_EXT
||
2974 srcFormat
== GL_DU8DV8_ATI
||
2975 srcFormat
== GL_DUDV_ATI
||
2976 srcFormat
== GL_RED_INTEGER_EXT
||
2977 srcFormat
== GL_GREEN_INTEGER_EXT
||
2978 srcFormat
== GL_BLUE_INTEGER_EXT
||
2979 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2980 srcFormat
== GL_RGB_INTEGER_EXT
||
2981 srcFormat
== GL_RGBA_INTEGER_EXT
||
2982 srcFormat
== GL_BGR_INTEGER_EXT
||
2983 srcFormat
== GL_BGRA_INTEGER_EXT
||
2984 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2985 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2987 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2988 srcType
== GL_BYTE
||
2989 srcType
== GL_UNSIGNED_SHORT
||
2990 srcType
== GL_SHORT
||
2991 srcType
== GL_UNSIGNED_INT
||
2992 srcType
== GL_INT
||
2993 srcType
== GL_HALF_FLOAT_ARB
||
2994 srcType
== GL_FLOAT
||
2995 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2996 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2997 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2998 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2999 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3000 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3001 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3002 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3003 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3004 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3005 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3006 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3007 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3008 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3010 get_component_mapping(srcFormat
,
3011 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3012 &rDst
, &gDst
, &bDst
, &aDst
);
3014 stride
= _mesa_components_in_format(srcFormat
);
3016 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3017 if ((SRC_INDEX) < 0) { \
3019 for (i = 0; i < n; i++) { \
3020 rgba[i][DST_INDEX] = DEFAULT; \
3023 else if (swapBytes) { \
3024 const TYPE *s = (const TYPE *) src; \
3026 for (i = 0; i < n; i++) { \
3027 TYPE value = s[SRC_INDEX]; \
3028 if (sizeof(TYPE) == 2) { \
3031 else if (sizeof(TYPE) == 4) { \
3034 rgba[i][DST_INDEX] = CONVERSION(value); \
3039 const TYPE *s = (const TYPE *) src; \
3041 for (i = 0; i < n; i++) { \
3042 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3048 case GL_UNSIGNED_BYTE
:
3049 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3050 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3051 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3052 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3055 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3056 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3057 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3058 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3060 case GL_UNSIGNED_SHORT
:
3061 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3062 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3063 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3064 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3067 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3068 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3069 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3070 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3072 case GL_UNSIGNED_INT
:
3073 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3074 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3075 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3076 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3079 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3080 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3081 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3082 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3085 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3086 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3087 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3088 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3090 case GL_HALF_FLOAT_ARB
:
3091 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3092 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3093 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3094 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3096 case GL_UNSIGNED_BYTE_3_3_2
:
3098 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3100 for (i
= 0; i
< n
; i
++) {
3101 GLubyte p
= ubsrc
[i
];
3102 rgba
[i
][rDst
] = ((p
>> 5) );
3103 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3104 rgba
[i
][bDst
] = ((p
) & 0x3);
3109 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3111 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3113 for (i
= 0; i
< n
; i
++) {
3114 GLubyte p
= ubsrc
[i
];
3115 rgba
[i
][rDst
] = ((p
) & 0x7);
3116 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3117 rgba
[i
][bDst
] = ((p
>> 6) );
3122 case GL_UNSIGNED_SHORT_5_6_5
:
3124 const GLushort
*ussrc
= (const GLushort
*) src
;
3126 for (i
= 0; i
< n
; i
++) {
3127 GLushort p
= ussrc
[i
];
3129 rgba
[i
][rDst
] = ((p
>> 11) );
3130 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3131 rgba
[i
][bDst
] = ((p
) & 0x1f);
3136 const GLushort
*ussrc
= (const GLushort
*) src
;
3138 for (i
= 0; i
< n
; i
++) {
3139 GLushort p
= ussrc
[i
];
3140 rgba
[i
][rDst
] = ((p
>> 11) );
3141 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3142 rgba
[i
][bDst
] = ((p
) & 0x1f);
3147 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3149 const GLushort
*ussrc
= (const GLushort
*) src
;
3151 for (i
= 0; i
< n
; i
++) {
3152 GLushort p
= ussrc
[i
];
3154 rgba
[i
][rDst
] = ((p
) & 0x1f);
3155 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3156 rgba
[i
][bDst
] = ((p
>> 11) );
3161 const GLushort
*ussrc
= (const GLushort
*) src
;
3163 for (i
= 0; i
< n
; i
++) {
3164 GLushort p
= ussrc
[i
];
3165 rgba
[i
][rDst
] = ((p
) & 0x1f);
3166 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3167 rgba
[i
][bDst
] = ((p
>> 11) );
3172 case GL_UNSIGNED_SHORT_4_4_4_4
:
3174 const GLushort
*ussrc
= (const GLushort
*) src
;
3176 for (i
= 0; i
< n
; i
++) {
3177 GLushort p
= ussrc
[i
];
3179 rgba
[i
][rDst
] = ((p
>> 12) );
3180 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3181 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3182 rgba
[i
][aDst
] = ((p
) & 0xf);
3186 const GLushort
*ussrc
= (const GLushort
*) src
;
3188 for (i
= 0; i
< n
; i
++) {
3189 GLushort p
= ussrc
[i
];
3190 rgba
[i
][rDst
] = ((p
>> 12) );
3191 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3192 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3193 rgba
[i
][aDst
] = ((p
) & 0xf);
3197 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3199 const GLushort
*ussrc
= (const GLushort
*) src
;
3201 for (i
= 0; i
< n
; i
++) {
3202 GLushort p
= ussrc
[i
];
3204 rgba
[i
][rDst
] = ((p
) & 0xf);
3205 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3206 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3207 rgba
[i
][aDst
] = ((p
>> 12) );
3211 const GLushort
*ussrc
= (const GLushort
*) src
;
3213 for (i
= 0; i
< n
; i
++) {
3214 GLushort p
= ussrc
[i
];
3215 rgba
[i
][rDst
] = ((p
) & 0xf);
3216 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3217 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3218 rgba
[i
][aDst
] = ((p
>> 12) );
3222 case GL_UNSIGNED_SHORT_5_5_5_1
:
3224 const GLushort
*ussrc
= (const GLushort
*) src
;
3226 for (i
= 0; i
< n
; i
++) {
3227 GLushort p
= ussrc
[i
];
3229 rgba
[i
][rDst
] = ((p
>> 11) );
3230 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3231 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3232 rgba
[i
][aDst
] = ((p
) & 0x1 );
3236 const GLushort
*ussrc
= (const GLushort
*) src
;
3238 for (i
= 0; i
< n
; i
++) {
3239 GLushort p
= ussrc
[i
];
3240 rgba
[i
][rDst
] = ((p
>> 11) );
3241 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3242 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3243 rgba
[i
][aDst
] = ((p
) & 0x1 );
3247 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3249 const GLushort
*ussrc
= (const GLushort
*) src
;
3251 for (i
= 0; i
< n
; i
++) {
3252 GLushort p
= ussrc
[i
];
3254 rgba
[i
][rDst
] = ((p
) & 0x1f);
3255 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3256 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3257 rgba
[i
][aDst
] = ((p
>> 15) );
3261 const GLushort
*ussrc
= (const GLushort
*) src
;
3263 for (i
= 0; i
< n
; i
++) {
3264 GLushort p
= ussrc
[i
];
3265 rgba
[i
][rDst
] = ((p
) & 0x1f);
3266 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3267 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3268 rgba
[i
][aDst
] = ((p
>> 15) );
3272 case GL_UNSIGNED_INT_8_8_8_8
:
3274 const GLuint
*uisrc
= (const GLuint
*) src
;
3276 for (i
= 0; i
< n
; i
++) {
3277 GLuint p
= uisrc
[i
];
3278 rgba
[i
][rDst
] = ((p
) & 0xff);
3279 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3280 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3281 rgba
[i
][aDst
] = ((p
>> 24) );
3285 const GLuint
*uisrc
= (const GLuint
*) src
;
3287 for (i
= 0; i
< n
; i
++) {
3288 GLuint p
= uisrc
[i
];
3289 rgba
[i
][rDst
] = ((p
>> 24) );
3290 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3291 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3292 rgba
[i
][aDst
] = ((p
) & 0xff);
3296 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3298 const GLuint
*uisrc
= (const GLuint
*) src
;
3300 for (i
= 0; i
< n
; i
++) {
3301 GLuint p
= uisrc
[i
];
3302 rgba
[i
][rDst
] = ((p
>> 24) );
3303 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3304 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3305 rgba
[i
][aDst
] = ((p
) & 0xff);
3309 const GLuint
*uisrc
= (const GLuint
*) src
;
3311 for (i
= 0; i
< n
; i
++) {
3312 GLuint p
= uisrc
[i
];
3313 rgba
[i
][rDst
] = ((p
) & 0xff);
3314 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3315 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3316 rgba
[i
][aDst
] = ((p
>> 24) );
3320 case GL_UNSIGNED_INT_10_10_10_2
:
3322 const GLuint
*uisrc
= (const GLuint
*) src
;
3324 for (i
= 0; i
< n
; i
++) {
3325 GLuint p
= uisrc
[i
];
3327 rgba
[i
][rDst
] = ((p
>> 22) );
3328 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3329 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3330 rgba
[i
][aDst
] = ((p
) & 0x3 );
3334 const GLuint
*uisrc
= (const GLuint
*) src
;
3336 for (i
= 0; i
< n
; i
++) {
3337 GLuint p
= uisrc
[i
];
3338 rgba
[i
][rDst
] = ((p
>> 22) );
3339 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3340 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3341 rgba
[i
][aDst
] = ((p
) & 0x3 );
3345 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3347 const GLuint
*uisrc
= (const GLuint
*) src
;
3349 for (i
= 0; i
< n
; i
++) {
3350 GLuint p
= uisrc
[i
];
3352 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3353 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3354 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3355 rgba
[i
][aDst
] = ((p
>> 30) );
3359 const GLuint
*uisrc
= (const GLuint
*) src
;
3361 for (i
= 0; i
< n
; i
++) {
3362 GLuint p
= uisrc
[i
];
3363 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3364 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3365 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3366 rgba
[i
][aDst
] = ((p
>> 30) );
3370 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3372 const GLuint
*uisrc
= (const GLuint
*) src
;
3375 for (i
= 0; i
< n
; i
++) {
3376 GLuint p
= uisrc
[i
];
3378 rgb9e5_to_float3(p
, f
);
3379 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3380 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3381 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3386 const GLuint
*uisrc
= (const GLuint
*) src
;
3389 for (i
= 0; i
< n
; i
++) {
3390 GLuint p
= uisrc
[i
];
3391 rgb9e5_to_float3(p
, f
);
3392 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3393 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3394 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3399 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3401 const GLuint
*uisrc
= (const GLuint
*) src
;
3404 for (i
= 0; i
< n
; i
++) {
3405 GLuint p
= uisrc
[i
];
3407 r11g11b10f_to_float3(p
, f
);
3408 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3409 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3410 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3415 const GLuint
*uisrc
= (const GLuint
*) src
;
3418 for (i
= 0; i
< n
; i
++) {
3419 GLuint p
= uisrc
[i
];
3420 r11g11b10f_to_float3(p
, f
);
3421 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3422 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3423 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3429 _mesa_problem(NULL
, "bad srcType in extract uint data");
3438 * Unpack a row of color image data from a client buffer according to
3439 * the pixel unpacking parameters.
3440 * Return GLubyte values in the specified dest image format.
3441 * This is used by glDrawPixels and glTexImage?D().
3442 * \param ctx - the context
3443 * n - number of pixels in the span
3444 * dstFormat - format of destination color array
3445 * dest - the destination color array
3446 * srcFormat - source image format
3447 * srcType - source image data type
3448 * source - source image pointer
3449 * srcPacking - pixel unpacking parameters
3450 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3452 * XXX perhaps expand this to process whole images someday.
3455 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3456 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3457 GLenum srcFormat
, GLenum srcType
,
3458 const GLvoid
*source
,
3459 const struct gl_pixelstore_attrib
*srcPacking
,
3460 GLbitfield transferOps
)
3462 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3463 ASSERT(dstFormat
== GL_ALPHA
||
3464 dstFormat
== GL_LUMINANCE
||
3465 dstFormat
== GL_LUMINANCE_ALPHA
||
3466 dstFormat
== GL_INTENSITY
||
3467 dstFormat
== GL_RED
||
3468 dstFormat
== GL_RG
||
3469 dstFormat
== GL_RGB
||
3470 dstFormat
== GL_RGBA
);
3472 ASSERT(srcFormat
== GL_RED
||
3473 srcFormat
== GL_GREEN
||
3474 srcFormat
== GL_BLUE
||
3475 srcFormat
== GL_ALPHA
||
3476 srcFormat
== GL_LUMINANCE
||
3477 srcFormat
== GL_LUMINANCE_ALPHA
||
3478 srcFormat
== GL_INTENSITY
||
3479 srcFormat
== GL_RG
||
3480 srcFormat
== GL_RGB
||
3481 srcFormat
== GL_BGR
||
3482 srcFormat
== GL_RGBA
||
3483 srcFormat
== GL_BGRA
||
3484 srcFormat
== GL_ABGR_EXT
||
3485 srcFormat
== GL_COLOR_INDEX
);
3487 ASSERT(srcType
== GL_BITMAP
||
3488 srcType
== GL_UNSIGNED_BYTE
||
3489 srcType
== GL_BYTE
||
3490 srcType
== GL_UNSIGNED_SHORT
||
3491 srcType
== GL_SHORT
||
3492 srcType
== GL_UNSIGNED_INT
||
3493 srcType
== GL_INT
||
3494 srcType
== GL_HALF_FLOAT_ARB
||
3495 srcType
== GL_FLOAT
||
3496 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3497 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3498 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3499 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3500 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3501 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3502 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3503 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3504 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3505 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3506 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3507 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3508 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3509 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3511 /* EXT_texture_integer specifies no transfer ops on integer
3512 * types in the resolved issues section. Just set them to 0
3513 * for integer surfaces.
3518 /* Try simple cases first */
3519 if (transferOps
== 0) {
3520 if (srcType
== GL_UNSIGNED_BYTE
) {
3521 if (dstFormat
== GL_RGBA
) {
3522 if (srcFormat
== GL_RGBA
) {
3523 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3526 else if (srcFormat
== GL_RGB
) {
3528 const GLubyte
*src
= (const GLubyte
*) source
;
3529 GLubyte
*dst
= dest
;
3530 for (i
= 0; i
< n
; i
++) {
3541 else if (dstFormat
== GL_RGB
) {
3542 if (srcFormat
== GL_RGB
) {
3543 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3546 else if (srcFormat
== GL_RGBA
) {
3548 const GLubyte
*src
= (const GLubyte
*) source
;
3549 GLubyte
*dst
= dest
;
3550 for (i
= 0; i
< n
; i
++) {
3560 else if (dstFormat
== srcFormat
) {
3561 GLint comps
= _mesa_components_in_format(srcFormat
);
3563 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3568 * Common situation, loading 8bit RGBA/RGB source images
3569 * into 16/32 bit destination. (OSMesa16/32)
3571 else if (srcType
== GL_UNSIGNED_BYTE
) {
3572 if (dstFormat
== GL_RGBA
) {
3573 if (srcFormat
== GL_RGB
) {
3575 const GLubyte
*src
= (const GLubyte
*) source
;
3576 GLubyte
*dst
= dest
;
3577 for (i
= 0; i
< n
; i
++) {
3587 else if (srcFormat
== GL_RGBA
) {
3589 const GLubyte
*src
= (const GLubyte
*) source
;
3590 GLubyte
*dst
= dest
;
3591 for (i
= 0; i
< n
; i
++) {
3602 else if (dstFormat
== GL_RGB
) {
3603 if (srcFormat
== GL_RGB
) {
3605 const GLubyte
*src
= (const GLubyte
*) source
;
3606 GLubyte
*dst
= dest
;
3607 for (i
= 0; i
< n
; i
++) {
3616 else if (srcFormat
== GL_RGBA
) {
3618 const GLubyte
*src
= (const GLubyte
*) source
;
3619 GLubyte
*dst
= dest
;
3620 for (i
= 0; i
< n
; i
++) {
3634 /* general solution begins here */
3636 GLint dstComponents
;
3637 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3638 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3641 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3645 dstComponents
= _mesa_components_in_format( dstFormat
);
3646 /* source & dest image formats should have been error checked by now */
3647 assert(dstComponents
> 0);
3650 * Extract image data and convert to RGBA floats
3652 if (srcFormat
== GL_COLOR_INDEX
) {
3653 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3656 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3660 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3663 /* Convert indexes to RGBA */
3664 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3665 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3667 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3669 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3670 * with color indexes.
3672 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3677 /* non-color index data */
3678 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3679 srcPacking
->SwapBytes
);
3682 /* Need to clamp if returning GLubytes */
3683 transferOps
|= IMAGE_CLAMP_BIT
;
3686 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3689 get_component_indexes(dstFormat
,
3690 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3692 /* Now return the GLubyte data in the requested dstFormat */
3694 GLubyte
*dst
= dest
;
3696 for (i
= 0; i
< n
; i
++) {
3697 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3698 dst
+= dstComponents
;
3703 GLubyte
*dst
= dest
;
3705 for (i
= 0; i
< n
; i
++) {
3706 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3707 dst
+= dstComponents
;
3712 GLubyte
*dst
= dest
;
3714 for (i
= 0; i
< n
; i
++) {
3715 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3716 dst
+= dstComponents
;
3721 GLubyte
*dst
= dest
;
3723 for (i
= 0; i
< n
; i
++) {
3724 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3725 dst
+= dstComponents
;
3730 GLubyte
*dst
= dest
;
3733 assert(dstComponents
== 1);
3734 for (i
= 0; i
< n
; i
++) {
3735 /* Intensity comes from red channel */
3736 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3741 GLubyte
*dst
= dest
;
3744 for (i
= 0; i
< n
; i
++) {
3745 /* Luminance comes from red channel */
3746 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3747 dst
+= dstComponents
;
3757 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3758 * instead of GLubyte.
3761 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3762 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3763 GLenum srcFormat
, GLenum srcType
,
3764 const GLvoid
*source
,
3765 const struct gl_pixelstore_attrib
*srcPacking
,
3766 GLbitfield transferOps
)
3768 ASSERT(dstFormat
== GL_ALPHA
||
3769 dstFormat
== GL_LUMINANCE
||
3770 dstFormat
== GL_LUMINANCE_ALPHA
||
3771 dstFormat
== GL_INTENSITY
||
3772 dstFormat
== GL_RED
||
3773 dstFormat
== GL_RG
||
3774 dstFormat
== GL_RGB
||
3775 dstFormat
== GL_RGBA
);
3777 ASSERT(srcFormat
== GL_RED
||
3778 srcFormat
== GL_GREEN
||
3779 srcFormat
== GL_BLUE
||
3780 srcFormat
== GL_ALPHA
||
3781 srcFormat
== GL_LUMINANCE
||
3782 srcFormat
== GL_LUMINANCE_ALPHA
||
3783 srcFormat
== GL_INTENSITY
||
3784 srcFormat
== GL_RG
||
3785 srcFormat
== GL_RGB
||
3786 srcFormat
== GL_BGR
||
3787 srcFormat
== GL_RGBA
||
3788 srcFormat
== GL_BGRA
||
3789 srcFormat
== GL_ABGR_EXT
||
3790 srcFormat
== GL_RED_INTEGER_EXT
||
3791 srcFormat
== GL_GREEN_INTEGER_EXT
||
3792 srcFormat
== GL_BLUE_INTEGER_EXT
||
3793 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3794 srcFormat
== GL_RGB_INTEGER_EXT
||
3795 srcFormat
== GL_RGBA_INTEGER_EXT
||
3796 srcFormat
== GL_BGR_INTEGER_EXT
||
3797 srcFormat
== GL_BGRA_INTEGER_EXT
||
3798 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3799 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3800 srcFormat
== GL_COLOR_INDEX
);
3802 ASSERT(srcType
== GL_BITMAP
||
3803 srcType
== GL_UNSIGNED_BYTE
||
3804 srcType
== GL_BYTE
||
3805 srcType
== GL_UNSIGNED_SHORT
||
3806 srcType
== GL_SHORT
||
3807 srcType
== GL_UNSIGNED_INT
||
3808 srcType
== GL_INT
||
3809 srcType
== GL_HALF_FLOAT_ARB
||
3810 srcType
== GL_FLOAT
||
3811 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3812 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3813 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3814 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3815 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3816 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3817 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3818 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3819 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3820 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3821 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3822 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3823 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3824 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3826 /* general solution, no special cases, yet */
3828 GLint dstComponents
;
3829 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3830 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3831 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3834 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3838 dstComponents
= _mesa_components_in_format( dstFormat
);
3839 /* source & dest image formats should have been error checked by now */
3840 assert(dstComponents
> 0);
3842 /* EXT_texture_integer specifies no transfer ops on integer
3843 * types in the resolved issues section. Just set them to 0
3844 * for integer surfaces.
3850 * Extract image data and convert to RGBA floats
3852 if (srcFormat
== GL_COLOR_INDEX
) {
3853 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3856 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3861 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3864 /* Convert indexes to RGBA */
3865 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3866 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3868 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3870 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3871 * with color indexes.
3873 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3878 /* non-color index data */
3879 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3880 srcPacking
->SwapBytes
);
3884 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3887 get_component_indexes(dstFormat
,
3888 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3890 /* Now pack results in the requested dstFormat */
3892 GLfloat
*dst
= dest
;
3894 for (i
= 0; i
< n
; i
++) {
3895 dst
[rDst
] = rgba
[i
][RCOMP
];
3896 dst
+= dstComponents
;
3901 GLfloat
*dst
= dest
;
3903 for (i
= 0; i
< n
; i
++) {
3904 dst
[gDst
] = rgba
[i
][GCOMP
];
3905 dst
+= dstComponents
;
3910 GLfloat
*dst
= dest
;
3912 for (i
= 0; i
< n
; i
++) {
3913 dst
[bDst
] = rgba
[i
][BCOMP
];
3914 dst
+= dstComponents
;
3919 GLfloat
*dst
= dest
;
3921 for (i
= 0; i
< n
; i
++) {
3922 dst
[aDst
] = rgba
[i
][ACOMP
];
3923 dst
+= dstComponents
;
3928 GLfloat
*dst
= dest
;
3931 assert(dstComponents
== 1);
3932 for (i
= 0; i
< n
; i
++) {
3933 /* Intensity comes from red channel */
3934 dst
[i
] = rgba
[i
][RCOMP
];
3939 GLfloat
*dst
= dest
;
3942 for (i
= 0; i
< n
; i
++) {
3943 /* Luminance comes from red channel */
3944 dst
[0] = rgba
[i
][RCOMP
];
3945 dst
+= dstComponents
;
3955 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3956 * instead of GLubyte.
3957 * No pixel transfer ops are applied.
3960 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3961 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3962 GLenum srcFormat
, GLenum srcType
,
3963 const GLvoid
*source
,
3964 const struct gl_pixelstore_attrib
*srcPacking
)
3966 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3969 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3973 ASSERT(dstFormat
== GL_ALPHA
||
3974 dstFormat
== GL_LUMINANCE
||
3975 dstFormat
== GL_LUMINANCE_ALPHA
||
3976 dstFormat
== GL_INTENSITY
||
3977 dstFormat
== GL_RED
||
3978 dstFormat
== GL_RG
||
3979 dstFormat
== GL_RGB
||
3980 dstFormat
== GL_RGBA
);
3982 ASSERT(srcFormat
== GL_RED
||
3983 srcFormat
== GL_GREEN
||
3984 srcFormat
== GL_BLUE
||
3985 srcFormat
== GL_ALPHA
||
3986 srcFormat
== GL_LUMINANCE
||
3987 srcFormat
== GL_LUMINANCE_ALPHA
||
3988 srcFormat
== GL_INTENSITY
||
3989 srcFormat
== GL_RG
||
3990 srcFormat
== GL_RGB
||
3991 srcFormat
== GL_BGR
||
3992 srcFormat
== GL_RGBA
||
3993 srcFormat
== GL_BGRA
||
3994 srcFormat
== GL_ABGR_EXT
||
3995 srcFormat
== GL_RED_INTEGER_EXT
||
3996 srcFormat
== GL_GREEN_INTEGER_EXT
||
3997 srcFormat
== GL_BLUE_INTEGER_EXT
||
3998 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3999 srcFormat
== GL_RGB_INTEGER_EXT
||
4000 srcFormat
== GL_RGBA_INTEGER_EXT
||
4001 srcFormat
== GL_BGR_INTEGER_EXT
||
4002 srcFormat
== GL_BGRA_INTEGER_EXT
||
4003 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4004 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4006 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4007 srcType
== GL_BYTE
||
4008 srcType
== GL_UNSIGNED_SHORT
||
4009 srcType
== GL_SHORT
||
4010 srcType
== GL_UNSIGNED_INT
||
4011 srcType
== GL_INT
||
4012 srcType
== GL_HALF_FLOAT_ARB
||
4013 srcType
== GL_FLOAT
||
4014 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4015 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4016 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4017 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4018 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4019 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4020 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4021 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4022 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4023 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4024 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4025 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4026 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4027 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4030 /* Extract image data as uint[4] pixels */
4031 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4032 srcPacking
->SwapBytes
);
4034 if (dstFormat
== GL_RGBA
) {
4036 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4040 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4041 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4043 assert(dstComponents
> 0);
4045 get_component_indexes(dstFormat
,
4046 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4048 /* Now pack values in the requested dest format */
4052 for (i
= 0; i
< n
; i
++) {
4053 dst
[rDst
] = rgba
[i
][RCOMP
];
4054 dst
+= dstComponents
;
4061 for (i
= 0; i
< n
; i
++) {
4062 dst
[gDst
] = rgba
[i
][GCOMP
];
4063 dst
+= dstComponents
;
4070 for (i
= 0; i
< n
; i
++) {
4071 dst
[bDst
] = rgba
[i
][BCOMP
];
4072 dst
+= dstComponents
;
4079 for (i
= 0; i
< n
; i
++) {
4080 dst
[aDst
] = rgba
[i
][ACOMP
];
4081 dst
+= dstComponents
;
4089 assert(dstComponents
== 1);
4090 for (i
= 0; i
< n
; i
++) {
4091 /* Intensity comes from red channel */
4092 dst
[i
] = rgba
[i
][RCOMP
];
4100 for (i
= 0; i
< n
; i
++) {
4101 /* Luminance comes from red channel */
4102 dst
[0] = rgba
[i
][RCOMP
];
4103 dst
+= dstComponents
;
4114 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4115 * directly return GLbyte data, no transfer ops apply.
4118 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4119 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4120 GLenum srcFormat
, GLenum srcType
,
4121 const GLvoid
*source
,
4122 const struct gl_pixelstore_attrib
*srcPacking
,
4123 GLbitfield transferOps
)
4125 ASSERT(dstFormat
== GL_DUDV_ATI
);
4126 ASSERT(srcFormat
== GL_DUDV_ATI
||
4127 srcFormat
== GL_DU8DV8_ATI
);
4129 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4130 srcType
== GL_BYTE
||
4131 srcType
== GL_UNSIGNED_SHORT
||
4132 srcType
== GL_SHORT
||
4133 srcType
== GL_UNSIGNED_INT
||
4134 srcType
== GL_INT
||
4135 srcType
== GL_HALF_FLOAT_ARB
||
4136 srcType
== GL_FLOAT
);
4138 /* general solution */
4140 GLint dstComponents
;
4143 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4146 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4150 dstComponents
= _mesa_components_in_format( dstFormat
);
4151 /* source & dest image formats should have been error checked by now */
4152 assert(dstComponents
> 0);
4155 * Extract image data and convert to RGBA floats
4157 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4158 srcPacking
->SwapBytes
);
4161 /* Now determine which color channels we need to produce.
4162 * And determine the dest index (offset) within each color tuple.
4165 /* Now pack results in the requested dstFormat */
4166 for (i
= 0; i
< n
; i
++) {
4167 /* not sure - need clamp[-1,1] here? */
4168 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4169 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4170 dst
+= dstComponents
;
4178 * Unpack a row of color index data from a client buffer according to
4179 * the pixel unpacking parameters.
4180 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4182 * Args: ctx - the context
4183 * n - number of pixels
4184 * dstType - destination data type
4185 * dest - destination array
4186 * srcType - source pixel type
4187 * source - source data pointer
4188 * srcPacking - pixel unpacking parameters
4189 * transferOps - the pixel transfer operations to apply
4192 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4193 GLenum dstType
, GLvoid
*dest
,
4194 GLenum srcType
, const GLvoid
*source
,
4195 const struct gl_pixelstore_attrib
*srcPacking
,
4196 GLbitfield transferOps
)
4198 ASSERT(srcType
== GL_BITMAP
||
4199 srcType
== GL_UNSIGNED_BYTE
||
4200 srcType
== GL_BYTE
||
4201 srcType
== GL_UNSIGNED_SHORT
||
4202 srcType
== GL_SHORT
||
4203 srcType
== GL_UNSIGNED_INT
||
4204 srcType
== GL_INT
||
4205 srcType
== GL_HALF_FLOAT_ARB
||
4206 srcType
== GL_FLOAT
);
4208 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4209 dstType
== GL_UNSIGNED_SHORT
||
4210 dstType
== GL_UNSIGNED_INT
);
4213 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4216 * Try simple cases first
4218 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4219 && dstType
== GL_UNSIGNED_BYTE
) {
4220 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4222 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4223 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4224 memcpy(dest
, source
, n
* sizeof(GLuint
));
4230 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4233 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4237 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4241 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4243 /* convert to dest type */
4245 case GL_UNSIGNED_BYTE
:
4247 GLubyte
*dst
= (GLubyte
*) dest
;
4249 for (i
= 0; i
< n
; i
++) {
4250 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4254 case GL_UNSIGNED_SHORT
:
4256 GLuint
*dst
= (GLuint
*) dest
;
4258 for (i
= 0; i
< n
; i
++) {
4259 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4263 case GL_UNSIGNED_INT
:
4264 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4267 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4276 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4277 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4278 const struct gl_pixelstore_attrib
*dstPacking
,
4279 GLbitfield transferOps
)
4281 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4284 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4288 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4290 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4291 /* make a copy of input */
4292 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4293 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4298 case GL_UNSIGNED_BYTE
:
4300 GLubyte
*dst
= (GLubyte
*) dest
;
4302 for (i
= 0; i
< n
; i
++) {
4303 *dst
++ = (GLubyte
) source
[i
];
4309 GLbyte
*dst
= (GLbyte
*) dest
;
4311 for (i
= 0; i
< n
; i
++) {
4312 dst
[i
] = (GLbyte
) source
[i
];
4316 case GL_UNSIGNED_SHORT
:
4318 GLushort
*dst
= (GLushort
*) dest
;
4320 for (i
= 0; i
< n
; i
++) {
4321 dst
[i
] = (GLushort
) source
[i
];
4323 if (dstPacking
->SwapBytes
) {
4324 _mesa_swap2( (GLushort
*) dst
, n
);
4330 GLshort
*dst
= (GLshort
*) dest
;
4332 for (i
= 0; i
< n
; i
++) {
4333 dst
[i
] = (GLshort
) source
[i
];
4335 if (dstPacking
->SwapBytes
) {
4336 _mesa_swap2( (GLushort
*) dst
, n
);
4340 case GL_UNSIGNED_INT
:
4342 GLuint
*dst
= (GLuint
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLuint
) source
[i
];
4347 if (dstPacking
->SwapBytes
) {
4348 _mesa_swap4( (GLuint
*) dst
, n
);
4354 GLint
*dst
= (GLint
*) dest
;
4356 for (i
= 0; i
< n
; i
++) {
4357 dst
[i
] = (GLint
) source
[i
];
4359 if (dstPacking
->SwapBytes
) {
4360 _mesa_swap4( (GLuint
*) dst
, n
);
4366 GLfloat
*dst
= (GLfloat
*) dest
;
4368 for (i
= 0; i
< n
; i
++) {
4369 dst
[i
] = (GLfloat
) source
[i
];
4371 if (dstPacking
->SwapBytes
) {
4372 _mesa_swap4( (GLuint
*) dst
, n
);
4376 case GL_HALF_FLOAT_ARB
:
4378 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4380 for (i
= 0; i
< n
; i
++) {
4381 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4383 if (dstPacking
->SwapBytes
) {
4384 _mesa_swap2( (GLushort
*) dst
, n
);
4389 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4397 * Unpack a row of stencil data from a client buffer according to
4398 * the pixel unpacking parameters.
4399 * This is (or will be) used by glDrawPixels
4401 * Args: ctx - the context
4402 * n - number of pixels
4403 * dstType - destination data type
4404 * dest - destination array
4405 * srcType - source pixel type
4406 * source - source data pointer
4407 * srcPacking - pixel unpacking parameters
4408 * transferOps - apply offset/bias/lookup ops?
4411 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4412 GLenum dstType
, GLvoid
*dest
,
4413 GLenum srcType
, const GLvoid
*source
,
4414 const struct gl_pixelstore_attrib
*srcPacking
,
4415 GLbitfield transferOps
)
4417 ASSERT(srcType
== GL_BITMAP
||
4418 srcType
== GL_UNSIGNED_BYTE
||
4419 srcType
== GL_BYTE
||
4420 srcType
== GL_UNSIGNED_SHORT
||
4421 srcType
== GL_SHORT
||
4422 srcType
== GL_UNSIGNED_INT
||
4423 srcType
== GL_INT
||
4424 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4425 srcType
== GL_HALF_FLOAT_ARB
||
4426 srcType
== GL_FLOAT
||
4427 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4429 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4430 dstType
== GL_UNSIGNED_SHORT
||
4431 dstType
== GL_UNSIGNED_INT
||
4432 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4434 /* only shift and offset apply to stencil */
4435 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4438 * Try simple cases first
4440 if (transferOps
== 0 &&
4441 !ctx
->Pixel
.MapStencilFlag
&&
4442 srcType
== GL_UNSIGNED_BYTE
&&
4443 dstType
== GL_UNSIGNED_BYTE
) {
4444 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4446 else if (transferOps
== 0 &&
4447 !ctx
->Pixel
.MapStencilFlag
&&
4448 srcType
== GL_UNSIGNED_INT
&&
4449 dstType
== GL_UNSIGNED_INT
&&
4450 !srcPacking
->SwapBytes
) {
4451 memcpy(dest
, source
, n
* sizeof(GLuint
));
4457 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4460 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4464 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4467 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4468 /* shift and offset indexes */
4469 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4472 if (ctx
->Pixel
.MapStencilFlag
) {
4473 /* Apply stencil lookup table */
4474 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4476 for (i
= 0; i
< n
; i
++) {
4477 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4481 /* convert to dest type */
4483 case GL_UNSIGNED_BYTE
:
4485 GLubyte
*dst
= (GLubyte
*) dest
;
4487 for (i
= 0; i
< n
; i
++) {
4488 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4492 case GL_UNSIGNED_SHORT
:
4494 GLuint
*dst
= (GLuint
*) dest
;
4496 for (i
= 0; i
< n
; i
++) {
4497 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4501 case GL_UNSIGNED_INT
:
4502 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4504 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4506 GLuint
*dst
= (GLuint
*) dest
;
4508 for (i
= 0; i
< n
; i
++) {
4509 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4514 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4523 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4524 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4525 const struct gl_pixelstore_attrib
*dstPacking
)
4527 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4530 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4534 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4535 ctx
->Pixel
.MapStencilFlag
) {
4536 /* make a copy of input */
4537 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4538 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4543 case GL_UNSIGNED_BYTE
:
4544 if (sizeof(GLstencil
) == 1) {
4545 memcpy( dest
, source
, n
);
4548 GLubyte
*dst
= (GLubyte
*) dest
;
4551 dst
[i
] = (GLubyte
) source
[i
];
4557 GLbyte
*dst
= (GLbyte
*) dest
;
4560 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4564 case GL_UNSIGNED_SHORT
:
4566 GLushort
*dst
= (GLushort
*) dest
;
4569 dst
[i
] = (GLushort
) source
[i
];
4571 if (dstPacking
->SwapBytes
) {
4572 _mesa_swap2( (GLushort
*) dst
, n
);
4578 GLshort
*dst
= (GLshort
*) dest
;
4581 dst
[i
] = (GLshort
) source
[i
];
4583 if (dstPacking
->SwapBytes
) {
4584 _mesa_swap2( (GLushort
*) dst
, n
);
4588 case GL_UNSIGNED_INT
:
4590 GLuint
*dst
= (GLuint
*) dest
;
4593 dst
[i
] = (GLuint
) source
[i
];
4595 if (dstPacking
->SwapBytes
) {
4596 _mesa_swap4( (GLuint
*) dst
, n
);
4602 GLint
*dst
= (GLint
*) dest
;
4605 dst
[i
] = (GLint
) source
[i
];
4607 if (dstPacking
->SwapBytes
) {
4608 _mesa_swap4( (GLuint
*) dst
, n
);
4614 GLfloat
*dst
= (GLfloat
*) dest
;
4617 dst
[i
] = (GLfloat
) source
[i
];
4619 if (dstPacking
->SwapBytes
) {
4620 _mesa_swap4( (GLuint
*) dst
, n
);
4624 case GL_HALF_FLOAT_ARB
:
4626 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4629 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4631 if (dstPacking
->SwapBytes
) {
4632 _mesa_swap2( (GLushort
*) dst
, n
);
4637 if (dstPacking
->LsbFirst
) {
4638 GLubyte
*dst
= (GLubyte
*) dest
;
4641 for (i
= 0; i
< n
; i
++) {
4644 *dst
|= ((source
[i
] != 0) << shift
);
4653 GLubyte
*dst
= (GLubyte
*) dest
;
4656 for (i
= 0; i
< n
; i
++) {
4659 *dst
|= ((source
[i
] != 0) << shift
);
4669 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4675 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4678 const GLTYPE *src = (const GLTYPE *)source; \
4679 for (i = 0; i < n; i++) { \
4680 GLTYPE value = src[i]; \
4681 if (srcPacking->SwapBytes) { \
4682 if (sizeof(GLTYPE) == 2) { \
4684 } else if (sizeof(GLTYPE) == 4) { \
4688 depthValues[i] = GLTYPE2FLOAT(value); \
4694 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4695 * or GLfloat values.
4696 * The glPixelTransfer (scale/bias) params will be applied.
4698 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4699 * \param depthMax max value for returned GLushort or GLuint values
4700 * (ignored for GLfloat).
4703 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4704 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4705 GLenum srcType
, const GLvoid
*source
,
4706 const struct gl_pixelstore_attrib
*srcPacking
)
4708 GLfloat
*depthTemp
= NULL
, *depthValues
;
4709 GLboolean needClamp
= GL_FALSE
;
4711 /* Look for special cases first.
4712 * Not only are these faster, they're less prone to numeric conversion
4713 * problems. Otherwise, converting from an int type to a float then
4714 * back to an int type can introduce errors that will show up as
4715 * artifacts in things like depth peeling which uses glCopyTexImage.
4717 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4718 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4719 const GLuint
*src
= (const GLuint
*) source
;
4720 GLushort
*dst
= (GLushort
*) dest
;
4722 for (i
= 0; i
< n
; i
++) {
4723 dst
[i
] = src
[i
] >> 16;
4727 if (srcType
== GL_UNSIGNED_SHORT
4728 && dstType
== GL_UNSIGNED_INT
4729 && depthMax
== 0xffffffff) {
4730 const GLushort
*src
= (const GLushort
*) source
;
4731 GLuint
*dst
= (GLuint
*) dest
;
4733 for (i
= 0; i
< n
; i
++) {
4734 dst
[i
] = src
[i
] | (src
[i
] << 16);
4738 if (srcType
== GL_UNSIGNED_INT_24_8
4739 && dstType
== GL_UNSIGNED_INT
4740 && depthMax
== 0xffffff) {
4741 const GLuint
*src
= (const GLuint
*) source
;
4742 GLuint
*dst
= (GLuint
*) dest
;
4744 for (i
= 0; i
< n
; i
++) {
4745 dst
[i
] = src
[i
] >> 8;
4749 /* XXX may want to add additional cases here someday */
4752 /* general case path follows */
4754 if (dstType
== GL_FLOAT
) {
4755 depthValues
= (GLfloat
*) dest
;
4758 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4760 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4764 depthValues
= depthTemp
;
4767 /* Convert incoming values to GLfloat. Some conversions will require
4772 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4773 needClamp
= GL_TRUE
;
4775 case GL_UNSIGNED_BYTE
:
4776 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4779 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4780 needClamp
= GL_TRUE
;
4782 case GL_UNSIGNED_SHORT
:
4783 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4786 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4787 needClamp
= GL_TRUE
;
4789 case GL_UNSIGNED_INT
:
4790 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4792 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4793 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4794 depthMax
== 0xffffff &&
4795 ctx
->Pixel
.DepthScale
== 1.0 &&
4796 ctx
->Pixel
.DepthBias
== 0.0) {
4797 const GLuint
*src
= (const GLuint
*) source
;
4798 GLuint
*zValues
= (GLuint
*) dest
;
4800 for (i
= 0; i
< n
; i
++) {
4801 GLuint value
= src
[i
];
4802 if (srcPacking
->SwapBytes
) {
4805 zValues
[i
] = value
& 0xffffff00;
4811 const GLuint
*src
= (const GLuint
*) source
;
4812 const GLfloat scale
= 1.0f
/ 0xffffff;
4814 for (i
= 0; i
< n
; i
++) {
4815 GLuint value
= src
[i
];
4816 if (srcPacking
->SwapBytes
) {
4819 depthValues
[i
] = (value
>> 8) * scale
;
4823 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4826 const GLfloat
*src
= (const GLfloat
*)source
;
4827 for (i
= 0; i
< n
; i
++) {
4828 GLfloat value
= src
[i
* 2];
4829 if (srcPacking
->SwapBytes
) {
4832 depthValues
[i
] = value
;
4834 needClamp
= GL_TRUE
;
4838 DEPTH_VALUES(GLfloat
, 1*);
4839 needClamp
= GL_TRUE
;
4841 case GL_HALF_FLOAT_ARB
:
4844 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4845 for (i
= 0; i
< n
; i
++) {
4846 GLhalfARB value
= src
[i
];
4847 if (srcPacking
->SwapBytes
) {
4850 depthValues
[i
] = _mesa_half_to_float(value
);
4852 needClamp
= GL_TRUE
;
4856 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4861 /* apply depth scale and bias */
4863 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4864 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4865 if (scale
!= 1.0 || bias
!= 0.0) {
4867 for (i
= 0; i
< n
; i
++) {
4868 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4870 needClamp
= GL_TRUE
;
4874 /* clamp to [0, 1] */
4877 for (i
= 0; i
< n
; i
++) {
4878 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4883 * Convert values to dstType
4885 if (dstType
== GL_UNSIGNED_INT
) {
4886 GLuint
*zValues
= (GLuint
*) dest
;
4888 if (depthMax
<= 0xffffff) {
4889 /* no overflow worries */
4890 for (i
= 0; i
< n
; i
++) {
4891 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4895 /* need to use double precision to prevent overflow problems */
4896 for (i
= 0; i
< n
; i
++) {
4897 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4898 if (z
>= (GLdouble
) 0xffffffff)
4899 zValues
[i
] = 0xffffffff;
4901 zValues
[i
] = (GLuint
) z
;
4905 else if (dstType
== GL_UNSIGNED_SHORT
) {
4906 GLushort
*zValues
= (GLushort
*) dest
;
4908 ASSERT(depthMax
<= 0xffff);
4909 for (i
= 0; i
< n
; i
++) {
4910 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4913 else if (dstType
== GL_FLOAT
) {
4914 /* Nothing to do. depthValues is pointing to dest. */
4916 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4917 GLfloat
*zValues
= (GLfloat
*) dest
;
4919 for (i
= 0; i
< n
; i
++) {
4920 zValues
[i
*2] = depthValues
[i
];
4932 * Pack an array of depth values. The values are floats in [0,1].
4935 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4936 GLenum dstType
, const GLfloat
*depthSpan
,
4937 const struct gl_pixelstore_attrib
*dstPacking
)
4939 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4941 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4945 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4946 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4947 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4948 depthSpan
= depthCopy
;
4952 case GL_UNSIGNED_BYTE
:
4954 GLubyte
*dst
= (GLubyte
*) dest
;
4956 for (i
= 0; i
< n
; i
++) {
4957 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4963 GLbyte
*dst
= (GLbyte
*) dest
;
4965 for (i
= 0; i
< n
; i
++) {
4966 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4970 case GL_UNSIGNED_SHORT
:
4972 GLushort
*dst
= (GLushort
*) dest
;
4974 for (i
= 0; i
< n
; i
++) {
4975 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4977 if (dstPacking
->SwapBytes
) {
4978 _mesa_swap2( (GLushort
*) dst
, n
);
4984 GLshort
*dst
= (GLshort
*) dest
;
4986 for (i
= 0; i
< n
; i
++) {
4987 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4989 if (dstPacking
->SwapBytes
) {
4990 _mesa_swap2( (GLushort
*) dst
, n
);
4994 case GL_UNSIGNED_INT
:
4996 GLuint
*dst
= (GLuint
*) dest
;
4998 for (i
= 0; i
< n
; i
++) {
4999 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5001 if (dstPacking
->SwapBytes
) {
5002 _mesa_swap4( (GLuint
*) dst
, n
);
5008 GLint
*dst
= (GLint
*) dest
;
5010 for (i
= 0; i
< n
; i
++) {
5011 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5013 if (dstPacking
->SwapBytes
) {
5014 _mesa_swap4( (GLuint
*) dst
, n
);
5020 GLfloat
*dst
= (GLfloat
*) dest
;
5022 for (i
= 0; i
< n
; i
++) {
5023 dst
[i
] = depthSpan
[i
];
5025 if (dstPacking
->SwapBytes
) {
5026 _mesa_swap4( (GLuint
*) dst
, n
);
5030 case GL_HALF_FLOAT_ARB
:
5032 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5034 for (i
= 0; i
< n
; i
++) {
5035 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5037 if (dstPacking
->SwapBytes
) {
5038 _mesa_swap2( (GLushort
*) dst
, n
);
5043 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5052 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5055 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5056 GLenum dstType
, GLuint
*dest
,
5057 const GLfloat
*depthVals
,
5058 const GLstencil
*stencilVals
,
5059 const struct gl_pixelstore_attrib
*dstPacking
)
5061 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5062 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
5065 if (!depthCopy
|| !stencilCopy
) {
5066 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5072 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5073 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5074 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5075 depthVals
= depthCopy
;
5078 if (ctx
->Pixel
.IndexShift
||
5079 ctx
->Pixel
.IndexOffset
||
5080 ctx
->Pixel
.MapStencilFlag
) {
5081 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5082 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5083 stencilVals
= stencilCopy
;
5087 case GL_UNSIGNED_INT_24_8
:
5088 for (i
= 0; i
< n
; i
++) {
5089 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5090 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5093 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5094 for (i
= 0; i
< n
; i
++) {
5095 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5096 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5101 if (dstPacking
->SwapBytes
) {
5102 _mesa_swap4(dest
, n
);
5113 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5114 * Return all image data in a contiguous block. This is used when we
5115 * compile glDrawPixels, glTexImage, etc into a display list. We
5116 * need a copy of the data in a standard format.
5119 _mesa_unpack_image( GLuint dimensions
,
5120 GLsizei width
, GLsizei height
, GLsizei depth
,
5121 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5122 const struct gl_pixelstore_attrib
*unpack
)
5124 GLint bytesPerRow
, compsPerRow
;
5125 GLboolean flipBytes
, swap2
, swap4
;
5128 return NULL
; /* not necessarily an error */
5130 if (width
<= 0 || height
<= 0 || depth
<= 0)
5131 return NULL
; /* generate error later */
5133 if (type
== GL_BITMAP
) {
5134 bytesPerRow
= (width
+ 7) >> 3;
5135 flipBytes
= unpack
->LsbFirst
;
5136 swap2
= swap4
= GL_FALSE
;
5140 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5141 GLint components
= _mesa_components_in_format(format
);
5144 if (_mesa_type_is_packed(type
))
5147 if (bytesPerPixel
<= 0 || components
<= 0)
5148 return NULL
; /* bad format or type. generate error later */
5149 bytesPerRow
= bytesPerPixel
* width
;
5150 bytesPerComp
= bytesPerPixel
/ components
;
5151 flipBytes
= GL_FALSE
;
5152 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5153 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5154 compsPerRow
= components
* width
;
5155 assert(compsPerRow
>= width
);
5160 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5164 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5167 for (img
= 0; img
< depth
; img
++) {
5168 for (row
= 0; row
< height
; row
++) {
5169 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5170 width
, height
, format
, type
, img
, row
, 0);
5172 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5174 flipBytes
= GL_FALSE
;
5175 if (unpack
->LsbFirst
) {
5176 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5177 GLubyte dstMask
= 128;
5178 const GLubyte
*s
= src
;
5181 for (i
= 0; i
< width
; i
++) {
5185 if (srcMask
== 128) {
5190 srcMask
= srcMask
<< 1;
5198 dstMask
= dstMask
>> 1;
5203 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5204 GLubyte dstMask
= 128;
5205 const GLubyte
*s
= src
;
5208 for (i
= 0; i
< width
; i
++) {
5217 srcMask
= srcMask
>> 1;
5225 dstMask
= dstMask
>> 1;
5231 memcpy(dst
, src
, bytesPerRow
);
5234 /* byte flipping/swapping */
5236 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5239 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5242 _mesa_swap4((GLuint
*) dst
, compsPerRow
);