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");
510 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
514 * Component clamping (besides clamping to [0,1] in
515 * _mesa_apply_rgba_transfer_ops()).
518 /* clamping to dest type's min/max values */
520 if (get_type_min_max(dstType, &min, &max)) {
521 for (i = 0; i < n; i++) {
522 rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
523 rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
524 rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
525 rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
529 else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
530 /* compute luminance values */
531 if (transferOps & IMAGE_CLAMP_BIT) {
532 for (i = 0; i < n; i++) {
533 GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
534 luminance[i] = CLAMP(sum, 0.0F, 1.0F);
538 for (i = 0; i < n; i++) {
539 luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
545 * Pack/store the pixels. Ugh! Lots of cases!!!
548 case GL_UNSIGNED_BYTE:
550 GLubyte *dst = (GLubyte *) dstAddr;
554 dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
558 dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
562 dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
566 dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
570 dst[i] = FLOAT_TO_UBYTE(luminance[i]);
572 case GL_LUMINANCE_ALPHA:
574 dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
575 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
580 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
581 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
586 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
587 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
588 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
593 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
594 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
595 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
596 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
601 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
602 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
603 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
608 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
609 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
610 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
611 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
616 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
617 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
618 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
619 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
622 case GL_RED_INTEGER_EXT:
624 dst[i] = (GLubyte) rgba[i][RCOMP];
627 case GL_GREEN_INTEGER_EXT:
629 dst[i] = (GLubyte) rgba[i][GCOMP];
632 case GL_BLUE_INTEGER_EXT:
634 dst[i] = (GLubyte) rgba[i][BCOMP];
637 case GL_ALPHA_INTEGER_EXT:
639 dst[i] = (GLubyte) rgba[i][ACOMP];
642 case GL_RGB_INTEGER_EXT:
644 dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
645 dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
646 dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
649 case GL_RGBA_INTEGER_EXT:
651 dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
652 dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
653 dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
654 dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
657 case GL_BGR_INTEGER_EXT:
659 dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
660 dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
661 dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
664 case GL_BGRA_INTEGER_EXT:
666 dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
667 dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
668 dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
669 dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
672 case GL_LUMINANCE_INTEGER_EXT:
674 dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
677 dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
680 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
682 dst[i] = (GLubyte) (rgba[i][RCOMP] +
690 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
691 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
695 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
701 GLbyte *dst = (GLbyte *) dstAddr;
705 dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
709 dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
713 dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
717 dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
721 dst[i] = FLOAT_TO_BYTE(luminance[i]);
723 case GL_LUMINANCE_ALPHA:
725 dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
726 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
731 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
732 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
737 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
738 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
739 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
744 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
745 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
746 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
747 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
752 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
753 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
754 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
759 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
760 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
761 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
762 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
767 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
768 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
769 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
770 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
773 case GL_RED_INTEGER_EXT:
775 dst[i] = (GLbyte) rgba[i][RCOMP];
778 case GL_GREEN_INTEGER_EXT:
780 dst[i] = (GLbyte) rgba[i][GCOMP];
783 case GL_BLUE_INTEGER_EXT:
785 dst[i] = (GLbyte) rgba[i][BCOMP];
788 case GL_ALPHA_INTEGER_EXT:
790 dst[i] = (GLbyte) rgba[i][ACOMP];
793 case GL_RGB_INTEGER_EXT:
795 dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
796 dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
797 dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
800 case GL_RGBA_INTEGER_EXT:
802 dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
803 dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
804 dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
805 dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
808 case GL_BGR_INTEGER_EXT:
810 dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
811 dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
812 dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
815 case GL_BGRA_INTEGER_EXT:
817 dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
818 dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
819 dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
820 dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
823 case GL_LUMINANCE_INTEGER_EXT:
825 dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
828 dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
831 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
833 dst[i] = (GLbyte) (rgba[i][RCOMP] +
841 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
842 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
846 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
850 case GL_UNSIGNED_SHORT:
852 GLushort *dst = (GLushort *) dstAddr;
856 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
860 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
864 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
868 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
872 UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
874 case GL_LUMINANCE_ALPHA:
876 UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
877 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
882 CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
883 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
888 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
889 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
890 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
895 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
896 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
897 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
898 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
903 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
904 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
905 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
910 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
911 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
912 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
913 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
918 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
919 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
920 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
921 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
924 case GL_RED_INTEGER_EXT:
926 dst[i] = (GLushort) rgba[i][RCOMP];
929 case GL_GREEN_INTEGER_EXT:
931 dst[i] = (GLushort) rgba[i][GCOMP];
934 case GL_BLUE_INTEGER_EXT:
936 dst[i] = (GLushort) rgba[i][BCOMP];
939 case GL_ALPHA_INTEGER_EXT:
941 dst[i] = (GLushort) rgba[i][ACOMP];
944 case GL_RGB_INTEGER_EXT:
946 dst[i*3+0] = (GLushort) rgba[i][RCOMP];
947 dst[i*3+1] = (GLushort) rgba[i][GCOMP];
948 dst[i*3+2] = (GLushort) rgba[i][BCOMP];
951 case GL_RGBA_INTEGER_EXT:
953 dst[i*4+0] = (GLushort) rgba[i][RCOMP];
954 dst[i*4+1] = (GLushort) rgba[i][GCOMP];
955 dst[i*4+2] = (GLushort) rgba[i][BCOMP];
956 dst[i*4+3] = (GLushort) rgba[i][ACOMP];
959 case GL_BGR_INTEGER_EXT:
961 dst[i*3+0] = (GLushort) rgba[i][BCOMP];
962 dst[i*3+1] = (GLushort) rgba[i][GCOMP];
963 dst[i*3+2] = (GLushort) rgba[i][RCOMP];
966 case GL_BGRA_INTEGER_EXT:
968 dst[i*4+0] = (GLushort) rgba[i][BCOMP];
969 dst[i*4+1] = (GLushort) rgba[i][GCOMP];
970 dst[i*4+2] = (GLushort) rgba[i][RCOMP];
971 dst[i*4+3] = (GLushort) rgba[i][ACOMP];
974 case GL_LUMINANCE_INTEGER_EXT:
976 dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
979 dst[i*2+1] = (GLushort) rgba[i][ACOMP];
982 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
984 dst[i] = (GLushort) (rgba[i][RCOMP] +
992 dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
993 dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
997 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1003 GLshort *dst = (GLshort *) dstAddr;
1004 switch (dstFormat) {
1007 dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1011 dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1015 dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1019 dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1023 dst[i] = FLOAT_TO_SHORT(luminance[i]);
1025 case GL_LUMINANCE_ALPHA:
1027 dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1028 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1033 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1034 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1039 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1040 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1041 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1046 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1047 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1048 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1049 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1054 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1055 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1056 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1061 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1062 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1063 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1064 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1069 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1070 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1071 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1072 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1075 case GL_RED_INTEGER_EXT:
1077 dst[i] = (GLshort) rgba[i][RCOMP];
1080 case GL_GREEN_INTEGER_EXT:
1082 dst[i] = (GLshort) rgba[i][GCOMP];
1085 case GL_BLUE_INTEGER_EXT:
1087 dst[i] = (GLshort) rgba[i][BCOMP];
1090 case GL_ALPHA_INTEGER_EXT:
1092 dst[i] = (GLshort) rgba[i][ACOMP];
1095 case GL_RGB_INTEGER_EXT:
1097 dst[i*3+0] = (GLshort) rgba[i][RCOMP];
1098 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1099 dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1102 case GL_RGBA_INTEGER_EXT:
1104 dst[i*4+0] = (GLshort) rgba[i][RCOMP];
1105 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1106 dst[i*4+2] = (GLshort) rgba[i][BCOMP];
1107 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1110 case GL_BGR_INTEGER_EXT:
1112 dst[i*3+0] = (GLshort) rgba[i][BCOMP];
1113 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1114 dst[i*3+2] = (GLshort) rgba[i][RCOMP];
1117 case GL_BGRA_INTEGER_EXT:
1119 dst[i*4+0] = (GLshort) rgba[i][BCOMP];
1120 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1121 dst[i*4+2] = (GLshort) rgba[i][RCOMP];
1122 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1125 case GL_LUMINANCE_INTEGER_EXT:
1127 dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
1130 dst[i*2+1] = (GLshort) rgba[i][ACOMP];
1133 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1135 dst[i] = (GLshort) (rgba[i][RCOMP] +
1143 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1144 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1148 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1152 case GL_UNSIGNED_INT:
1154 GLuint *dst = (GLuint *) dstAddr;
1155 switch (dstFormat) {
1158 dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1162 dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1166 dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1170 dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1174 dst[i] = FLOAT_TO_UINT(luminance[i]);
1176 case GL_LUMINANCE_ALPHA:
1178 dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1179 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1184 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1185 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1190 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1191 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1192 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1197 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1198 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1199 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1200 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1205 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1206 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1207 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1212 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1213 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1214 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1215 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1220 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1221 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1222 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1223 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1226 case GL_RED_INTEGER_EXT:
1228 dst[i] = (GLuint) rgba[i][RCOMP];
1231 case GL_GREEN_INTEGER_EXT:
1233 dst[i] = (GLuint) rgba[i][GCOMP];
1236 case GL_BLUE_INTEGER_EXT:
1238 dst[i] = (GLuint) rgba[i][BCOMP];
1241 case GL_ALPHA_INTEGER_EXT:
1243 dst[i] = (GLuint) rgba[i][ACOMP];
1246 case GL_RGB_INTEGER_EXT:
1248 dst[i*3+0] = (GLuint) rgba[i][RCOMP];
1249 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1250 dst[i*3+2] = (GLuint) rgba[i][BCOMP];
1253 case GL_RGBA_INTEGER_EXT:
1255 dst[i*4+0] = (GLuint) rgba[i][RCOMP];
1256 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1257 dst[i*4+2] = (GLuint) rgba[i][BCOMP];
1258 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1261 case GL_BGR_INTEGER_EXT:
1263 dst[i*3+0] = (GLuint) rgba[i][BCOMP];
1264 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1265 dst[i*3+2] = (GLuint) rgba[i][RCOMP];
1268 case GL_BGRA_INTEGER_EXT:
1270 dst[i*4+0] = (GLuint) rgba[i][BCOMP];
1271 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1272 dst[i*4+2] = (GLuint) rgba[i][RCOMP];
1273 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1276 case GL_LUMINANCE_INTEGER_EXT:
1278 dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
1281 dst[i*2+1] = (GLuint) rgba[i][ACOMP];
1284 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1286 dst[i] = (GLuint) (rgba[i][RCOMP] +
1294 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1295 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1299 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1305 GLint *dst = (GLint *) dstAddr;
1306 switch (dstFormat) {
1309 dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1313 dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1317 dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1321 dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1325 dst[i] = FLOAT_TO_INT(luminance[i]);
1327 case GL_LUMINANCE_ALPHA:
1329 dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1330 dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1335 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1336 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1341 dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1342 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1343 dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1348 dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1349 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1350 dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1351 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1356 dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1357 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1358 dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1363 dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1364 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1365 dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1366 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1371 dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1372 dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1373 dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1374 dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1380 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1381 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1384 case GL_RED_INTEGER_EXT:
1386 dst[i] = (GLint) rgba[i][RCOMP];
1389 case GL_GREEN_INTEGER_EXT:
1391 dst[i] = (GLint) rgba[i][GCOMP];
1394 case GL_BLUE_INTEGER_EXT:
1396 dst[i] = (GLint) rgba[i][BCOMP];
1399 case GL_ALPHA_INTEGER_EXT:
1401 dst[i] = (GLint) rgba[i][ACOMP];
1404 case GL_RGB_INTEGER_EXT:
1406 dst[i*3+0] = (GLint) rgba[i][RCOMP];
1407 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1408 dst[i*3+2] = (GLint) rgba[i][BCOMP];
1411 case GL_RGBA_INTEGER_EXT:
1413 dst[i*4+0] = (GLint) rgba[i][RCOMP];
1414 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1415 dst[i*4+2] = (GLint) rgba[i][BCOMP];
1416 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1419 case GL_BGR_INTEGER_EXT:
1421 dst[i*3+0] = (GLint) rgba[i][BCOMP];
1422 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1423 dst[i*3+2] = (GLint) rgba[i][RCOMP];
1426 case GL_BGRA_INTEGER_EXT:
1428 dst[i*4+0] = (GLint) rgba[i][BCOMP];
1429 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1430 dst[i*4+2] = (GLint) rgba[i][RCOMP];
1431 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1434 case GL_LUMINANCE_INTEGER_EXT:
1436 dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
1439 dst[i*2+1] = (GLint) rgba[i][ACOMP];
1442 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1444 dst[i] = (GLint) (rgba[i][RCOMP] +
1450 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1456 GLfloat *dst = (GLfloat *) dstAddr;
1457 switch (dstFormat) {
1460 dst[i] = rgba[i][RCOMP];
1464 dst[i] = rgba[i][GCOMP];
1468 dst[i] = rgba[i][BCOMP];
1472 dst[i] = rgba[i][ACOMP];
1476 dst[i] = luminance[i];
1478 case GL_LUMINANCE_ALPHA:
1480 dst[i*2+0] = luminance[i];
1481 dst[i*2+1] = rgba[i][ACOMP];
1486 dst[i*2+0] = rgba[i][RCOMP];
1487 dst[i*2+1] = rgba[i][GCOMP];
1492 dst[i*3+0] = rgba[i][RCOMP];
1493 dst[i*3+1] = rgba[i][GCOMP];
1494 dst[i*3+2] = rgba[i][BCOMP];
1499 dst[i*4+0] = rgba[i][RCOMP];
1500 dst[i*4+1] = rgba[i][GCOMP];
1501 dst[i*4+2] = rgba[i][BCOMP];
1502 dst[i*4+3] = rgba[i][ACOMP];
1507 dst[i*3+0] = rgba[i][BCOMP];
1508 dst[i*3+1] = rgba[i][GCOMP];
1509 dst[i*3+2] = rgba[i][RCOMP];
1514 dst[i*4+0] = rgba[i][BCOMP];
1515 dst[i*4+1] = rgba[i][GCOMP];
1516 dst[i*4+2] = rgba[i][RCOMP];
1517 dst[i*4+3] = rgba[i][ACOMP];
1522 dst[i*4+0] = rgba[i][ACOMP];
1523 dst[i*4+1] = rgba[i][BCOMP];
1524 dst[i*4+2] = rgba[i][GCOMP];
1525 dst[i*4+3] = rgba[i][RCOMP];
1531 dst[i*2+0] = rgba[i][RCOMP];
1532 dst[i*2+1] = rgba[i][GCOMP];
1536 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1540 case GL_HALF_FLOAT_ARB:
1542 GLhalfARB *dst = (GLhalfARB *) dstAddr;
1543 switch (dstFormat) {
1546 dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
1550 dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
1554 dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
1558 dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
1562 dst[i] = _mesa_float_to_half(luminance[i]);
1564 case GL_LUMINANCE_ALPHA:
1566 dst[i*2+0] = _mesa_float_to_half(luminance[i]);
1567 dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
1572 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1573 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1578 dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1579 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1580 dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1585 dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1586 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1587 dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1588 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1593 dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1594 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1595 dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1600 dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1601 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1602 dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1603 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1608 dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
1609 dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
1610 dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
1611 dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
1617 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1618 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1622 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1626 case GL_UNSIGNED_BYTE_3_3_2:
1627 if (dstFormat == GL_RGB) {
1628 GLubyte *dst = (GLubyte *) dstAddr;
1630 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
1631 | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
1632 | (IROUND(rgba[i][BCOMP] * 3.0F) );
1636 case GL_UNSIGNED_BYTE_2_3_3_REV:
1637 if (dstFormat == GL_RGB) {
1638 GLubyte *dst = (GLubyte *) dstAddr;
1640 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) )
1641 | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
1642 | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
1646 case GL_UNSIGNED_SHORT_5_6_5:
1647 if (dstFormat == GL_RGB) {
1648 GLushort *dst = (GLushort *) dstAddr;
1650 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1651 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1652 | (IROUND(rgba[i][BCOMP] * 31.0F) );
1656 case GL_UNSIGNED_SHORT_5_6_5_REV:
1657 if (dstFormat == GL_RGB) {
1658 GLushort *dst = (GLushort *) dstAddr;
1660 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1661 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1662 | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
1666 case GL_UNSIGNED_SHORT_4_4_4_4:
1667 if (dstFormat == GL_RGBA) {
1668 GLushort *dst = (GLushort *) dstAddr;
1670 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
1671 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1672 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1673 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1676 else if (dstFormat == GL_BGRA) {
1677 GLushort *dst = (GLushort *) dstAddr;
1679 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
1680 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1681 | (IROUND(rgba[i][RCOMP] * 15.0F) << 4)
1682 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1685 else if (dstFormat == GL_ABGR_EXT) {
1686 GLushort *dst = (GLushort *) dstAddr;
1688 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
1689 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1690 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1691 | (IROUND(rgba[i][RCOMP] * 15.0F) );
1695 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1696 if (dstFormat == GL_RGBA) {
1697 GLushort *dst = (GLushort *) dstAddr;
1699 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) )
1700 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1701 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1702 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1705 else if (dstFormat == GL_BGRA) {
1706 GLushort *dst = (GLushort *) dstAddr;
1708 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) )
1709 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1710 | (IROUND(rgba[i][RCOMP] * 15.0F) << 8)
1711 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1714 else if (dstFormat == GL_ABGR_EXT) {
1715 GLushort *dst = (GLushort *) dstAddr;
1717 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) )
1718 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1719 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1720 | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
1724 case GL_UNSIGNED_SHORT_5_5_5_1:
1725 if (dstFormat == GL_RGBA) {
1726 GLushort *dst = (GLushort *) dstAddr;
1728 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1729 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1730 | (IROUND(rgba[i][BCOMP] * 31.0F) << 1)
1731 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1734 else if (dstFormat == GL_BGRA) {
1735 GLushort *dst = (GLushort *) dstAddr;
1737 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
1738 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1739 | (IROUND(rgba[i][RCOMP] * 31.0F) << 1)
1740 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1743 else if (dstFormat == GL_ABGR_EXT) {
1744 GLushort *dst = (GLushort *) dstAddr;
1746 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
1747 | (IROUND(rgba[i][BCOMP] * 31.0F) << 6)
1748 | (IROUND(rgba[i][GCOMP] * 31.0F) << 1)
1749 | (IROUND(rgba[i][RCOMP] * 1.0F) );
1753 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1754 if (dstFormat == GL_RGBA) {
1755 GLushort *dst = (GLushort *) dstAddr;
1757 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1758 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1759 | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
1760 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1763 else if (dstFormat == GL_BGRA) {
1764 GLushort *dst = (GLushort *) dstAddr;
1766 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) )
1767 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1768 | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
1769 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1772 else if (dstFormat == GL_ABGR_EXT) {
1773 GLushort *dst = (GLushort *) dstAddr;
1775 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) )
1776 | (IROUND(rgba[i][BCOMP] * 31.0F) << 5)
1777 | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
1778 | (IROUND(rgba[i][RCOMP] * 1.0F) << 15);
1782 case GL_UNSIGNED_INT_8_8_8_8:
1783 if (dstFormat == GL_RGBA) {
1784 GLuint *dst = (GLuint *) dstAddr;
1786 dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
1787 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1788 | (IROUND(rgba[i][BCOMP] * 255.F) << 8)
1789 | (IROUND(rgba[i][ACOMP] * 255.F) );
1792 else if (dstFormat == GL_BGRA) {
1793 GLuint *dst = (GLuint *) dstAddr;
1795 dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
1796 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1797 | (IROUND(rgba[i][RCOMP] * 255.F) << 8)
1798 | (IROUND(rgba[i][ACOMP] * 255.F) );
1801 else if (dstFormat == GL_ABGR_EXT) {
1802 GLuint *dst = (GLuint *) dstAddr;
1804 dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
1805 | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
1806 | (IROUND(rgba[i][GCOMP] * 255.F) << 8)
1807 | (IROUND(rgba[i][RCOMP] * 255.F) );
1811 case GL_UNSIGNED_INT_8_8_8_8_REV:
1812 if (dstFormat == GL_RGBA) {
1813 GLuint *dst = (GLuint *) dstAddr;
1815 dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F) )
1816 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1817 | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
1818 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1821 else if (dstFormat == GL_BGRA) {
1822 GLuint *dst = (GLuint *) dstAddr;
1824 dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F) )
1825 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1826 | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
1827 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1830 else if (dstFormat == GL_ABGR_EXT) {
1831 GLuint *dst = (GLuint *) dstAddr;
1833 dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F) )
1834 | (IROUND(rgba[i][BCOMP] * 255.0F) << 8)
1835 | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
1836 | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
1840 case GL_UNSIGNED_INT_10_10_10_2:
1841 if (dstFormat == GL_RGBA) {
1842 GLuint *dst = (GLuint *) dstAddr;
1844 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
1845 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1846 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 2)
1847 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1850 else if (dstFormat == GL_BGRA) {
1851 GLuint *dst = (GLuint *) dstAddr;
1853 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
1854 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1855 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 2)
1856 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1859 else if (dstFormat == GL_ABGR_EXT) {
1860 GLuint *dst = (GLuint *) dstAddr;
1862 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
1863 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
1864 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 2)
1865 | (IROUND(rgba[i][RCOMP] * 3.0F) );
1869 case GL_UNSIGNED_INT_2_10_10_10_REV:
1870 if (dstFormat == GL_RGBA) {
1871 GLuint *dst = (GLuint *) dstAddr;
1873 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) )
1874 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1875 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
1876 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1879 else if (dstFormat == GL_BGRA) {
1880 GLuint *dst = (GLuint *) dstAddr;
1882 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) )
1883 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1884 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
1885 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1888 else if (dstFormat == GL_ABGR_EXT) {
1889 GLuint *dst = (GLuint *) dstAddr;
1891 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) )
1892 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
1893 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
1894 | (IROUND(rgba[i][RCOMP] * 3.0F) << 30);
1898 case GL_UNSIGNED_INT_5_9_9_9_REV:
1900 GLuint *dst = (GLuint *) dstAddr;
1901 for (i = 0; i < n; i++) {
1902 dst[i] = float3_to_rgb9e5(rgba[i]);
1906 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1908 GLuint *dst = (GLuint *) dstAddr;
1909 for (i = 0; i < n; i++) {
1910 dst[i] = float3_to_r11g11b10f(rgba[i]);
1915 _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
1919 if (dstPacking->SwapBytes) {
1920 GLint swapSize = _mesa_sizeof_packed_type(dstType);
1921 if (swapSize == 2) {
1922 if (dstPacking->SwapBytes) {
1923 _mesa_swap2((GLushort *) dstAddr, n * comps);
1926 else if (swapSize == 4) {
1927 if (dstPacking->SwapBytes) {
1928 _mesa_swap4((GLuint *) dstAddr, n * comps);
1938 #define SWAP2BYTE(VALUE) \
1940 GLubyte *bytes = (GLubyte *) &(VALUE); \
1941 GLubyte tmp = bytes[0]; \
1942 bytes[0] = bytes[1]; \
1946 #define SWAP4BYTE(VALUE) \
1948 GLubyte *bytes = (GLubyte *) &(VALUE); \
1949 GLubyte tmp = bytes[0]; \
1950 bytes[0] = bytes[3]; \
1953 bytes[1] = bytes[2]; \
1959 extract_uint_indexes(GLuint n, GLuint indexes[],
1960 GLenum srcFormat, GLenum srcType, const GLvoid *src,
1961 const struct gl_pixelstore_attrib *unpack )
1963 ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
1965 ASSERT(srcType == GL_BITMAP ||
1966 srcType == GL_UNSIGNED_BYTE ||
1967 srcType == GL_BYTE ||
1968 srcType == GL_UNSIGNED_SHORT ||
1969 srcType == GL_SHORT ||
1970 srcType == GL_UNSIGNED_INT ||
1971 srcType == GL_INT ||
1972 srcType == GL_UNSIGNED_INT_24_8_EXT ||
1973 srcType == GL_HALF_FLOAT_ARB ||
1974 srcType == GL_FLOAT);
1979 GLubyte *ubsrc = (GLubyte *) src;
1980 if (unpack->LsbFirst) {
1981 GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
1983 for (i = 0; i < n; i++) {
1984 indexes[i] = (*ubsrc & mask) ? 1 : 0;
1995 GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
1997 for (i = 0; i < n; i++) {
1998 indexes[i] = (*ubsrc & mask) ? 1 : 0;
2010 case GL_UNSIGNED_BYTE:
2013 const GLubyte *s = (const GLubyte *) src;
2014 for (i = 0; i < n; i++)
2021 const GLbyte *s = (const GLbyte *) src;
2022 for (i = 0; i < n; i++)
2026 case GL_UNSIGNED_SHORT:
2029 const GLushort *s = (const GLushort *) src;
2030 if (unpack->SwapBytes) {
2031 for (i = 0; i < n; i++) {
2032 GLushort value = s[i];
2038 for (i = 0; i < n; i++)
2046 const GLshort *s = (const GLshort *) src;
2047 if (unpack->SwapBytes) {
2048 for (i = 0; i < n; i++) {
2049 GLshort value = s[i];
2055 for (i = 0; i < n; i++)
2060 case GL_UNSIGNED_INT:
2063 const GLuint *s = (const GLuint *) src;
2064 if (unpack->SwapBytes) {
2065 for (i = 0; i < n; i++) {
2066 GLuint value = s[i];
2072 for (i = 0; i < n; i++)
2080 const GLint *s = (const GLint *) src;
2081 if (unpack->SwapBytes) {
2082 for (i = 0; i < n; i++) {
2089 for (i = 0; i < n; i++)
2097 const GLfloat *s = (const GLfloat *) src;
2098 if (unpack->SwapBytes) {
2099 for (i = 0; i < n; i++) {
2100 GLfloat value = s[i];
2102 indexes[i] = (GLuint) value;
2106 for (i = 0; i < n; i++)
2107 indexes[i] = (GLuint) s[i];
2111 case GL_HALF_FLOAT_ARB:
2114 const GLhalfARB *s = (const GLhalfARB *) src;
2115 if (unpack->SwapBytes) {
2116 for (i = 0; i < n; i++) {
2117 GLhalfARB value = s[i];
2119 indexes[i] = (GLuint) _mesa_half_to_float(value);
2123 for (i = 0; i < n; i++)
2124 indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
2128 case GL_UNSIGNED_INT_24_8_EXT:
2131 const GLuint *s = (const GLuint *) src;
2132 if (unpack->SwapBytes) {
2133 for (i = 0; i < n; i++) {
2134 GLuint value = s[i];
2136 indexes[i] = value & 0xff; /* lower 8 bits */
2140 for (i = 0; i < n; i++)
2141 indexes[i] = s[i] & 0xff; /* lower 8 bits */
2147 _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2154 * Return source/dest RGBA indexes for unpacking pixels.
2157 get_component_mapping(GLenum format,
2169 case GL_RED_INTEGER_EXT:
2171 *gSrc = *bSrc = *aSrc = -1;
2174 case GL_GREEN_INTEGER_EXT:
2176 *rSrc = *bSrc = *aSrc = -1;
2179 case GL_BLUE_INTEGER_EXT:
2181 *rSrc = *gSrc = *aSrc = -1;
2184 case GL_ALPHA_INTEGER_EXT:
2185 *rSrc = *gSrc = *bSrc = -1;
2189 case GL_LUMINANCE_INTEGER_EXT:
2190 *rSrc = *gSrc = *bSrc = 0;
2193 case GL_LUMINANCE_ALPHA:
2194 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2195 *rSrc = *gSrc = *bSrc = 0;
2199 *rSrc = *gSrc = *bSrc = *aSrc = 0;
2213 case GL_RGB_INTEGER:
2234 case GL_RGBA_INTEGER:
2272 _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
2273 _mesa_lookup_enum_by_nr(format));
2281 * This function extracts floating point RGBA values from arbitrary
2282 * image data. srcFormat and srcType are the format and type parameters
2283 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2285 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2286 * implements the "Conversion to floating point", "Conversion to RGB",
2287 * and "Final Expansion to RGBA" operations.
2289 * Args: n - number of pixels
2290 * rgba - output colors
2291 * srcFormat - format of incoming data
2292 * srcType - data type of incoming data
2293 * src - source data pointer
2294 * swapBytes - perform byteswapping of incoming data?
2297 extract_float_rgba(GLuint n, GLfloat rgba[][4],
2298 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2299 GLboolean swapBytes)
2301 GLint rSrc, gSrc, bSrc, aSrc;
2303 GLint rDst, bDst, gDst, aDst;
2304 GLboolean intFormat;
2305 GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
2307 ASSERT(srcFormat == GL_RED ||
2308 srcFormat == GL_GREEN ||
2309 srcFormat == GL_BLUE ||
2310 srcFormat == GL_ALPHA ||
2311 srcFormat == GL_LUMINANCE ||
2312 srcFormat == GL_LUMINANCE_ALPHA ||
2313 srcFormat == GL_INTENSITY ||
2314 srcFormat == GL_RG ||
2315 srcFormat == GL_RGB ||
2316 srcFormat == GL_BGR ||
2317 srcFormat == GL_RGBA ||
2318 srcFormat == GL_BGRA ||
2319 srcFormat == GL_ABGR_EXT ||
2320 srcFormat == GL_DU8DV8_ATI ||
2321 srcFormat == GL_DUDV_ATI ||
2322 srcFormat == GL_RED_INTEGER_EXT ||
2323 srcFormat == GL_GREEN_INTEGER_EXT ||
2324 srcFormat == GL_BLUE_INTEGER_EXT ||
2325 srcFormat == GL_ALPHA_INTEGER_EXT ||
2326 srcFormat == GL_RGB_INTEGER_EXT ||
2327 srcFormat == GL_RGBA_INTEGER_EXT ||
2328 srcFormat == GL_BGR_INTEGER_EXT ||
2329 srcFormat == GL_BGRA_INTEGER_EXT ||
2330 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
2331 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
2333 ASSERT(srcType == GL_UNSIGNED_BYTE ||
2334 srcType == GL_BYTE ||
2335 srcType == GL_UNSIGNED_SHORT ||
2336 srcType == GL_SHORT ||
2337 srcType == GL_UNSIGNED_INT ||
2338 srcType == GL_INT ||
2339 srcType == GL_HALF_FLOAT_ARB ||
2340 srcType == GL_FLOAT ||
2341 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2342 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2343 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2344 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2345 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2346 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2347 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2348 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2349 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2350 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2351 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2352 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
2353 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
2354 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
2356 get_component_mapping(srcFormat,
2357 &rSrc, &gSrc, &bSrc, &aSrc,
2358 &rDst, &gDst, &bDst, &aDst);
2360 stride = _mesa_components_in_format(srcFormat);
2362 intFormat = _mesa_is_integer_format(srcFormat);
2364 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2365 if ((SRC_INDEX) < 0) { \
2368 for (i = 0; i < n; i++) { \
2369 rgba[i][DST_INDEX] = DEFAULT_INT; \
2373 for (i = 0; i < n; i++) { \
2374 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2378 else if (swapBytes) { \
2379 const TYPE *s = (const TYPE *) src; \
2381 for (i = 0; i < n; i++) { \
2382 TYPE value = s[SRC_INDEX]; \
2383 if (sizeof(TYPE) == 2) { \
2386 else if (sizeof(TYPE) == 4) { \
2390 rgba[i][DST_INDEX] = (GLfloat) value; \
2392 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2397 const TYPE *s = (const TYPE *) src; \
2400 for (i = 0; i < n; i++) { \
2401 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2406 for (i = 0; i < n; i++) { \
2407 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2414 case GL_UNSIGNED_BYTE:
2415 PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2416 PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2417 PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2418 PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
2421 PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
2422 PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
2423 PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
2424 PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT);
2426 case GL_UNSIGNED_SHORT:
2427 PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2428 PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2429 PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2430 PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
2433 PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
2434 PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
2435 PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
2436 PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT);
2438 case GL_UNSIGNED_INT:
2439 PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2440 PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2441 PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2442 PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
2445 PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2446 PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2447 PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2448 PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
2451 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2452 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2453 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2454 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
2456 case GL_HALF_FLOAT_ARB:
2457 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2458 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2459 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2460 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
2462 case GL_UNSIGNED_BYTE_3_3_2:
2464 const GLubyte *ubsrc = (const GLubyte *) src;
2471 for (i = 0; i < n; i ++) {
2472 GLubyte p = ubsrc[i];
2473 rgba[i][rDst] = ((p >> 5) ) * rs;
2474 rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
2475 rgba[i][bDst] = ((p ) & 0x3) * bs;
2476 rgba[i][aDst] = 1.0F;
2480 case GL_UNSIGNED_BYTE_2_3_3_REV:
2482 const GLubyte *ubsrc = (const GLubyte *) src;
2489 for (i = 0; i < n; i ++) {
2490 GLubyte p = ubsrc[i];
2491 rgba[i][rDst] = ((p ) & 0x7) * rs;
2492 rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
2493 rgba[i][bDst] = ((p >> 6) ) * bs;
2494 rgba[i][aDst] = 1.0F;
2498 case GL_UNSIGNED_SHORT_5_6_5:
2505 const GLushort *ussrc = (const GLushort *) src;
2507 for (i = 0; i < n; i ++) {
2508 GLushort p = ussrc[i];
2510 rgba[i][rDst] = ((p >> 11) ) * rs;
2511 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2512 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2513 rgba[i][aDst] = 1.0F;
2517 const GLushort *ussrc = (const GLushort *) src;
2519 for (i = 0; i < n; i ++) {
2520 GLushort p = ussrc[i];
2521 rgba[i][rDst] = ((p >> 11) ) * rs;
2522 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2523 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2524 rgba[i][aDst] = 1.0F;
2528 case GL_UNSIGNED_SHORT_5_6_5_REV:
2535 const GLushort *ussrc = (const GLushort *) src;
2537 for (i = 0; i < n; i ++) {
2538 GLushort p = ussrc[i];
2540 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2541 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2542 rgba[i][bDst] = ((p >> 11) ) * bs;
2543 rgba[i][aDst] = 1.0F;
2547 const GLushort *ussrc = (const GLushort *) src;
2549 for (i = 0; i < n; i ++) {
2550 GLushort p = ussrc[i];
2551 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2552 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2553 rgba[i][bDst] = ((p >> 11) ) * bs;
2554 rgba[i][aDst] = 1.0F;
2558 case GL_UNSIGNED_SHORT_4_4_4_4:
2560 rs = gs = bs = as = 1.0F / 15.0F;
2563 const GLushort *ussrc = (const GLushort *) src;
2565 for (i = 0; i < n; i ++) {
2566 GLushort p = ussrc[i];
2568 rgba[i][rDst] = ((p >> 12) ) * rs;
2569 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2570 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2571 rgba[i][aDst] = ((p ) & 0xf) * as;
2575 const GLushort *ussrc = (const GLushort *) src;
2577 for (i = 0; i < n; i ++) {
2578 GLushort p = ussrc[i];
2579 rgba[i][rDst] = ((p >> 12) ) * rs;
2580 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2581 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2582 rgba[i][aDst] = ((p ) & 0xf) * as;
2586 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2588 rs = gs = bs = as = 1.0F / 15.0F;
2591 const GLushort *ussrc = (const GLushort *) src;
2593 for (i = 0; i < n; i ++) {
2594 GLushort p = ussrc[i];
2596 rgba[i][rDst] = ((p ) & 0xf) * rs;
2597 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2598 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2599 rgba[i][aDst] = ((p >> 12) ) * as;
2603 const GLushort *ussrc = (const GLushort *) src;
2605 for (i = 0; i < n; i ++) {
2606 GLushort p = ussrc[i];
2607 rgba[i][rDst] = ((p ) & 0xf) * rs;
2608 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2609 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2610 rgba[i][aDst] = ((p >> 12) ) * as;
2614 case GL_UNSIGNED_SHORT_5_5_5_1:
2616 rs = gs = bs = 1.0F / 31.0F;
2619 const GLushort *ussrc = (const GLushort *) src;
2621 for (i = 0; i < n; i ++) {
2622 GLushort p = ussrc[i];
2624 rgba[i][rDst] = ((p >> 11) ) * rs;
2625 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2626 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2627 rgba[i][aDst] = ((p ) & 0x1) * as;
2631 const GLushort *ussrc = (const GLushort *) src;
2633 for (i = 0; i < n; i ++) {
2634 GLushort p = ussrc[i];
2635 rgba[i][rDst] = ((p >> 11) ) * rs;
2636 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2637 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2638 rgba[i][aDst] = ((p ) & 0x1) * as;
2642 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2644 rs = gs = bs = 1.0F / 31.0F;
2647 const GLushort *ussrc = (const GLushort *) src;
2649 for (i = 0; i < n; i ++) {
2650 GLushort p = ussrc[i];
2652 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2653 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2654 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2655 rgba[i][aDst] = ((p >> 15) ) * as;
2659 const GLushort *ussrc = (const GLushort *) src;
2661 for (i = 0; i < n; i ++) {
2662 GLushort p = ussrc[i];
2663 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2664 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2665 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2666 rgba[i][aDst] = ((p >> 15) ) * as;
2670 case GL_UNSIGNED_INT_8_8_8_8:
2672 const GLuint *uisrc = (const GLuint *) src;
2675 for (i = 0; i < n; i ++) {
2676 GLuint p = uisrc[i];
2677 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2678 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2679 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2680 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2684 for (i = 0; i < n; i ++) {
2685 GLuint p = uisrc[i];
2686 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2687 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2688 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2689 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2694 const GLuint *uisrc = (const GLuint *) src;
2697 for (i = 0; i < n; i ++) {
2698 GLuint p = uisrc[i];
2699 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2700 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2701 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2702 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2706 for (i = 0; i < n; i ++) {
2707 GLuint p = uisrc[i];
2708 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2709 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2710 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2711 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2716 case GL_UNSIGNED_INT_8_8_8_8_REV:
2718 const GLuint *uisrc = (const GLuint *) src;
2721 for (i = 0; i < n; i ++) {
2722 GLuint p = uisrc[i];
2723 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2724 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2725 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2726 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2730 for (i = 0; i < n; i ++) {
2731 GLuint p = uisrc[i];
2732 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2733 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2734 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2735 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2740 const GLuint *uisrc = (const GLuint *) src;
2743 for (i = 0; i < n; i ++) {
2744 GLuint p = uisrc[i];
2745 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2746 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2747 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2748 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2752 for (i = 0; i < n; i ++) {
2753 GLuint p = uisrc[i];
2754 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2755 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2756 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2757 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2762 case GL_UNSIGNED_INT_10_10_10_2:
2764 rs = 1.0F / 1023.0F;
2765 gs = 1.0F / 1023.0F;
2766 bs = 1.0F / 1023.0F;
2770 const GLuint *uisrc = (const GLuint *) src;
2772 for (i = 0; i < n; i ++) {
2773 GLuint p = uisrc[i];
2775 rgba[i][rDst] = ((p >> 22) ) * rs;
2776 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2777 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2778 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2782 const GLuint *uisrc = (const GLuint *) src;
2784 for (i = 0; i < n; i ++) {
2785 GLuint p = uisrc[i];
2786 rgba[i][rDst] = ((p >> 22) ) * rs;
2787 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2788 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2789 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2793 case GL_UNSIGNED_INT_2_10_10_10_REV:
2795 rs = 1.0F / 1023.0F;
2796 gs = 1.0F / 1023.0F;
2797 bs = 1.0F / 1023.0F;
2801 const GLuint *uisrc = (const GLuint *) src;
2803 for (i = 0; i < n; i ++) {
2804 GLuint p = uisrc[i];
2806 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2807 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2808 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2809 rgba[i][aDst] = ((p >> 30) ) * as;
2813 const GLuint *uisrc = (const GLuint *) src;
2815 for (i = 0; i < n; i ++) {
2816 GLuint p = uisrc[i];
2817 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2818 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2819 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2820 rgba[i][aDst] = ((p >> 30) ) * as;
2824 case GL_UNSIGNED_INT_5_9_9_9_REV:
2826 const GLuint *uisrc = (const GLuint *) src;
2829 for (i = 0; i < n; i ++) {
2830 GLuint p = uisrc[i];
2832 rgb9e5_to_float3(p, f);
2833 rgba[i][rDst] = f[0];
2834 rgba[i][gDst] = f[1];
2835 rgba[i][bDst] = f[2];
2836 rgba[i][aDst] = 1.0F;
2840 const GLuint *uisrc = (const GLuint *) src;
2843 for (i = 0; i < n; i ++) {
2844 rgb9e5_to_float3(uisrc[i], f);
2845 rgba[i][rDst] = f[0];
2846 rgba[i][gDst] = f[1];
2847 rgba[i][bDst] = f[2];
2848 rgba[i][aDst] = 1.0F;
2852 case GL_UNSIGNED_INT_10F_11F_11F_REV:
2854 const GLuint *uisrc = (const GLuint *) src;
2857 for (i = 0; i < n; i ++) {
2858 GLuint p = uisrc[i];
2860 r11g11b10f_to_float3(p, f);
2861 rgba[i][rDst] = f[0];
2862 rgba[i][gDst] = f[1];
2863 rgba[i][bDst] = f[2];
2864 rgba[i][aDst] = 1.0F;
2868 const GLuint *uisrc = (const GLuint *) src;
2871 for (i = 0; i < n; i ++) {
2872 r11g11b10f_to_float3(uisrc[i], f);
2873 rgba[i][rDst] = f[0];
2874 rgba[i][gDst] = f[1];
2875 rgba[i][bDst] = f[2];
2876 rgba[i][aDst] = 1.0F;
2881 _mesa_problem(NULL, "bad srcType in extract float data");
2888 static INLINE GLuint
2889 clamp_byte_to_uint(GLbyte b)
2891 return b < 0 ? 0 : b;
2895 static INLINE GLuint
2896 clamp_short_to_uint(GLshort s)
2898 return s < 0 ? 0 : s;
2902 static INLINE GLuint
2903 clamp_int_to_uint(GLint i)
2905 return i < 0 ? 0 : i;
2909 static INLINE GLuint
2910 clamp_float_to_uint(GLfloat f)
2912 return f < 0.0F ? 0 : IROUND(f);
2916 static INLINE GLuint
2917 clamp_half_to_uint(GLhalfARB h)
2919 GLfloat f = _mesa_half_to_float(h);
2920 return f < 0.0F ? 0 : IROUND(f);
2925 * \sa extract_float_rgba()
2928 extract_uint_rgba(GLuint n, GLuint rgba[][4],
2929 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2930 GLboolean swapBytes)
2932 GLint rSrc, gSrc, bSrc, aSrc;
2934 GLint rDst, bDst, gDst, aDst;
2936 ASSERT(srcFormat == GL_RED ||
2937 srcFormat == GL_GREEN ||
2938 srcFormat == GL_BLUE ||
2939 srcFormat == GL_ALPHA ||
2940 srcFormat == GL_LUMINANCE ||
2941 srcFormat == GL_LUMINANCE_ALPHA ||
2942 srcFormat == GL_INTENSITY ||
2943 srcFormat == GL_RG ||
2944 srcFormat == GL_RGB ||
2945 srcFormat == GL_BGR ||
2946 srcFormat == GL_RGBA ||
2947 srcFormat == GL_BGRA ||
2948 srcFormat == GL_ABGR_EXT ||
2949 srcFormat == GL_DU8DV8_ATI ||
2950 srcFormat == GL_DUDV_ATI ||
2951 srcFormat == GL_RED_INTEGER_EXT ||
2952 srcFormat == GL_GREEN_INTEGER_EXT ||
2953 srcFormat == GL_BLUE_INTEGER_EXT ||
2954 srcFormat == GL_ALPHA_INTEGER_EXT ||
2955 srcFormat == GL_RGB_INTEGER_EXT ||
2956 srcFormat == GL_RGBA_INTEGER_EXT ||
2957 srcFormat == GL_BGR_INTEGER_EXT ||
2958 srcFormat == GL_BGRA_INTEGER_EXT ||
2959 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
2960 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
2962 ASSERT(srcType == GL_UNSIGNED_BYTE ||
2963 srcType == GL_BYTE ||
2964 srcType == GL_UNSIGNED_SHORT ||
2965 srcType == GL_SHORT ||
2966 srcType == GL_UNSIGNED_INT ||
2967 srcType == GL_INT ||
2968 srcType == GL_HALF_FLOAT_ARB ||
2969 srcType == GL_FLOAT ||
2970 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2971 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2972 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2973 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2974 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2975 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2976 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2977 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2978 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2979 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2980 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2981 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
2982 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
2983 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
2985 get_component_mapping(srcFormat,
2986 &rSrc, &gSrc, &bSrc, &aSrc,
2987 &rDst, &gDst, &bDst, &aDst);
2989 stride = _mesa_components_in_format(srcFormat);
2991 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2992 if ((SRC_INDEX) < 0) { \
2994 for (i = 0; i < n; i++) { \
2995 rgba[i][DST_INDEX] = DEFAULT; \
2998 else if (swapBytes) { \
2999 const TYPE *s = (const TYPE *) src; \
3001 for (i = 0; i < n; i++) { \
3002 TYPE value = s[SRC_INDEX]; \
3003 if (sizeof(TYPE) == 2) { \
3006 else if (sizeof(TYPE) == 4) { \
3009 rgba[i][DST_INDEX] = CONVERSION(value); \
3014 const TYPE *s = (const TYPE *) src; \
3016 for (i = 0; i < n; i++) { \
3017 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3023 case GL_UNSIGNED_BYTE:
3024 PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
3025 PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
3026 PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
3027 PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
3030 PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint);
3031 PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint);
3032 PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint);
3033 PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint);
3035 case GL_UNSIGNED_SHORT:
3036 PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
3037 PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
3038 PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
3039 PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
3042 PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint);
3043 PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint);
3044 PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint);
3045 PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint);
3047 case GL_UNSIGNED_INT:
3048 PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
3049 PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
3050 PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
3051 PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
3054 PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint);
3055 PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint);
3056 PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint);
3057 PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint);
3060 PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
3061 PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
3062 PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
3063 PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
3065 case GL_HALF_FLOAT_ARB:
3066 PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
3067 PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
3068 PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
3069 PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
3071 case GL_UNSIGNED_BYTE_3_3_2:
3073 const GLubyte *ubsrc = (const GLubyte *) src;
3075 for (i = 0; i < n; i ++) {
3076 GLubyte p = ubsrc[i];
3077 rgba[i][rDst] = ((p >> 5) );
3078 rgba[i][gDst] = ((p >> 2) & 0x7);
3079 rgba[i][bDst] = ((p ) & 0x3);
3084 case GL_UNSIGNED_BYTE_2_3_3_REV:
3086 const GLubyte *ubsrc = (const GLubyte *) src;
3088 for (i = 0; i < n; i ++) {
3089 GLubyte p = ubsrc[i];
3090 rgba[i][rDst] = ((p ) & 0x7);
3091 rgba[i][gDst] = ((p >> 3) & 0x7);
3092 rgba[i][bDst] = ((p >> 6) );
3097 case GL_UNSIGNED_SHORT_5_6_5:
3099 const GLushort *ussrc = (const GLushort *) src;
3101 for (i = 0; i < n; i ++) {
3102 GLushort p = ussrc[i];
3104 rgba[i][rDst] = ((p >> 11) );
3105 rgba[i][gDst] = ((p >> 5) & 0x3f);
3106 rgba[i][bDst] = ((p ) & 0x1f);
3111 const GLushort *ussrc = (const GLushort *) src;
3113 for (i = 0; i < n; i ++) {
3114 GLushort p = ussrc[i];
3115 rgba[i][rDst] = ((p >> 11) );
3116 rgba[i][gDst] = ((p >> 5) & 0x3f);
3117 rgba[i][bDst] = ((p ) & 0x1f);
3122 case GL_UNSIGNED_SHORT_5_6_5_REV:
3124 const GLushort *ussrc = (const GLushort *) src;
3126 for (i = 0; i < n; i ++) {
3127 GLushort p = ussrc[i];
3129 rgba[i][rDst] = ((p ) & 0x1f);
3130 rgba[i][gDst] = ((p >> 5) & 0x3f);
3131 rgba[i][bDst] = ((p >> 11) );
3136 const GLushort *ussrc = (const GLushort *) src;
3138 for (i = 0; i < n; i ++) {
3139 GLushort p = ussrc[i];
3140 rgba[i][rDst] = ((p ) & 0x1f);
3141 rgba[i][gDst] = ((p >> 5) & 0x3f);
3142 rgba[i][bDst] = ((p >> 11) );
3147 case GL_UNSIGNED_SHORT_4_4_4_4:
3149 const GLushort *ussrc = (const GLushort *) src;
3151 for (i = 0; i < n; i ++) {
3152 GLushort p = ussrc[i];
3154 rgba[i][rDst] = ((p >> 12) );
3155 rgba[i][gDst] = ((p >> 8) & 0xf);
3156 rgba[i][bDst] = ((p >> 4) & 0xf);
3157 rgba[i][aDst] = ((p ) & 0xf);
3161 const GLushort *ussrc = (const GLushort *) src;
3163 for (i = 0; i < n; i ++) {
3164 GLushort p = ussrc[i];
3165 rgba[i][rDst] = ((p >> 12) );
3166 rgba[i][gDst] = ((p >> 8) & 0xf);
3167 rgba[i][bDst] = ((p >> 4) & 0xf);
3168 rgba[i][aDst] = ((p ) & 0xf);
3172 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3174 const GLushort *ussrc = (const GLushort *) src;
3176 for (i = 0; i < n; i ++) {
3177 GLushort p = ussrc[i];
3179 rgba[i][rDst] = ((p ) & 0xf);
3180 rgba[i][gDst] = ((p >> 4) & 0xf);
3181 rgba[i][bDst] = ((p >> 8) & 0xf);
3182 rgba[i][aDst] = ((p >> 12) );
3186 const GLushort *ussrc = (const GLushort *) src;
3188 for (i = 0; i < n; i ++) {
3189 GLushort p = ussrc[i];
3190 rgba[i][rDst] = ((p ) & 0xf);
3191 rgba[i][gDst] = ((p >> 4) & 0xf);
3192 rgba[i][bDst] = ((p >> 8) & 0xf);
3193 rgba[i][aDst] = ((p >> 12) );
3197 case GL_UNSIGNED_SHORT_5_5_5_1:
3199 const GLushort *ussrc = (const GLushort *) src;
3201 for (i = 0; i < n; i ++) {
3202 GLushort p = ussrc[i];
3204 rgba[i][rDst] = ((p >> 11) );
3205 rgba[i][gDst] = ((p >> 6) & 0x1f);
3206 rgba[i][bDst] = ((p >> 1) & 0x1f);
3207 rgba[i][aDst] = ((p ) & 0x1 );
3211 const GLushort *ussrc = (const GLushort *) src;
3213 for (i = 0; i < n; i ++) {
3214 GLushort p = ussrc[i];
3215 rgba[i][rDst] = ((p >> 11) );
3216 rgba[i][gDst] = ((p >> 6) & 0x1f);
3217 rgba[i][bDst] = ((p >> 1) & 0x1f);
3218 rgba[i][aDst] = ((p ) & 0x1 );
3222 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3224 const GLushort *ussrc = (const GLushort *) src;
3226 for (i = 0; i < n; i ++) {
3227 GLushort p = ussrc[i];
3229 rgba[i][rDst] = ((p ) & 0x1f);
3230 rgba[i][gDst] = ((p >> 5) & 0x1f);
3231 rgba[i][bDst] = ((p >> 10) & 0x1f);
3232 rgba[i][aDst] = ((p >> 15) );
3236 const GLushort *ussrc = (const GLushort *) src;
3238 for (i = 0; i < n; i ++) {
3239 GLushort p = ussrc[i];
3240 rgba[i][rDst] = ((p ) & 0x1f);
3241 rgba[i][gDst] = ((p >> 5) & 0x1f);
3242 rgba[i][bDst] = ((p >> 10) & 0x1f);
3243 rgba[i][aDst] = ((p >> 15) );
3247 case GL_UNSIGNED_INT_8_8_8_8:
3249 const GLuint *uisrc = (const GLuint *) src;
3251 for (i = 0; i < n; i ++) {
3252 GLuint p = uisrc[i];
3253 rgba[i][rDst] = ((p ) & 0xff);
3254 rgba[i][gDst] = ((p >> 8) & 0xff);
3255 rgba[i][bDst] = ((p >> 16) & 0xff);
3256 rgba[i][aDst] = ((p >> 24) );
3260 const GLuint *uisrc = (const GLuint *) src;
3262 for (i = 0; i < n; i ++) {
3263 GLuint p = uisrc[i];
3264 rgba[i][rDst] = ((p >> 24) );
3265 rgba[i][gDst] = ((p >> 16) & 0xff);
3266 rgba[i][bDst] = ((p >> 8) & 0xff);
3267 rgba[i][aDst] = ((p ) & 0xff);
3271 case GL_UNSIGNED_INT_8_8_8_8_REV:
3273 const GLuint *uisrc = (const GLuint *) src;
3275 for (i = 0; i < n; i ++) {
3276 GLuint p = uisrc[i];
3277 rgba[i][rDst] = ((p >> 24) );
3278 rgba[i][gDst] = ((p >> 16) & 0xff);
3279 rgba[i][bDst] = ((p >> 8) & 0xff);
3280 rgba[i][aDst] = ((p ) & 0xff);
3284 const GLuint *uisrc = (const GLuint *) src;
3286 for (i = 0; i < n; i ++) {
3287 GLuint p = uisrc[i];
3288 rgba[i][rDst] = ((p ) & 0xff);
3289 rgba[i][gDst] = ((p >> 8) & 0xff);
3290 rgba[i][bDst] = ((p >> 16) & 0xff);
3291 rgba[i][aDst] = ((p >> 24) );
3295 case GL_UNSIGNED_INT_10_10_10_2:
3297 const GLuint *uisrc = (const GLuint *) src;
3299 for (i = 0; i < n; i ++) {
3300 GLuint p = uisrc[i];
3302 rgba[i][rDst] = ((p >> 22) );
3303 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3304 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3305 rgba[i][aDst] = ((p ) & 0x3 );
3309 const GLuint *uisrc = (const GLuint *) src;
3311 for (i = 0; i < n; i ++) {
3312 GLuint p = uisrc[i];
3313 rgba[i][rDst] = ((p >> 22) );
3314 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3315 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3316 rgba[i][aDst] = ((p ) & 0x3 );
3320 case GL_UNSIGNED_INT_2_10_10_10_REV:
3322 const GLuint *uisrc = (const GLuint *) src;
3324 for (i = 0; i < n; i ++) {
3325 GLuint p = uisrc[i];
3327 rgba[i][rDst] = ((p ) & 0x3ff);
3328 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3329 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3330 rgba[i][aDst] = ((p >> 30) );
3334 const GLuint *uisrc = (const GLuint *) src;
3336 for (i = 0; i < n; i ++) {
3337 GLuint p = uisrc[i];
3338 rgba[i][rDst] = ((p ) & 0x3ff);
3339 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3340 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3341 rgba[i][aDst] = ((p >> 30) );
3345 case GL_UNSIGNED_INT_5_9_9_9_REV:
3347 const GLuint *uisrc = (const GLuint *) src;
3350 for (i = 0; i < n; i ++) {
3351 GLuint p = uisrc[i];
3353 rgb9e5_to_float3(p, f);
3354 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3355 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3356 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3361 const GLuint *uisrc = (const GLuint *) src;
3364 for (i = 0; i < n; i ++) {
3365 GLuint p = uisrc[i];
3366 rgb9e5_to_float3(p, f);
3367 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3368 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3369 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3374 case GL_UNSIGNED_INT_10F_11F_11F_REV:
3376 const GLuint *uisrc = (const GLuint *) src;
3379 for (i = 0; i < n; i ++) {
3380 GLuint p = uisrc[i];
3382 r11g11b10f_to_float3(p, f);
3383 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3384 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3385 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3390 const GLuint *uisrc = (const GLuint *) src;
3393 for (i = 0; i < n; i ++) {
3394 GLuint p = uisrc[i];
3395 r11g11b10f_to_float3(p, f);
3396 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3397 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3398 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3404 _mesa_problem(NULL, "bad srcType in extract uint data");
3413 * Unpack a row of color image data from a client buffer according to
3414 * the pixel unpacking parameters.
3415 * Return GLchan values in the specified dest image format.
3416 * This is used by glDrawPixels and glTexImage?D().
3417 * \param ctx - the context
3418 * n - number of pixels in the span
3419 * dstFormat - format of destination color array
3420 * dest - the destination color array
3421 * srcFormat - source image format
3422 * srcType - source image data type
3423 * source - source image pointer
3424 * srcPacking - pixel unpacking parameters
3425 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3427 * XXX perhaps expand this to process whole images someday.
3430 _mesa_unpack_color_span_chan( struct gl_context *ctx,
3431 GLuint n, GLenum dstFormat, GLchan dest[],
3432 GLenum srcFormat, GLenum srcType,
3433 const GLvoid *source,
3434 const struct gl_pixelstore_attrib *srcPacking,
3435 GLbitfield transferOps )
3437 ASSERT(dstFormat == GL_ALPHA ||
3438 dstFormat == GL_LUMINANCE ||
3439 dstFormat == GL_LUMINANCE_ALPHA ||
3440 dstFormat == GL_INTENSITY ||
3441 dstFormat == GL_RED ||
3442 dstFormat == GL_RG ||
3443 dstFormat == GL_RGB ||
3444 dstFormat == GL_RGBA ||
3445 dstFormat == GL_COLOR_INDEX);
3447 ASSERT(srcFormat == GL_RED ||
3448 srcFormat == GL_GREEN ||
3449 srcFormat == GL_BLUE ||
3450 srcFormat == GL_ALPHA ||
3451 srcFormat == GL_LUMINANCE ||
3452 srcFormat == GL_LUMINANCE_ALPHA ||
3453 srcFormat == GL_INTENSITY ||
3454 srcFormat == GL_RG ||
3455 srcFormat == GL_RGB ||
3456 srcFormat == GL_BGR ||
3457 srcFormat == GL_RGBA ||
3458 srcFormat == GL_BGRA ||
3459 srcFormat == GL_ABGR_EXT ||
3460 srcFormat == GL_COLOR_INDEX);
3462 ASSERT(srcType == GL_BITMAP ||
3463 srcType == GL_UNSIGNED_BYTE ||
3464 srcType == GL_BYTE ||
3465 srcType == GL_UNSIGNED_SHORT ||
3466 srcType == GL_SHORT ||
3467 srcType == GL_UNSIGNED_INT ||
3468 srcType == GL_INT ||
3469 srcType == GL_HALF_FLOAT_ARB ||
3470 srcType == GL_FLOAT ||
3471 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3472 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3473 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3474 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3475 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3476 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3477 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3478 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3479 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3480 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3481 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3482 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3483 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3484 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3486 /* Try simple cases first */
3487 if (transferOps == 0) {
3488 if (srcType == CHAN_TYPE) {
3489 if (dstFormat == GL_RGBA) {
3490 if (srcFormat == GL_RGBA) {
3491 memcpy( dest, source, n * 4 * sizeof(GLchan) );
3494 else if (srcFormat == GL_RGB) {
3496 const GLchan *src = (const GLchan *) source;
3498 for (i = 0; i < n; i++) {
3509 else if (dstFormat == GL_RGB) {
3510 if (srcFormat == GL_RGB) {
3511 memcpy( dest, source, n * 3 * sizeof(GLchan) );
3514 else if (srcFormat == GL_RGBA) {
3516 const GLchan *src = (const GLchan *) source;
3518 for (i = 0; i < n; i++) {
3528 else if (dstFormat == srcFormat) {
3529 GLint comps = _mesa_components_in_format(srcFormat);
3531 memcpy( dest, source, n * comps * sizeof(GLchan) );
3536 * Common situation, loading 8bit RGBA/RGB source images
3537 * into 16/32 bit destination. (OSMesa16/32)
3539 else if (srcType == GL_UNSIGNED_BYTE) {
3540 if (dstFormat == GL_RGBA) {
3541 if (srcFormat == GL_RGB) {
3543 const GLubyte *src = (const GLubyte *) source;
3545 for (i = 0; i < n; i++) {
3546 dst[0] = UBYTE_TO_CHAN(src[0]);
3547 dst[1] = UBYTE_TO_CHAN(src[1]);
3548 dst[2] = UBYTE_TO_CHAN(src[2]);
3555 else if (srcFormat == GL_RGBA) {
3557 const GLubyte *src = (const GLubyte *) source;
3559 for (i = 0; i < n; i++) {
3560 dst[0] = UBYTE_TO_CHAN(src[0]);
3561 dst[1] = UBYTE_TO_CHAN(src[1]);
3562 dst[2] = UBYTE_TO_CHAN(src[2]);
3563 dst[3] = UBYTE_TO_CHAN(src[3]);
3570 else if (dstFormat == GL_RGB) {
3571 if (srcFormat == GL_RGB) {
3573 const GLubyte *src = (const GLubyte *) source;
3575 for (i = 0; i < n; i++) {
3576 dst[0] = UBYTE_TO_CHAN(src[0]);
3577 dst[1] = UBYTE_TO_CHAN(src[1]);
3578 dst[2] = UBYTE_TO_CHAN(src[2]);
3584 else if (srcFormat == GL_RGBA) {
3586 const GLubyte *src = (const GLubyte *) source;
3588 for (i = 0; i < n; i++) {
3589 dst[0] = UBYTE_TO_CHAN(src[0]);
3590 dst[1] = UBYTE_TO_CHAN(src[1]);
3591 dst[2] = UBYTE_TO_CHAN(src[2]);
3602 /* general solution begins here */
3604 GLint dstComponents;
3605 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3606 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3609 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3613 dstComponents = _mesa_components_in_format( dstFormat );
3614 /* source & dest image formats should have been error checked by now */
3615 assert(dstComponents > 0);
3618 * Extract image data and convert to RGBA floats
3620 if (srcFormat == GL_COLOR_INDEX) {
3621 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3624 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3628 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3631 if (dstFormat == GL_COLOR_INDEX) {
3633 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
3634 /* convert to GLchan and return */
3635 for (i = 0; i < n; i++) {
3636 dest[i] = (GLchan) (indexes[i] & 0xff);
3643 /* Convert indexes to RGBA */
3644 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3645 _mesa_shift_and_offset_ci(ctx, n, indexes);
3647 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3650 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3651 * with color indexes.
3653 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3658 /* non-color index data */
3659 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3660 srcPacking->SwapBytes);
3663 /* Need to clamp if returning GLubytes or GLushorts */
3664 #if CHAN_TYPE != GL_FLOAT
3665 transferOps |= IMAGE_CLAMP_BIT;
3669 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3672 get_component_indexes(dstFormat,
3673 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3675 /* Now return the GLchan data in the requested dstFormat */
3679 for (i = 0; i < n; i++) {
3680 CLAMPED_FLOAT_TO_CHAN(dst[rDst], rgba[i][RCOMP]);
3681 dst += dstComponents;
3688 for (i = 0; i < n; i++) {
3689 CLAMPED_FLOAT_TO_CHAN(dst[gDst], rgba[i][GCOMP]);
3690 dst += dstComponents;
3697 for (i = 0; i < n; i++) {
3698 CLAMPED_FLOAT_TO_CHAN(dst[bDst], rgba[i][BCOMP]);
3699 dst += dstComponents;
3706 for (i = 0; i < n; i++) {
3707 CLAMPED_FLOAT_TO_CHAN(dst[aDst], rgba[i][ACOMP]);
3708 dst += dstComponents;
3716 assert(dstComponents == 1);
3717 for (i = 0; i < n; i++) {
3718 /* Intensity comes from red channel */
3719 CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
3727 for (i = 0; i < n; i++) {
3728 /* Luminance comes from red channel */
3729 CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
3730 dst += dstComponents;
3740 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3741 * instead of GLchan.
3744 _mesa_unpack_color_span_float( struct gl_context *ctx,
3745 GLuint n, GLenum dstFormat, GLfloat dest[],
3746 GLenum srcFormat, GLenum srcType,
3747 const GLvoid *source,
3748 const struct gl_pixelstore_attrib *srcPacking,
3749 GLbitfield transferOps )
3751 ASSERT(dstFormat == GL_ALPHA ||
3752 dstFormat == GL_LUMINANCE ||
3753 dstFormat == GL_LUMINANCE_ALPHA ||
3754 dstFormat == GL_INTENSITY ||
3755 dstFormat == GL_RED ||
3756 dstFormat == GL_RG ||
3757 dstFormat == GL_RGB ||
3758 dstFormat == GL_RGBA ||
3759 dstFormat == GL_COLOR_INDEX);
3761 ASSERT(srcFormat == GL_RED ||
3762 srcFormat == GL_GREEN ||
3763 srcFormat == GL_BLUE ||
3764 srcFormat == GL_ALPHA ||
3765 srcFormat == GL_LUMINANCE ||
3766 srcFormat == GL_LUMINANCE_ALPHA ||
3767 srcFormat == GL_INTENSITY ||
3768 srcFormat == GL_RG ||
3769 srcFormat == GL_RGB ||
3770 srcFormat == GL_BGR ||
3771 srcFormat == GL_RGBA ||
3772 srcFormat == GL_BGRA ||
3773 srcFormat == GL_ABGR_EXT ||
3774 srcFormat == GL_RED_INTEGER_EXT ||
3775 srcFormat == GL_GREEN_INTEGER_EXT ||
3776 srcFormat == GL_BLUE_INTEGER_EXT ||
3777 srcFormat == GL_ALPHA_INTEGER_EXT ||
3778 srcFormat == GL_RGB_INTEGER_EXT ||
3779 srcFormat == GL_RGBA_INTEGER_EXT ||
3780 srcFormat == GL_BGR_INTEGER_EXT ||
3781 srcFormat == GL_BGRA_INTEGER_EXT ||
3782 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3783 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
3784 srcFormat == GL_COLOR_INDEX);
3786 ASSERT(srcType == GL_BITMAP ||
3787 srcType == GL_UNSIGNED_BYTE ||
3788 srcType == GL_BYTE ||
3789 srcType == GL_UNSIGNED_SHORT ||
3790 srcType == GL_SHORT ||
3791 srcType == GL_UNSIGNED_INT ||
3792 srcType == GL_INT ||
3793 srcType == GL_HALF_FLOAT_ARB ||
3794 srcType == GL_FLOAT ||
3795 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3796 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3797 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3798 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3799 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3800 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3801 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3802 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3803 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3804 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3805 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3806 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3807 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3808 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3810 /* general solution, no special cases, yet */
3812 GLint dstComponents;
3813 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3814 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3817 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3821 dstComponents = _mesa_components_in_format( dstFormat );
3822 /* source & dest image formats should have been error checked by now */
3823 assert(dstComponents > 0);
3826 * Extract image data and convert to RGBA floats
3828 if (srcFormat == GL_COLOR_INDEX) {
3829 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3832 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3837 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3840 if (dstFormat == GL_COLOR_INDEX) {
3842 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
3843 /* convert to GLchan and return */
3844 for (i = 0; i < n; i++) {
3845 dest[i] = (GLchan) (indexes[i] & 0xff);
3852 /* Convert indexes to RGBA */
3853 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3854 _mesa_shift_and_offset_ci(ctx, n, indexes);
3856 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3859 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3860 * with color indexes.
3862 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3867 /* non-color index data */
3868 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3869 srcPacking->SwapBytes);
3873 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3876 get_component_indexes(dstFormat,
3877 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3879 /* Now pack results in the requested dstFormat */
3881 GLfloat *dst = dest;
3883 for (i = 0; i < n; i++) {
3884 dst[rDst] = rgba[i][RCOMP];
3885 dst += dstComponents;
3890 GLfloat *dst = dest;
3892 for (i = 0; i < n; i++) {
3893 dst[gDst] = rgba[i][GCOMP];
3894 dst += dstComponents;
3899 GLfloat *dst = dest;
3901 for (i = 0; i < n; i++) {
3902 dst[bDst] = rgba[i][BCOMP];
3903 dst += dstComponents;
3908 GLfloat *dst = dest;
3910 for (i = 0; i < n; i++) {
3911 dst[aDst] = rgba[i][ACOMP];
3912 dst += dstComponents;
3917 GLfloat *dst = dest;
3920 assert(dstComponents == 1);
3921 for (i = 0; i < n; i++) {
3922 /* Intensity comes from red channel */
3923 dst[i] = rgba[i][RCOMP];
3928 GLfloat *dst = dest;
3931 for (i = 0; i < n; i++) {
3932 /* Luminance comes from red channel */
3933 dst[0] = rgba[i][RCOMP];
3934 dst += dstComponents;
3944 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3945 * instead of GLchan.
3946 * No pixel transfer ops are applied.
3949 _mesa_unpack_color_span_uint(struct gl_context *ctx,
3950 GLuint n, GLenum dstFormat, GLuint *dest,
3951 GLenum srcFormat, GLenum srcType,
3952 const GLvoid *source,
3953 const struct gl_pixelstore_attrib *srcPacking)
3955 GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
3958 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3962 ASSERT(dstFormat == GL_ALPHA ||
3963 dstFormat == GL_LUMINANCE ||
3964 dstFormat == GL_LUMINANCE_ALPHA ||
3965 dstFormat == GL_INTENSITY ||
3966 dstFormat == GL_RED ||
3967 dstFormat == GL_RG ||
3968 dstFormat == GL_RGB ||
3969 dstFormat == GL_RGBA);
3971 ASSERT(srcFormat == GL_RED ||
3972 srcFormat == GL_GREEN ||
3973 srcFormat == GL_BLUE ||
3974 srcFormat == GL_ALPHA ||
3975 srcFormat == GL_LUMINANCE ||
3976 srcFormat == GL_LUMINANCE_ALPHA ||
3977 srcFormat == GL_INTENSITY ||
3978 srcFormat == GL_RG ||
3979 srcFormat == GL_RGB ||
3980 srcFormat == GL_BGR ||
3981 srcFormat == GL_RGBA ||
3982 srcFormat == GL_BGRA ||
3983 srcFormat == GL_ABGR_EXT ||
3984 srcFormat == GL_RED_INTEGER_EXT ||
3985 srcFormat == GL_GREEN_INTEGER_EXT ||
3986 srcFormat == GL_BLUE_INTEGER_EXT ||
3987 srcFormat == GL_ALPHA_INTEGER_EXT ||
3988 srcFormat == GL_RGB_INTEGER_EXT ||
3989 srcFormat == GL_RGBA_INTEGER_EXT ||
3990 srcFormat == GL_BGR_INTEGER_EXT ||
3991 srcFormat == GL_BGRA_INTEGER_EXT ||
3992 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3993 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
3995 ASSERT(srcType == GL_UNSIGNED_BYTE ||
3996 srcType == GL_BYTE ||
3997 srcType == GL_UNSIGNED_SHORT ||
3998 srcType == GL_SHORT ||
3999 srcType == GL_UNSIGNED_INT ||
4000 srcType == GL_INT ||
4001 srcType == GL_HALF_FLOAT_ARB ||
4002 srcType == GL_FLOAT ||
4003 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4004 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4005 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4006 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4007 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4008 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4009 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4010 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4011 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4012 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4013 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4014 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4015 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4016 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4019 /* Extract image data as uint[4] pixels */
4020 extract_uint_rgba(n, rgba, srcFormat, srcType, source,
4021 srcPacking->SwapBytes);
4023 if (dstFormat == GL_RGBA) {
4025 memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
4029 GLint rDst, gDst, bDst, aDst, lDst, iDst;
4030 GLint dstComponents = _mesa_components_in_format( dstFormat );
4032 assert(dstComponents > 0);
4034 get_component_indexes(dstFormat,
4035 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4037 /* Now pack values in the requested dest format */
4041 for (i = 0; i < n; i++) {
4042 dst[rDst] = rgba[i][RCOMP];
4043 dst += dstComponents;
4050 for (i = 0; i < n; i++) {
4051 dst[gDst] = rgba[i][GCOMP];
4052 dst += dstComponents;
4059 for (i = 0; i < n; i++) {
4060 dst[bDst] = rgba[i][BCOMP];
4061 dst += dstComponents;
4068 for (i = 0; i < n; i++) {
4069 dst[aDst] = rgba[i][ACOMP];
4070 dst += dstComponents;
4078 assert(dstComponents == 1);
4079 for (i = 0; i < n; i++) {
4080 /* Intensity comes from red channel */
4081 dst[i] = rgba[i][RCOMP];
4089 for (i = 0; i < n; i++) {
4090 /* Luminance comes from red channel */
4091 dst[0] = rgba[i][RCOMP];
4092 dst += dstComponents;
4103 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4104 * directly return GLbyte data, no transfer ops apply.
4107 _mesa_unpack_dudv_span_byte( struct gl_context *ctx,
4108 GLuint n, GLenum dstFormat, GLbyte dest[],
4109 GLenum srcFormat, GLenum srcType,
4110 const GLvoid *source,
4111 const struct gl_pixelstore_attrib *srcPacking,
4112 GLbitfield transferOps )
4114 ASSERT(dstFormat == GL_DUDV_ATI);
4115 ASSERT(srcFormat == GL_DUDV_ATI ||
4116 srcFormat == GL_DU8DV8_ATI);
4118 ASSERT(srcType == GL_UNSIGNED_BYTE ||
4119 srcType == GL_BYTE ||
4120 srcType == GL_UNSIGNED_SHORT ||
4121 srcType == GL_SHORT ||
4122 srcType == GL_UNSIGNED_INT ||
4123 srcType == GL_INT ||
4124 srcType == GL_HALF_FLOAT_ARB ||
4125 srcType == GL_FLOAT);
4127 /* general solution */
4129 GLint dstComponents;
4132 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
4135 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4139 dstComponents = _mesa_components_in_format( dstFormat );
4140 /* source & dest image formats should have been error checked by now */
4141 assert(dstComponents > 0);
4144 * Extract image data and convert to RGBA floats
4146 extract_float_rgba(n, rgba, srcFormat, srcType, source,
4147 srcPacking->SwapBytes);
4150 /* Now determine which color channels we need to produce.
4151 * And determine the dest index (offset) within each color tuple.
4154 /* Now pack results in the requested dstFormat */
4155 for (i = 0; i < n; i++) {
4156 /* not sure - need clamp[-1,1] here? */
4157 dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
4158 dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
4159 dst += dstComponents;
4167 * Unpack a row of color index data from a client buffer according to
4168 * the pixel unpacking parameters.
4169 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4171 * Args: ctx - the context
4172 * n - number of pixels
4173 * dstType - destination data type
4174 * dest - destination array
4175 * srcType - source pixel type
4176 * source - source data pointer
4177 * srcPacking - pixel unpacking parameters
4178 * transferOps - the pixel transfer operations to apply
4181 _mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
4182 GLenum dstType, GLvoid *dest,
4183 GLenum srcType, const GLvoid *source,
4184 const struct gl_pixelstore_attrib *srcPacking,
4185 GLbitfield transferOps )
4187 ASSERT(srcType == GL_BITMAP ||
4188 srcType == GL_UNSIGNED_BYTE ||
4189 srcType == GL_BYTE ||
4190 srcType == GL_UNSIGNED_SHORT ||
4191 srcType == GL_SHORT ||
4192 srcType == GL_UNSIGNED_INT ||
4193 srcType == GL_INT ||
4194 srcType == GL_HALF_FLOAT_ARB ||
4195 srcType == GL_FLOAT);
4197 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4198 dstType == GL_UNSIGNED_SHORT ||
4199 dstType == GL_UNSIGNED_INT);
4202 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4205 * Try simple cases first
4207 if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
4208 && dstType == GL_UNSIGNED_BYTE) {
4209 memcpy(dest, source, n * sizeof(GLubyte));
4211 else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
4212 && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
4213 memcpy(dest, source, n * sizeof(GLuint));
4219 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4222 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4226 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
4230 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4232 /* convert to dest type */
4234 case GL_UNSIGNED_BYTE:
4236 GLubyte *dst = (GLubyte *) dest;
4238 for (i = 0; i < n; i++) {
4239 dst[i] = (GLubyte) (indexes[i] & 0xff);
4243 case GL_UNSIGNED_SHORT:
4245 GLuint *dst = (GLuint *) dest;
4247 for (i = 0; i < n; i++) {
4248 dst[i] = (GLushort) (indexes[i] & 0xffff);
4252 case GL_UNSIGNED_INT:
4253 memcpy(dest, indexes, n * sizeof(GLuint));
4256 _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
4265 _mesa_pack_index_span( struct gl_context *ctx, GLuint n,
4266 GLenum dstType, GLvoid *dest, const GLuint *source,
4267 const struct gl_pixelstore_attrib *dstPacking,
4268 GLbitfield transferOps )
4270 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4273 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4277 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4279 if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
4280 /* make a copy of input */
4281 memcpy(indexes, source, n * sizeof(GLuint));
4282 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4287 case GL_UNSIGNED_BYTE:
4289 GLubyte *dst = (GLubyte *) dest;
4291 for (i = 0; i < n; i++) {
4292 *dst++ = (GLubyte) source[i];
4298 GLbyte *dst = (GLbyte *) dest;
4300 for (i = 0; i < n; i++) {
4301 dst[i] = (GLbyte) source[i];
4305 case GL_UNSIGNED_SHORT:
4307 GLushort *dst = (GLushort *) dest;
4309 for (i = 0; i < n; i++) {
4310 dst[i] = (GLushort) source[i];
4312 if (dstPacking->SwapBytes) {
4313 _mesa_swap2( (GLushort *) dst, n );
4319 GLshort *dst = (GLshort *) dest;
4321 for (i = 0; i < n; i++) {
4322 dst[i] = (GLshort) source[i];
4324 if (dstPacking->SwapBytes) {
4325 _mesa_swap2( (GLushort *) dst, n );
4329 case GL_UNSIGNED_INT:
4331 GLuint *dst = (GLuint *) dest;
4333 for (i = 0; i < n; i++) {
4334 dst[i] = (GLuint) source[i];
4336 if (dstPacking->SwapBytes) {
4337 _mesa_swap4( (GLuint *) dst, n );
4343 GLint *dst = (GLint *) dest;
4345 for (i = 0; i < n; i++) {
4346 dst[i] = (GLint) source[i];
4348 if (dstPacking->SwapBytes) {
4349 _mesa_swap4( (GLuint *) dst, n );
4355 GLfloat *dst = (GLfloat *) dest;
4357 for (i = 0; i < n; i++) {
4358 dst[i] = (GLfloat) source[i];
4360 if (dstPacking->SwapBytes) {
4361 _mesa_swap4( (GLuint *) dst, n );
4365 case GL_HALF_FLOAT_ARB:
4367 GLhalfARB *dst = (GLhalfARB *) dest;
4369 for (i = 0; i < n; i++) {
4370 dst[i] = _mesa_float_to_half((GLfloat) source[i]);
4372 if (dstPacking->SwapBytes) {
4373 _mesa_swap2( (GLushort *) dst, n );
4378 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4386 * Unpack a row of stencil data from a client buffer according to
4387 * the pixel unpacking parameters.
4388 * This is (or will be) used by glDrawPixels
4390 * Args: ctx - the context
4391 * n - number of pixels
4392 * dstType - destination data type
4393 * dest - destination array
4394 * srcType - source pixel type
4395 * source - source data pointer
4396 * srcPacking - pixel unpacking parameters
4397 * transferOps - apply offset/bias/lookup ops?
4400 _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
4401 GLenum dstType, GLvoid *dest,
4402 GLenum srcType, const GLvoid *source,
4403 const struct gl_pixelstore_attrib *srcPacking,
4404 GLbitfield transferOps )
4406 ASSERT(srcType == GL_BITMAP ||
4407 srcType == GL_UNSIGNED_BYTE ||
4408 srcType == GL_BYTE ||
4409 srcType == GL_UNSIGNED_SHORT ||
4410 srcType == GL_SHORT ||
4411 srcType == GL_UNSIGNED_INT ||
4412 srcType == GL_INT ||
4413 srcType == GL_UNSIGNED_INT_24_8_EXT ||
4414 srcType == GL_HALF_FLOAT_ARB ||
4415 srcType == GL_FLOAT);
4417 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4418 dstType == GL_UNSIGNED_SHORT ||
4419 dstType == GL_UNSIGNED_INT);
4421 /* only shift and offset apply to stencil */
4422 transferOps &= IMAGE_SHIFT_OFFSET_BIT;
4425 * Try simple cases first
4427 if (transferOps == 0 &&
4428 !ctx->Pixel.MapStencilFlag &&
4429 srcType == GL_UNSIGNED_BYTE &&
4430 dstType == GL_UNSIGNED_BYTE) {
4431 memcpy(dest, source, n * sizeof(GLubyte));
4433 else if (transferOps == 0 &&
4434 !ctx->Pixel.MapStencilFlag &&
4435 srcType == GL_UNSIGNED_INT &&
4436 dstType == GL_UNSIGNED_INT &&
4437 !srcPacking->SwapBytes) {
4438 memcpy(dest, source, n * sizeof(GLuint));
4444 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4447 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
4451 extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
4454 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4455 /* shift and offset indexes */
4456 _mesa_shift_and_offset_ci(ctx, n, indexes);
4459 if (ctx->Pixel.MapStencilFlag) {
4460 /* Apply stencil lookup table */
4461 const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
4463 for (i = 0; i < n; i++) {
4464 indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
4468 /* convert to dest type */
4470 case GL_UNSIGNED_BYTE:
4472 GLubyte *dst = (GLubyte *) dest;
4474 for (i = 0; i < n; i++) {
4475 dst[i] = (GLubyte) (indexes[i] & 0xff);
4479 case GL_UNSIGNED_SHORT:
4481 GLuint *dst = (GLuint *) dest;
4483 for (i = 0; i < n; i++) {
4484 dst[i] = (GLushort) (indexes[i] & 0xffff);
4488 case GL_UNSIGNED_INT:
4489 memcpy(dest, indexes, n * sizeof(GLuint));
4492 _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
4501 _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
4502 GLenum dstType, GLvoid *dest, const GLstencil *source,
4503 const struct gl_pixelstore_attrib *dstPacking )
4505 GLstencil *stencil = (GLstencil *) malloc(n * sizeof(GLstencil));
4508 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
4512 if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
4513 ctx->Pixel.MapStencilFlag) {
4514 /* make a copy of input */
4515 memcpy(stencil, source, n * sizeof(GLstencil));
4516 _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
4521 case GL_UNSIGNED_BYTE:
4522 if (sizeof(GLstencil) == 1) {
4523 memcpy( dest, source, n );
4526 GLubyte *dst = (GLubyte *) dest;
4529 dst[i] = (GLubyte) source[i];
4535 GLbyte *dst = (GLbyte *) dest;
4538 dst[i] = (GLbyte) (source[i] & 0x7f);
4542 case GL_UNSIGNED_SHORT:
4544 GLushort *dst = (GLushort *) dest;
4547 dst[i] = (GLushort) source[i];
4549 if (dstPacking->SwapBytes) {
4550 _mesa_swap2( (GLushort *) dst, n );
4556 GLshort *dst = (GLshort *) dest;
4559 dst[i] = (GLshort) source[i];
4561 if (dstPacking->SwapBytes) {
4562 _mesa_swap2( (GLushort *) dst, n );
4566 case GL_UNSIGNED_INT:
4568 GLuint *dst = (GLuint *) dest;
4571 dst[i] = (GLuint) source[i];
4573 if (dstPacking->SwapBytes) {
4574 _mesa_swap4( (GLuint *) dst, n );
4580 GLint *dst = (GLint *) dest;
4583 dst[i] = (GLint) source[i];
4585 if (dstPacking->SwapBytes) {
4586 _mesa_swap4( (GLuint *) dst, n );
4592 GLfloat *dst = (GLfloat *) dest;
4595 dst[i] = (GLfloat) source[i];
4597 if (dstPacking->SwapBytes) {
4598 _mesa_swap4( (GLuint *) dst, n );
4602 case GL_HALF_FLOAT_ARB:
4604 GLhalfARB *dst = (GLhalfARB *) dest;
4607 dst[i] = _mesa_float_to_half( (float) source[i] );
4609 if (dstPacking->SwapBytes) {
4610 _mesa_swap2( (GLushort *) dst, n );
4615 if (dstPacking->LsbFirst) {
4616 GLubyte *dst = (GLubyte *) dest;
4619 for (i = 0; i < n; i++) {
4622 *dst |= ((source[i] != 0) << shift);
4631 GLubyte *dst = (GLubyte *) dest;
4634 for (i = 0; i < n; i++) {
4637 *dst |= ((source[i] != 0) << shift);
4647 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4653 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4656 const GLTYPE *src = (const GLTYPE *)source; \
4657 for (i = 0; i < n; i++) { \
4658 GLTYPE value = src[i]; \
4659 if (srcPacking->SwapBytes) { \
4660 if (sizeof(GLTYPE) == 2) { \
4662 } else if (sizeof(GLTYPE) == 4) { \
4666 depthValues[i] = GLTYPE2FLOAT(value); \
4672 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4673 * or GLfloat values.
4674 * The glPixelTransfer (scale/bias) params will be applied.
4676 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4677 * \param depthMax max value for returned GLushort or GLuint values
4678 * (ignored for GLfloat).
4681 _mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
4682 GLenum dstType, GLvoid *dest, GLuint depthMax,
4683 GLenum srcType, const GLvoid *source,
4684 const struct gl_pixelstore_attrib *srcPacking )
4686 GLfloat *depthTemp = NULL, *depthValues;
4687 GLboolean needClamp = GL_FALSE;
4689 /* Look for special cases first.
4690 * Not only are these faster, they're less prone to numeric conversion
4691 * problems. Otherwise, converting from an int type to a float then
4692 * back to an int type can introduce errors that will show up as
4693 * artifacts in things like depth peeling which uses glCopyTexImage.
4695 if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
4696 if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
4697 const GLuint *src = (const GLuint *) source;
4698 GLushort *dst = (GLushort *) dest;
4700 for (i = 0; i < n; i++) {
4701 dst[i] = src[i] >> 16;
4705 if (srcType == GL_UNSIGNED_SHORT
4706 && dstType == GL_UNSIGNED_INT
4707 && depthMax == 0xffffffff) {
4708 const GLushort *src = (const GLushort *) source;
4709 GLuint *dst = (GLuint *) dest;
4711 for (i = 0; i < n; i++) {
4712 dst[i] = src[i] | (src[i] << 16);
4716 if (srcType == GL_UNSIGNED_INT_24_8
4717 && dstType == GL_UNSIGNED_INT
4718 && depthMax == 0xffffff) {
4719 const GLuint *src = (const GLuint *) source;
4720 GLuint *dst = (GLuint *) dest;
4722 for (i = 0; i < n; i++) {
4723 dst[i] = src[i] >> 8;
4727 /* XXX may want to add additional cases here someday */
4730 /* general case path follows */
4732 if (dstType == GL_FLOAT) {
4733 depthValues = (GLfloat *) dest;
4736 depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
4738 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4742 depthValues = depthTemp;
4745 /* Convert incoming values to GLfloat. Some conversions will require
4750 DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT);
4751 needClamp = GL_TRUE;
4753 case GL_UNSIGNED_BYTE:
4754 DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
4757 DEPTH_VALUES(GLshort, SHORT_TO_FLOAT);
4758 needClamp = GL_TRUE;
4760 case GL_UNSIGNED_SHORT:
4761 DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
4764 DEPTH_VALUES(GLint, INT_TO_FLOAT);
4765 needClamp = GL_TRUE;
4767 case GL_UNSIGNED_INT:
4768 DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
4770 case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
4771 if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
4772 depthMax == 0xffffff &&
4773 ctx->Pixel.DepthScale == 1.0 &&
4774 ctx->Pixel.DepthBias == 0.0) {
4775 const GLuint *src = (const GLuint *) source;
4776 GLuint *zValues = (GLuint *) dest;
4778 for (i = 0; i < n; i++) {
4779 GLuint value = src[i];
4780 if (srcPacking->SwapBytes) {
4783 zValues[i] = value & 0xffffff00;
4789 const GLuint *src = (const GLuint *) source;
4790 const GLfloat scale = 1.0f / 0xffffff;
4792 for (i = 0; i < n; i++) {
4793 GLuint value = src[i];
4794 if (srcPacking->SwapBytes) {
4797 depthValues[i] = (value >> 8) * scale;
4802 DEPTH_VALUES(GLfloat, 1*);
4803 needClamp = GL_TRUE;
4805 case GL_HALF_FLOAT_ARB:
4808 const GLhalfARB *src = (const GLhalfARB *) source;
4809 for (i = 0; i < n; i++) {
4810 GLhalfARB value = src[i];
4811 if (srcPacking->SwapBytes) {
4814 depthValues[i] = _mesa_half_to_float(value);
4816 needClamp = GL_TRUE;
4820 _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
4825 /* apply depth scale and bias */
4827 const GLfloat scale = ctx->Pixel.DepthScale;
4828 const GLfloat bias = ctx->Pixel.DepthBias;
4829 if (scale != 1.0 || bias != 0.0) {
4831 for (i = 0; i < n; i++) {
4832 depthValues[i] = depthValues[i] * scale + bias;
4834 needClamp = GL_TRUE;
4838 /* clamp to [0, 1] */
4841 for (i = 0; i < n; i++) {
4842 depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
4847 * Convert values to dstType
4849 if (dstType == GL_UNSIGNED_INT) {
4850 GLuint *zValues = (GLuint *) dest;
4852 if (depthMax <= 0xffffff) {
4853 /* no overflow worries */
4854 for (i = 0; i < n; i++) {
4855 zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
4859 /* need to use double precision to prevent overflow problems */
4860 for (i = 0; i < n; i++) {
4861 GLdouble z = depthValues[i] * (GLfloat) depthMax;
4862 if (z >= (GLdouble) 0xffffffff)
4863 zValues[i] = 0xffffffff;
4865 zValues[i] = (GLuint) z;
4869 else if (dstType == GL_UNSIGNED_SHORT) {
4870 GLushort *zValues = (GLushort *) dest;
4872 ASSERT(depthMax <= 0xffff);
4873 for (i = 0; i < n; i++) {
4874 zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
4878 ASSERT(dstType == GL_FLOAT);
4879 /*ASSERT(depthMax == 1.0F);*/
4887 * Pack an array of depth values. The values are floats in [0,1].
4890 _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
4891 GLenum dstType, const GLfloat *depthSpan,
4892 const struct gl_pixelstore_attrib *dstPacking )
4894 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
4896 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4900 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
4901 memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
4902 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
4903 depthSpan = depthCopy;
4907 case GL_UNSIGNED_BYTE:
4909 GLubyte *dst = (GLubyte *) dest;
4911 for (i = 0; i < n; i++) {
4912 dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
4918 GLbyte *dst = (GLbyte *) dest;
4920 for (i = 0; i < n; i++) {
4921 dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
4925 case GL_UNSIGNED_SHORT:
4927 GLushort *dst = (GLushort *) dest;
4929 for (i = 0; i < n; i++) {
4930 CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
4932 if (dstPacking->SwapBytes) {
4933 _mesa_swap2( (GLushort *) dst, n );
4939 GLshort *dst = (GLshort *) dest;
4941 for (i = 0; i < n; i++) {
4942 dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
4944 if (dstPacking->SwapBytes) {
4945 _mesa_swap2( (GLushort *) dst, n );
4949 case GL_UNSIGNED_INT:
4951 GLuint *dst = (GLuint *) dest;
4953 for (i = 0; i < n; i++) {
4954 dst[i] = FLOAT_TO_UINT( depthSpan[i] );
4956 if (dstPacking->SwapBytes) {
4957 _mesa_swap4( (GLuint *) dst, n );
4963 GLint *dst = (GLint *) dest;
4965 for (i = 0; i < n; i++) {
4966 dst[i] = FLOAT_TO_INT( depthSpan[i] );
4968 if (dstPacking->SwapBytes) {
4969 _mesa_swap4( (GLuint *) dst, n );
4975 GLfloat *dst = (GLfloat *) dest;
4977 for (i = 0; i < n; i++) {
4978 dst[i] = depthSpan[i];
4980 if (dstPacking->SwapBytes) {
4981 _mesa_swap4( (GLuint *) dst, n );
4985 case GL_HALF_FLOAT_ARB:
4987 GLhalfARB *dst = (GLhalfARB *) dest;
4989 for (i = 0; i < n; i++) {
4990 dst[i] = _mesa_float_to_half(depthSpan[i]);
4992 if (dstPacking->SwapBytes) {
4993 _mesa_swap2( (GLushort *) dst, n );
4998 _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
5007 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
5010 _mesa_pack_depth_stencil_span(struct gl_context *ctx, GLuint n, GLuint *dest,
5011 const GLfloat *depthVals,
5012 const GLstencil *stencilVals,
5013 const struct gl_pixelstore_attrib *dstPacking)
5015 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
5016 GLstencil *stencilCopy = (GLstencil *) malloc(n * sizeof(GLstencil));
5019 if (!depthCopy || !stencilCopy) {
5020 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
5026 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5027 memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
5028 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5029 depthVals = depthCopy;
5032 if (ctx->Pixel.IndexShift ||
5033 ctx->Pixel.IndexOffset ||
5034 ctx->Pixel.MapStencilFlag) {
5035 memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
5036 _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
5037 stencilVals = stencilCopy;
5040 for (i = 0; i < n; i++) {
5041 GLuint z = (GLuint) (depthVals[i] * 0xffffff);
5042 dest[i] = (z << 8) | (stencilVals[i] & 0xff);
5045 if (dstPacking->SwapBytes) {
5046 _mesa_swap4(dest, n);
5057 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5058 * Return all image data in a contiguous block. This is used when we
5059 * compile glDrawPixels, glTexImage, etc into a display list. We
5060 * need a copy of the data in a standard format.
5063 _mesa_unpack_image( GLuint dimensions,
5064 GLsizei width, GLsizei height, GLsizei depth,
5065 GLenum format, GLenum type, const GLvoid *pixels,
5066 const struct gl_pixelstore_attrib *unpack )
5068 GLint bytesPerRow, compsPerRow;
5069 GLboolean flipBytes, swap2, swap4;
5072 return NULL; /* not necessarily an error */
5074 if (width <= 0 || height <= 0 || depth <= 0)
5075 return NULL; /* generate error later */
5077 if (type == GL_BITMAP) {
5078 bytesPerRow = (width + 7) >> 3;
5079 flipBytes = unpack->LsbFirst;
5080 swap2 = swap4 = GL_FALSE;
5084 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
5085 GLint components = _mesa_components_in_format(format);
5088 if (_mesa_type_is_packed(type))
5091 if (bytesPerPixel <= 0 || components <= 0)
5092 return NULL; /* bad format or type. generate error later */
5093 bytesPerRow = bytesPerPixel * width;
5094 bytesPerComp = bytesPerPixel / components;
5095 flipBytes = GL_FALSE;
5096 swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
5097 swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
5098 compsPerRow = components * width;
5099 assert(compsPerRow >= width);
5104 = (GLubyte *) malloc(bytesPerRow * height * depth);
5108 return NULL; /* generate GL_OUT_OF_MEMORY later */
5111 for (img = 0; img < depth; img++) {
5112 for (row = 0; row < height; row++) {
5113 const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
5114 width, height, format, type, img, row, 0);
5116 if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
5118 flipBytes = GL_FALSE;
5119 if (unpack->LsbFirst) {
5120 GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
5121 GLubyte dstMask = 128;
5122 const GLubyte *s = src;
5125 for (i = 0; i < width; i++) {
5129 if (srcMask == 128) {
5134 srcMask = srcMask << 1;
5142 dstMask = dstMask >> 1;
5147 GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
5148 GLubyte dstMask = 128;
5149 const GLubyte *s = src;
5152 for (i = 0; i < width; i++) {
5161 srcMask = srcMask >> 1;
5169 dstMask = dstMask >> 1;
5175 memcpy(dst, src, bytesPerRow);
5178 /* byte flipping/swapping */
5180 flip_bytes((GLubyte *) dst, bytesPerRow);
5183 _mesa_swap2((GLushort*) dst, compsPerRow);
5186 _mesa_swap4((GLuint*) dst, compsPerRow);