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
||
1975 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
1980 GLubyte
*ubsrc
= (GLubyte
*) src
;
1981 if (unpack
->LsbFirst
) {
1982 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1984 for (i
= 0; i
< n
; i
++) {
1985 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1996 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1998 for (i
= 0; i
< n
; i
++) {
1999 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2011 case GL_UNSIGNED_BYTE
:
2014 const GLubyte
*s
= (const GLubyte
*) src
;
2015 for (i
= 0; i
< n
; i
++)
2022 const GLbyte
*s
= (const GLbyte
*) src
;
2023 for (i
= 0; i
< n
; i
++)
2027 case GL_UNSIGNED_SHORT
:
2030 const GLushort
*s
= (const GLushort
*) src
;
2031 if (unpack
->SwapBytes
) {
2032 for (i
= 0; i
< n
; i
++) {
2033 GLushort value
= s
[i
];
2039 for (i
= 0; i
< n
; i
++)
2047 const GLshort
*s
= (const GLshort
*) src
;
2048 if (unpack
->SwapBytes
) {
2049 for (i
= 0; i
< n
; i
++) {
2050 GLshort value
= s
[i
];
2056 for (i
= 0; i
< n
; i
++)
2061 case GL_UNSIGNED_INT
:
2064 const GLuint
*s
= (const GLuint
*) src
;
2065 if (unpack
->SwapBytes
) {
2066 for (i
= 0; i
< n
; i
++) {
2067 GLuint value
= s
[i
];
2073 for (i
= 0; i
< n
; i
++)
2081 const GLint
*s
= (const GLint
*) src
;
2082 if (unpack
->SwapBytes
) {
2083 for (i
= 0; i
< n
; i
++) {
2090 for (i
= 0; i
< n
; i
++)
2098 const GLfloat
*s
= (const GLfloat
*) src
;
2099 if (unpack
->SwapBytes
) {
2100 for (i
= 0; i
< n
; i
++) {
2101 GLfloat value
= s
[i
];
2103 indexes
[i
] = (GLuint
) value
;
2107 for (i
= 0; i
< n
; i
++)
2108 indexes
[i
] = (GLuint
) s
[i
];
2112 case GL_HALF_FLOAT_ARB
:
2115 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2116 if (unpack
->SwapBytes
) {
2117 for (i
= 0; i
< n
; i
++) {
2118 GLhalfARB value
= s
[i
];
2120 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2124 for (i
= 0; i
< n
; i
++)
2125 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2129 case GL_UNSIGNED_INT_24_8_EXT
:
2132 const GLuint
*s
= (const GLuint
*) src
;
2133 if (unpack
->SwapBytes
) {
2134 for (i
= 0; i
< n
; i
++) {
2135 GLuint value
= s
[i
];
2137 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2141 for (i
= 0; i
< n
; i
++)
2142 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2146 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2149 const GLuint
*s
= (const GLuint
*) src
;
2150 if (unpack
->SwapBytes
) {
2151 for (i
= 0; i
< n
; i
++) {
2152 GLuint value
= s
[i
*2+1];
2154 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2158 for (i
= 0; i
< n
; i
++)
2159 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2165 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2172 * Return source/dest RGBA indexes for unpacking pixels.
2175 get_component_mapping(GLenum format
,
2187 case GL_RED_INTEGER_EXT
:
2189 *gSrc
= *bSrc
= *aSrc
= -1;
2192 case GL_GREEN_INTEGER_EXT
:
2194 *rSrc
= *bSrc
= *aSrc
= -1;
2197 case GL_BLUE_INTEGER_EXT
:
2199 *rSrc
= *gSrc
= *aSrc
= -1;
2202 case GL_ALPHA_INTEGER_EXT
:
2203 *rSrc
= *gSrc
= *bSrc
= -1;
2207 case GL_LUMINANCE_INTEGER_EXT
:
2208 *rSrc
= *gSrc
= *bSrc
= 0;
2211 case GL_LUMINANCE_ALPHA
:
2212 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2213 *rSrc
= *gSrc
= *bSrc
= 0;
2217 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2231 case GL_RGB_INTEGER
:
2252 case GL_RGBA_INTEGER
:
2290 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2291 _mesa_lookup_enum_by_nr(format
));
2299 * This function extracts floating point RGBA values from arbitrary
2300 * image data. srcFormat and srcType are the format and type parameters
2301 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2303 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2304 * implements the "Conversion to floating point", "Conversion to RGB",
2305 * and "Final Expansion to RGBA" operations.
2307 * Args: n - number of pixels
2308 * rgba - output colors
2309 * srcFormat - format of incoming data
2310 * srcType - data type of incoming data
2311 * src - source data pointer
2312 * swapBytes - perform byteswapping of incoming data?
2315 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2316 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2317 GLboolean swapBytes
)
2319 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2321 GLint rDst
, bDst
, gDst
, aDst
;
2322 GLboolean intFormat
;
2323 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2325 ASSERT(srcFormat
== GL_RED
||
2326 srcFormat
== GL_GREEN
||
2327 srcFormat
== GL_BLUE
||
2328 srcFormat
== GL_ALPHA
||
2329 srcFormat
== GL_LUMINANCE
||
2330 srcFormat
== GL_LUMINANCE_ALPHA
||
2331 srcFormat
== GL_INTENSITY
||
2332 srcFormat
== GL_RG
||
2333 srcFormat
== GL_RGB
||
2334 srcFormat
== GL_BGR
||
2335 srcFormat
== GL_RGBA
||
2336 srcFormat
== GL_BGRA
||
2337 srcFormat
== GL_ABGR_EXT
||
2338 srcFormat
== GL_DU8DV8_ATI
||
2339 srcFormat
== GL_DUDV_ATI
||
2340 srcFormat
== GL_RED_INTEGER_EXT
||
2341 srcFormat
== GL_GREEN_INTEGER_EXT
||
2342 srcFormat
== GL_BLUE_INTEGER_EXT
||
2343 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2344 srcFormat
== GL_RGB_INTEGER_EXT
||
2345 srcFormat
== GL_RGBA_INTEGER_EXT
||
2346 srcFormat
== GL_BGR_INTEGER_EXT
||
2347 srcFormat
== GL_BGRA_INTEGER_EXT
||
2348 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2349 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2351 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2352 srcType
== GL_BYTE
||
2353 srcType
== GL_UNSIGNED_SHORT
||
2354 srcType
== GL_SHORT
||
2355 srcType
== GL_UNSIGNED_INT
||
2356 srcType
== GL_INT
||
2357 srcType
== GL_HALF_FLOAT_ARB
||
2358 srcType
== GL_FLOAT
||
2359 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2360 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2361 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2362 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2363 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2364 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2365 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2366 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2367 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2368 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2369 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2370 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2371 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2372 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2374 get_component_mapping(srcFormat
,
2375 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2376 &rDst
, &gDst
, &bDst
, &aDst
);
2378 stride
= _mesa_components_in_format(srcFormat
);
2380 intFormat
= _mesa_is_integer_format(srcFormat
);
2382 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2383 if ((SRC_INDEX) < 0) { \
2386 for (i = 0; i < n; i++) { \
2387 rgba[i][DST_INDEX] = DEFAULT_INT; \
2391 for (i = 0; i < n; i++) { \
2392 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2396 else if (swapBytes) { \
2397 const TYPE *s = (const TYPE *) src; \
2399 for (i = 0; i < n; i++) { \
2400 TYPE value = s[SRC_INDEX]; \
2401 if (sizeof(TYPE) == 2) { \
2404 else if (sizeof(TYPE) == 4) { \
2408 rgba[i][DST_INDEX] = (GLfloat) value; \
2410 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2415 const TYPE *s = (const TYPE *) src; \
2418 for (i = 0; i < n; i++) { \
2419 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2424 for (i = 0; i < n; i++) { \
2425 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2432 case GL_UNSIGNED_BYTE
:
2433 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2434 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2435 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2436 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2439 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2440 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2441 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2442 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2444 case GL_UNSIGNED_SHORT
:
2445 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2446 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2447 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2448 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2451 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2452 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2453 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2454 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2456 case GL_UNSIGNED_INT
:
2457 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2458 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2459 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2460 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2463 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2464 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2465 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2466 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2469 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2470 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2471 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2472 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2474 case GL_HALF_FLOAT_ARB
:
2475 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2476 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2477 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2478 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2480 case GL_UNSIGNED_BYTE_3_3_2
:
2482 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2489 for (i
= 0; i
< n
; i
++) {
2490 GLubyte p
= ubsrc
[i
];
2491 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2492 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2493 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2494 rgba
[i
][aDst
] = 1.0F
;
2498 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2500 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2507 for (i
= 0; i
< n
; i
++) {
2508 GLubyte p
= ubsrc
[i
];
2509 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2510 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2511 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2512 rgba
[i
][aDst
] = 1.0F
;
2516 case GL_UNSIGNED_SHORT_5_6_5
:
2523 const GLushort
*ussrc
= (const GLushort
*) src
;
2525 for (i
= 0; i
< n
; i
++) {
2526 GLushort p
= ussrc
[i
];
2528 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2529 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2530 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2531 rgba
[i
][aDst
] = 1.0F
;
2535 const GLushort
*ussrc
= (const GLushort
*) src
;
2537 for (i
= 0; i
< n
; i
++) {
2538 GLushort p
= ussrc
[i
];
2539 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2540 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2541 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2542 rgba
[i
][aDst
] = 1.0F
;
2546 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2553 const GLushort
*ussrc
= (const GLushort
*) src
;
2555 for (i
= 0; i
< n
; i
++) {
2556 GLushort p
= ussrc
[i
];
2558 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2559 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2560 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2561 rgba
[i
][aDst
] = 1.0F
;
2565 const GLushort
*ussrc
= (const GLushort
*) src
;
2567 for (i
= 0; i
< n
; i
++) {
2568 GLushort p
= ussrc
[i
];
2569 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2570 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2571 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2572 rgba
[i
][aDst
] = 1.0F
;
2576 case GL_UNSIGNED_SHORT_4_4_4_4
:
2578 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2581 const GLushort
*ussrc
= (const GLushort
*) src
;
2583 for (i
= 0; i
< n
; i
++) {
2584 GLushort p
= ussrc
[i
];
2586 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2587 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2588 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2589 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2593 const GLushort
*ussrc
= (const GLushort
*) src
;
2595 for (i
= 0; i
< n
; i
++) {
2596 GLushort p
= ussrc
[i
];
2597 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2598 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2599 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2600 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2604 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2606 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2609 const GLushort
*ussrc
= (const GLushort
*) src
;
2611 for (i
= 0; i
< n
; i
++) {
2612 GLushort p
= ussrc
[i
];
2614 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2615 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2616 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2617 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2621 const GLushort
*ussrc
= (const GLushort
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLushort p
= ussrc
[i
];
2625 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2626 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2627 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2628 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2632 case GL_UNSIGNED_SHORT_5_5_5_1
:
2634 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2637 const GLushort
*ussrc
= (const GLushort
*) src
;
2639 for (i
= 0; i
< n
; i
++) {
2640 GLushort p
= ussrc
[i
];
2642 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2643 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2644 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2645 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2649 const GLushort
*ussrc
= (const GLushort
*) src
;
2651 for (i
= 0; i
< n
; i
++) {
2652 GLushort p
= ussrc
[i
];
2653 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2654 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2655 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2656 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2660 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2662 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2665 const GLushort
*ussrc
= (const GLushort
*) src
;
2667 for (i
= 0; i
< n
; i
++) {
2668 GLushort p
= ussrc
[i
];
2670 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2671 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2672 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2673 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2677 const GLushort
*ussrc
= (const GLushort
*) src
;
2679 for (i
= 0; i
< n
; i
++) {
2680 GLushort p
= ussrc
[i
];
2681 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2682 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2683 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2684 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2688 case GL_UNSIGNED_INT_8_8_8_8
:
2690 const GLuint
*uisrc
= (const GLuint
*) src
;
2693 for (i
= 0; i
< n
; i
++) {
2694 GLuint p
= uisrc
[i
];
2695 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2696 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2697 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2698 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2702 for (i
= 0; i
< n
; i
++) {
2703 GLuint p
= uisrc
[i
];
2704 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2705 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2706 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2707 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2712 const GLuint
*uisrc
= (const GLuint
*) src
;
2715 for (i
= 0; i
< n
; i
++) {
2716 GLuint p
= uisrc
[i
];
2717 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2718 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2719 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2720 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2724 for (i
= 0; i
< n
; i
++) {
2725 GLuint p
= uisrc
[i
];
2726 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2727 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2728 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2729 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2734 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2736 const GLuint
*uisrc
= (const GLuint
*) src
;
2739 for (i
= 0; i
< n
; i
++) {
2740 GLuint p
= uisrc
[i
];
2741 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2742 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2743 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2744 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2748 for (i
= 0; i
< n
; i
++) {
2749 GLuint p
= uisrc
[i
];
2750 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2751 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2752 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2753 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2758 const GLuint
*uisrc
= (const GLuint
*) src
;
2761 for (i
= 0; i
< n
; i
++) {
2762 GLuint p
= uisrc
[i
];
2763 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2764 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2765 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2766 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2770 for (i
= 0; i
< n
; i
++) {
2771 GLuint p
= uisrc
[i
];
2772 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2773 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2774 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2775 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2780 case GL_UNSIGNED_INT_10_10_10_2
:
2782 rs
= 1.0F
/ 1023.0F
;
2783 gs
= 1.0F
/ 1023.0F
;
2784 bs
= 1.0F
/ 1023.0F
;
2788 const GLuint
*uisrc
= (const GLuint
*) src
;
2790 for (i
= 0; i
< n
; i
++) {
2791 GLuint p
= uisrc
[i
];
2793 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2794 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2795 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2796 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2800 const GLuint
*uisrc
= (const GLuint
*) src
;
2802 for (i
= 0; i
< n
; i
++) {
2803 GLuint p
= uisrc
[i
];
2804 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2805 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2806 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2807 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2811 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2813 rs
= 1.0F
/ 1023.0F
;
2814 gs
= 1.0F
/ 1023.0F
;
2815 bs
= 1.0F
/ 1023.0F
;
2819 const GLuint
*uisrc
= (const GLuint
*) src
;
2821 for (i
= 0; i
< n
; i
++) {
2822 GLuint p
= uisrc
[i
];
2824 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2825 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2826 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2827 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2831 const GLuint
*uisrc
= (const GLuint
*) src
;
2833 for (i
= 0; i
< n
; i
++) {
2834 GLuint p
= uisrc
[i
];
2835 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2836 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2837 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2838 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2842 case GL_UNSIGNED_INT_5_9_9_9_REV
:
2844 const GLuint
*uisrc
= (const GLuint
*) src
;
2847 for (i
= 0; i
< n
; i
++) {
2848 GLuint p
= uisrc
[i
];
2850 rgb9e5_to_float3(p
, f
);
2851 rgba
[i
][rDst
] = f
[0];
2852 rgba
[i
][gDst
] = f
[1];
2853 rgba
[i
][bDst
] = f
[2];
2854 rgba
[i
][aDst
] = 1.0F
;
2858 const GLuint
*uisrc
= (const GLuint
*) src
;
2861 for (i
= 0; i
< n
; i
++) {
2862 rgb9e5_to_float3(uisrc
[i
], f
);
2863 rgba
[i
][rDst
] = f
[0];
2864 rgba
[i
][gDst
] = f
[1];
2865 rgba
[i
][bDst
] = f
[2];
2866 rgba
[i
][aDst
] = 1.0F
;
2870 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
2872 const GLuint
*uisrc
= (const GLuint
*) src
;
2875 for (i
= 0; i
< n
; i
++) {
2876 GLuint p
= uisrc
[i
];
2878 r11g11b10f_to_float3(p
, f
);
2879 rgba
[i
][rDst
] = f
[0];
2880 rgba
[i
][gDst
] = f
[1];
2881 rgba
[i
][bDst
] = f
[2];
2882 rgba
[i
][aDst
] = 1.0F
;
2886 const GLuint
*uisrc
= (const GLuint
*) src
;
2889 for (i
= 0; i
< n
; i
++) {
2890 r11g11b10f_to_float3(uisrc
[i
], f
);
2891 rgba
[i
][rDst
] = f
[0];
2892 rgba
[i
][gDst
] = f
[1];
2893 rgba
[i
][bDst
] = f
[2];
2894 rgba
[i
][aDst
] = 1.0F
;
2899 _mesa_problem(NULL
, "bad srcType in extract float data");
2906 static INLINE GLuint
2907 clamp_byte_to_uint(GLbyte b
)
2909 return b
< 0 ? 0 : b
;
2913 static INLINE GLuint
2914 clamp_short_to_uint(GLshort s
)
2916 return s
< 0 ? 0 : s
;
2920 static INLINE GLuint
2921 clamp_int_to_uint(GLint i
)
2923 return i
< 0 ? 0 : i
;
2927 static INLINE GLuint
2928 clamp_float_to_uint(GLfloat f
)
2930 return f
< 0.0F
? 0 : IROUND(f
);
2934 static INLINE GLuint
2935 clamp_half_to_uint(GLhalfARB h
)
2937 GLfloat f
= _mesa_half_to_float(h
);
2938 return f
< 0.0F
? 0 : IROUND(f
);
2943 * \sa extract_float_rgba()
2946 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2947 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2948 GLboolean swapBytes
)
2950 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2952 GLint rDst
, bDst
, gDst
, aDst
;
2954 ASSERT(srcFormat
== GL_RED
||
2955 srcFormat
== GL_GREEN
||
2956 srcFormat
== GL_BLUE
||
2957 srcFormat
== GL_ALPHA
||
2958 srcFormat
== GL_LUMINANCE
||
2959 srcFormat
== GL_LUMINANCE_ALPHA
||
2960 srcFormat
== GL_INTENSITY
||
2961 srcFormat
== GL_RG
||
2962 srcFormat
== GL_RGB
||
2963 srcFormat
== GL_BGR
||
2964 srcFormat
== GL_RGBA
||
2965 srcFormat
== GL_BGRA
||
2966 srcFormat
== GL_ABGR_EXT
||
2967 srcFormat
== GL_DU8DV8_ATI
||
2968 srcFormat
== GL_DUDV_ATI
||
2969 srcFormat
== GL_RED_INTEGER_EXT
||
2970 srcFormat
== GL_GREEN_INTEGER_EXT
||
2971 srcFormat
== GL_BLUE_INTEGER_EXT
||
2972 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2973 srcFormat
== GL_RGB_INTEGER_EXT
||
2974 srcFormat
== GL_RGBA_INTEGER_EXT
||
2975 srcFormat
== GL_BGR_INTEGER_EXT
||
2976 srcFormat
== GL_BGRA_INTEGER_EXT
||
2977 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2978 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2980 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2981 srcType
== GL_BYTE
||
2982 srcType
== GL_UNSIGNED_SHORT
||
2983 srcType
== GL_SHORT
||
2984 srcType
== GL_UNSIGNED_INT
||
2985 srcType
== GL_INT
||
2986 srcType
== GL_HALF_FLOAT_ARB
||
2987 srcType
== GL_FLOAT
||
2988 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2989 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2990 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2991 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2992 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2993 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2994 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2995 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2996 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2997 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2998 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2999 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3000 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3001 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3003 get_component_mapping(srcFormat
,
3004 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3005 &rDst
, &gDst
, &bDst
, &aDst
);
3007 stride
= _mesa_components_in_format(srcFormat
);
3009 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3010 if ((SRC_INDEX) < 0) { \
3012 for (i = 0; i < n; i++) { \
3013 rgba[i][DST_INDEX] = DEFAULT; \
3016 else if (swapBytes) { \
3017 const TYPE *s = (const TYPE *) src; \
3019 for (i = 0; i < n; i++) { \
3020 TYPE value = s[SRC_INDEX]; \
3021 if (sizeof(TYPE) == 2) { \
3024 else if (sizeof(TYPE) == 4) { \
3027 rgba[i][DST_INDEX] = CONVERSION(value); \
3032 const TYPE *s = (const TYPE *) src; \
3034 for (i = 0; i < n; i++) { \
3035 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3041 case GL_UNSIGNED_BYTE
:
3042 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3043 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3044 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3045 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3048 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3049 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3050 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
3051 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
3053 case GL_UNSIGNED_SHORT
:
3054 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3055 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3056 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3057 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3060 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
3061 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
3062 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
3063 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
3065 case GL_UNSIGNED_INT
:
3066 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3067 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3068 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3069 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3072 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
3073 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
3074 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
3075 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
3078 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3079 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3080 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3081 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3083 case GL_HALF_FLOAT_ARB
:
3084 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3085 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3086 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3087 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3089 case GL_UNSIGNED_BYTE_3_3_2
:
3091 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3093 for (i
= 0; i
< n
; i
++) {
3094 GLubyte p
= ubsrc
[i
];
3095 rgba
[i
][rDst
] = ((p
>> 5) );
3096 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3097 rgba
[i
][bDst
] = ((p
) & 0x3);
3102 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3104 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3106 for (i
= 0; i
< n
; i
++) {
3107 GLubyte p
= ubsrc
[i
];
3108 rgba
[i
][rDst
] = ((p
) & 0x7);
3109 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3110 rgba
[i
][bDst
] = ((p
>> 6) );
3115 case GL_UNSIGNED_SHORT_5_6_5
:
3117 const GLushort
*ussrc
= (const GLushort
*) src
;
3119 for (i
= 0; i
< n
; i
++) {
3120 GLushort p
= ussrc
[i
];
3122 rgba
[i
][rDst
] = ((p
>> 11) );
3123 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3124 rgba
[i
][bDst
] = ((p
) & 0x1f);
3129 const GLushort
*ussrc
= (const GLushort
*) src
;
3131 for (i
= 0; i
< n
; i
++) {
3132 GLushort p
= ussrc
[i
];
3133 rgba
[i
][rDst
] = ((p
>> 11) );
3134 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3135 rgba
[i
][bDst
] = ((p
) & 0x1f);
3140 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3142 const GLushort
*ussrc
= (const GLushort
*) src
;
3144 for (i
= 0; i
< n
; i
++) {
3145 GLushort p
= ussrc
[i
];
3147 rgba
[i
][rDst
] = ((p
) & 0x1f);
3148 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3149 rgba
[i
][bDst
] = ((p
>> 11) );
3154 const GLushort
*ussrc
= (const GLushort
*) src
;
3156 for (i
= 0; i
< n
; i
++) {
3157 GLushort p
= ussrc
[i
];
3158 rgba
[i
][rDst
] = ((p
) & 0x1f);
3159 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3160 rgba
[i
][bDst
] = ((p
>> 11) );
3165 case GL_UNSIGNED_SHORT_4_4_4_4
:
3167 const GLushort
*ussrc
= (const GLushort
*) src
;
3169 for (i
= 0; i
< n
; i
++) {
3170 GLushort p
= ussrc
[i
];
3172 rgba
[i
][rDst
] = ((p
>> 12) );
3173 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3174 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3175 rgba
[i
][aDst
] = ((p
) & 0xf);
3179 const GLushort
*ussrc
= (const GLushort
*) src
;
3181 for (i
= 0; i
< n
; i
++) {
3182 GLushort p
= ussrc
[i
];
3183 rgba
[i
][rDst
] = ((p
>> 12) );
3184 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3185 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3186 rgba
[i
][aDst
] = ((p
) & 0xf);
3190 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3192 const GLushort
*ussrc
= (const GLushort
*) src
;
3194 for (i
= 0; i
< n
; i
++) {
3195 GLushort p
= ussrc
[i
];
3197 rgba
[i
][rDst
] = ((p
) & 0xf);
3198 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3199 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3200 rgba
[i
][aDst
] = ((p
>> 12) );
3204 const GLushort
*ussrc
= (const GLushort
*) src
;
3206 for (i
= 0; i
< n
; i
++) {
3207 GLushort p
= ussrc
[i
];
3208 rgba
[i
][rDst
] = ((p
) & 0xf);
3209 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3210 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3211 rgba
[i
][aDst
] = ((p
>> 12) );
3215 case GL_UNSIGNED_SHORT_5_5_5_1
:
3217 const GLushort
*ussrc
= (const GLushort
*) src
;
3219 for (i
= 0; i
< n
; i
++) {
3220 GLushort p
= ussrc
[i
];
3222 rgba
[i
][rDst
] = ((p
>> 11) );
3223 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3224 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3225 rgba
[i
][aDst
] = ((p
) & 0x1 );
3229 const GLushort
*ussrc
= (const GLushort
*) src
;
3231 for (i
= 0; i
< n
; i
++) {
3232 GLushort p
= ussrc
[i
];
3233 rgba
[i
][rDst
] = ((p
>> 11) );
3234 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3235 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3236 rgba
[i
][aDst
] = ((p
) & 0x1 );
3240 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3242 const GLushort
*ussrc
= (const GLushort
*) src
;
3244 for (i
= 0; i
< n
; i
++) {
3245 GLushort p
= ussrc
[i
];
3247 rgba
[i
][rDst
] = ((p
) & 0x1f);
3248 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3249 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3250 rgba
[i
][aDst
] = ((p
>> 15) );
3254 const GLushort
*ussrc
= (const GLushort
*) src
;
3256 for (i
= 0; i
< n
; i
++) {
3257 GLushort p
= ussrc
[i
];
3258 rgba
[i
][rDst
] = ((p
) & 0x1f);
3259 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3260 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3261 rgba
[i
][aDst
] = ((p
>> 15) );
3265 case GL_UNSIGNED_INT_8_8_8_8
:
3267 const GLuint
*uisrc
= (const GLuint
*) src
;
3269 for (i
= 0; i
< n
; i
++) {
3270 GLuint p
= uisrc
[i
];
3271 rgba
[i
][rDst
] = ((p
) & 0xff);
3272 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3273 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3274 rgba
[i
][aDst
] = ((p
>> 24) );
3278 const GLuint
*uisrc
= (const GLuint
*) src
;
3280 for (i
= 0; i
< n
; i
++) {
3281 GLuint p
= uisrc
[i
];
3282 rgba
[i
][rDst
] = ((p
>> 24) );
3283 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3284 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3285 rgba
[i
][aDst
] = ((p
) & 0xff);
3289 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3291 const GLuint
*uisrc
= (const GLuint
*) src
;
3293 for (i
= 0; i
< n
; i
++) {
3294 GLuint p
= uisrc
[i
];
3295 rgba
[i
][rDst
] = ((p
>> 24) );
3296 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3297 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3298 rgba
[i
][aDst
] = ((p
) & 0xff);
3302 const GLuint
*uisrc
= (const GLuint
*) src
;
3304 for (i
= 0; i
< n
; i
++) {
3305 GLuint p
= uisrc
[i
];
3306 rgba
[i
][rDst
] = ((p
) & 0xff);
3307 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3308 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3309 rgba
[i
][aDst
] = ((p
>> 24) );
3313 case GL_UNSIGNED_INT_10_10_10_2
:
3315 const GLuint
*uisrc
= (const GLuint
*) src
;
3317 for (i
= 0; i
< n
; i
++) {
3318 GLuint p
= uisrc
[i
];
3320 rgba
[i
][rDst
] = ((p
>> 22) );
3321 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3322 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3323 rgba
[i
][aDst
] = ((p
) & 0x3 );
3327 const GLuint
*uisrc
= (const GLuint
*) src
;
3329 for (i
= 0; i
< n
; i
++) {
3330 GLuint p
= uisrc
[i
];
3331 rgba
[i
][rDst
] = ((p
>> 22) );
3332 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3333 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3334 rgba
[i
][aDst
] = ((p
) & 0x3 );
3338 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3340 const GLuint
*uisrc
= (const GLuint
*) src
;
3342 for (i
= 0; i
< n
; i
++) {
3343 GLuint p
= uisrc
[i
];
3345 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3346 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3347 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3348 rgba
[i
][aDst
] = ((p
>> 30) );
3352 const GLuint
*uisrc
= (const GLuint
*) src
;
3354 for (i
= 0; i
< n
; i
++) {
3355 GLuint p
= uisrc
[i
];
3356 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3357 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3358 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3359 rgba
[i
][aDst
] = ((p
>> 30) );
3363 case GL_UNSIGNED_INT_5_9_9_9_REV
:
3365 const GLuint
*uisrc
= (const GLuint
*) src
;
3368 for (i
= 0; i
< n
; i
++) {
3369 GLuint p
= uisrc
[i
];
3371 rgb9e5_to_float3(p
, f
);
3372 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3373 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3374 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3379 const GLuint
*uisrc
= (const GLuint
*) src
;
3382 for (i
= 0; i
< n
; i
++) {
3383 GLuint p
= uisrc
[i
];
3384 rgb9e5_to_float3(p
, f
);
3385 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3386 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3387 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3392 case GL_UNSIGNED_INT_10F_11F_11F_REV
:
3394 const GLuint
*uisrc
= (const GLuint
*) src
;
3397 for (i
= 0; i
< n
; i
++) {
3398 GLuint p
= uisrc
[i
];
3400 r11g11b10f_to_float3(p
, f
);
3401 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3402 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3403 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3408 const GLuint
*uisrc
= (const GLuint
*) src
;
3411 for (i
= 0; i
< n
; i
++) {
3412 GLuint p
= uisrc
[i
];
3413 r11g11b10f_to_float3(p
, f
);
3414 rgba
[i
][rDst
] = clamp_float_to_uint(f
[0]);
3415 rgba
[i
][gDst
] = clamp_float_to_uint(f
[1]);
3416 rgba
[i
][bDst
] = clamp_float_to_uint(f
[2]);
3422 _mesa_problem(NULL
, "bad srcType in extract uint data");
3431 * Unpack a row of color image data from a client buffer according to
3432 * the pixel unpacking parameters.
3433 * Return GLchan values in the specified dest image format.
3434 * This is used by glDrawPixels and glTexImage?D().
3435 * \param ctx - the context
3436 * n - number of pixels in the span
3437 * dstFormat - format of destination color array
3438 * dest - the destination color array
3439 * srcFormat - source image format
3440 * srcType - source image data type
3441 * source - source image pointer
3442 * srcPacking - pixel unpacking parameters
3443 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3445 * XXX perhaps expand this to process whole images someday.
3448 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3449 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3450 GLenum srcFormat
, GLenum srcType
,
3451 const GLvoid
*source
,
3452 const struct gl_pixelstore_attrib
*srcPacking
,
3453 GLbitfield transferOps
)
3455 ASSERT(dstFormat
== GL_ALPHA
||
3456 dstFormat
== GL_LUMINANCE
||
3457 dstFormat
== GL_LUMINANCE_ALPHA
||
3458 dstFormat
== GL_INTENSITY
||
3459 dstFormat
== GL_RED
||
3460 dstFormat
== GL_RG
||
3461 dstFormat
== GL_RGB
||
3462 dstFormat
== GL_RGBA
||
3463 dstFormat
== GL_COLOR_INDEX
);
3465 ASSERT(srcFormat
== GL_RED
||
3466 srcFormat
== GL_GREEN
||
3467 srcFormat
== GL_BLUE
||
3468 srcFormat
== GL_ALPHA
||
3469 srcFormat
== GL_LUMINANCE
||
3470 srcFormat
== GL_LUMINANCE_ALPHA
||
3471 srcFormat
== GL_INTENSITY
||
3472 srcFormat
== GL_RG
||
3473 srcFormat
== GL_RGB
||
3474 srcFormat
== GL_BGR
||
3475 srcFormat
== GL_RGBA
||
3476 srcFormat
== GL_BGRA
||
3477 srcFormat
== GL_ABGR_EXT
||
3478 srcFormat
== GL_COLOR_INDEX
);
3480 ASSERT(srcType
== GL_BITMAP
||
3481 srcType
== GL_UNSIGNED_BYTE
||
3482 srcType
== GL_BYTE
||
3483 srcType
== GL_UNSIGNED_SHORT
||
3484 srcType
== GL_SHORT
||
3485 srcType
== GL_UNSIGNED_INT
||
3486 srcType
== GL_INT
||
3487 srcType
== GL_HALF_FLOAT_ARB
||
3488 srcType
== GL_FLOAT
||
3489 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3490 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3491 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3492 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3493 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3494 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3495 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3496 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3497 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3498 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3499 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3500 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3501 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3502 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3504 /* Try simple cases first */
3505 if (transferOps
== 0) {
3506 if (srcType
== CHAN_TYPE
) {
3507 if (dstFormat
== GL_RGBA
) {
3508 if (srcFormat
== GL_RGBA
) {
3509 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3512 else if (srcFormat
== GL_RGB
) {
3514 const GLchan
*src
= (const GLchan
*) source
;
3516 for (i
= 0; i
< n
; i
++) {
3527 else if (dstFormat
== GL_RGB
) {
3528 if (srcFormat
== GL_RGB
) {
3529 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3532 else if (srcFormat
== GL_RGBA
) {
3534 const GLchan
*src
= (const GLchan
*) source
;
3536 for (i
= 0; i
< n
; i
++) {
3546 else if (dstFormat
== srcFormat
) {
3547 GLint comps
= _mesa_components_in_format(srcFormat
);
3549 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3554 * Common situation, loading 8bit RGBA/RGB source images
3555 * into 16/32 bit destination. (OSMesa16/32)
3557 else if (srcType
== GL_UNSIGNED_BYTE
) {
3558 if (dstFormat
== GL_RGBA
) {
3559 if (srcFormat
== GL_RGB
) {
3561 const GLubyte
*src
= (const GLubyte
*) source
;
3563 for (i
= 0; i
< n
; i
++) {
3564 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3565 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3566 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3573 else if (srcFormat
== GL_RGBA
) {
3575 const GLubyte
*src
= (const GLubyte
*) source
;
3577 for (i
= 0; i
< n
; i
++) {
3578 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3579 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3580 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3581 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3588 else if (dstFormat
== GL_RGB
) {
3589 if (srcFormat
== GL_RGB
) {
3591 const GLubyte
*src
= (const GLubyte
*) source
;
3593 for (i
= 0; i
< n
; i
++) {
3594 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3595 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3596 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3602 else if (srcFormat
== GL_RGBA
) {
3604 const GLubyte
*src
= (const GLubyte
*) source
;
3606 for (i
= 0; i
< n
; i
++) {
3607 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3608 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3609 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3620 /* general solution begins here */
3622 GLint dstComponents
;
3623 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3624 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3627 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3631 dstComponents
= _mesa_components_in_format( dstFormat
);
3632 /* source & dest image formats should have been error checked by now */
3633 assert(dstComponents
> 0);
3636 * Extract image data and convert to RGBA floats
3638 if (srcFormat
== GL_COLOR_INDEX
) {
3639 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3642 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3646 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3649 if (dstFormat
== GL_COLOR_INDEX
) {
3651 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3652 /* convert to GLchan and return */
3653 for (i
= 0; i
< n
; i
++) {
3654 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3661 /* Convert indexes to RGBA */
3662 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3663 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3665 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3668 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3669 * with color indexes.
3671 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3676 /* non-color index data */
3677 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3678 srcPacking
->SwapBytes
);
3681 /* Need to clamp if returning GLubytes or GLushorts */
3682 #if CHAN_TYPE != GL_FLOAT
3683 transferOps
|= IMAGE_CLAMP_BIT
;
3687 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3690 get_component_indexes(dstFormat
,
3691 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3693 /* Now return the GLchan data in the requested dstFormat */
3697 for (i
= 0; i
< n
; i
++) {
3698 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3699 dst
+= dstComponents
;
3706 for (i
= 0; i
< n
; i
++) {
3707 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3708 dst
+= dstComponents
;
3715 for (i
= 0; i
< n
; i
++) {
3716 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3717 dst
+= dstComponents
;
3724 for (i
= 0; i
< n
; i
++) {
3725 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3726 dst
+= dstComponents
;
3734 assert(dstComponents
== 1);
3735 for (i
= 0; i
< n
; i
++) {
3736 /* Intensity comes from red channel */
3737 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3745 for (i
= 0; i
< n
; i
++) {
3746 /* Luminance comes from red channel */
3747 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3748 dst
+= dstComponents
;
3758 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3759 * instead of GLchan.
3762 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3763 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3764 GLenum srcFormat
, GLenum srcType
,
3765 const GLvoid
*source
,
3766 const struct gl_pixelstore_attrib
*srcPacking
,
3767 GLbitfield transferOps
)
3769 ASSERT(dstFormat
== GL_ALPHA
||
3770 dstFormat
== GL_LUMINANCE
||
3771 dstFormat
== GL_LUMINANCE_ALPHA
||
3772 dstFormat
== GL_INTENSITY
||
3773 dstFormat
== GL_RED
||
3774 dstFormat
== GL_RG
||
3775 dstFormat
== GL_RGB
||
3776 dstFormat
== GL_RGBA
||
3777 dstFormat
== GL_COLOR_INDEX
);
3779 ASSERT(srcFormat
== GL_RED
||
3780 srcFormat
== GL_GREEN
||
3781 srcFormat
== GL_BLUE
||
3782 srcFormat
== GL_ALPHA
||
3783 srcFormat
== GL_LUMINANCE
||
3784 srcFormat
== GL_LUMINANCE_ALPHA
||
3785 srcFormat
== GL_INTENSITY
||
3786 srcFormat
== GL_RG
||
3787 srcFormat
== GL_RGB
||
3788 srcFormat
== GL_BGR
||
3789 srcFormat
== GL_RGBA
||
3790 srcFormat
== GL_BGRA
||
3791 srcFormat
== GL_ABGR_EXT
||
3792 srcFormat
== GL_RED_INTEGER_EXT
||
3793 srcFormat
== GL_GREEN_INTEGER_EXT
||
3794 srcFormat
== GL_BLUE_INTEGER_EXT
||
3795 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3796 srcFormat
== GL_RGB_INTEGER_EXT
||
3797 srcFormat
== GL_RGBA_INTEGER_EXT
||
3798 srcFormat
== GL_BGR_INTEGER_EXT
||
3799 srcFormat
== GL_BGRA_INTEGER_EXT
||
3800 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3801 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3802 srcFormat
== GL_COLOR_INDEX
);
3804 ASSERT(srcType
== GL_BITMAP
||
3805 srcType
== GL_UNSIGNED_BYTE
||
3806 srcType
== GL_BYTE
||
3807 srcType
== GL_UNSIGNED_SHORT
||
3808 srcType
== GL_SHORT
||
3809 srcType
== GL_UNSIGNED_INT
||
3810 srcType
== GL_INT
||
3811 srcType
== GL_HALF_FLOAT_ARB
||
3812 srcType
== GL_FLOAT
||
3813 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3814 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3815 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3816 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3817 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3818 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3819 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3820 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3821 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3822 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3823 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3824 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3825 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3826 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3828 /* general solution, no special cases, yet */
3830 GLint dstComponents
;
3831 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3832 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3835 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3839 dstComponents
= _mesa_components_in_format( dstFormat
);
3840 /* source & dest image formats should have been error checked by now */
3841 assert(dstComponents
> 0);
3844 * Extract image data and convert to RGBA floats
3846 if (srcFormat
== GL_COLOR_INDEX
) {
3847 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3850 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3855 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3858 if (dstFormat
== GL_COLOR_INDEX
) {
3860 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3861 /* convert to GLchan and return */
3862 for (i
= 0; i
< n
; i
++) {
3863 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3870 /* Convert indexes to RGBA */
3871 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3872 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3874 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3877 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3878 * with color indexes.
3880 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3885 /* non-color index data */
3886 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3887 srcPacking
->SwapBytes
);
3891 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3894 get_component_indexes(dstFormat
,
3895 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3897 /* Now pack results in the requested dstFormat */
3899 GLfloat
*dst
= dest
;
3901 for (i
= 0; i
< n
; i
++) {
3902 dst
[rDst
] = rgba
[i
][RCOMP
];
3903 dst
+= dstComponents
;
3908 GLfloat
*dst
= dest
;
3910 for (i
= 0; i
< n
; i
++) {
3911 dst
[gDst
] = rgba
[i
][GCOMP
];
3912 dst
+= dstComponents
;
3917 GLfloat
*dst
= dest
;
3919 for (i
= 0; i
< n
; i
++) {
3920 dst
[bDst
] = rgba
[i
][BCOMP
];
3921 dst
+= dstComponents
;
3926 GLfloat
*dst
= dest
;
3928 for (i
= 0; i
< n
; i
++) {
3929 dst
[aDst
] = rgba
[i
][ACOMP
];
3930 dst
+= dstComponents
;
3935 GLfloat
*dst
= dest
;
3938 assert(dstComponents
== 1);
3939 for (i
= 0; i
< n
; i
++) {
3940 /* Intensity comes from red channel */
3941 dst
[i
] = rgba
[i
][RCOMP
];
3946 GLfloat
*dst
= dest
;
3949 for (i
= 0; i
< n
; i
++) {
3950 /* Luminance comes from red channel */
3951 dst
[0] = rgba
[i
][RCOMP
];
3952 dst
+= dstComponents
;
3962 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3963 * instead of GLchan.
3964 * No pixel transfer ops are applied.
3967 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3968 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3969 GLenum srcFormat
, GLenum srcType
,
3970 const GLvoid
*source
,
3971 const struct gl_pixelstore_attrib
*srcPacking
)
3973 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3976 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3980 ASSERT(dstFormat
== GL_ALPHA
||
3981 dstFormat
== GL_LUMINANCE
||
3982 dstFormat
== GL_LUMINANCE_ALPHA
||
3983 dstFormat
== GL_INTENSITY
||
3984 dstFormat
== GL_RED
||
3985 dstFormat
== GL_RG
||
3986 dstFormat
== GL_RGB
||
3987 dstFormat
== GL_RGBA
);
3989 ASSERT(srcFormat
== GL_RED
||
3990 srcFormat
== GL_GREEN
||
3991 srcFormat
== GL_BLUE
||
3992 srcFormat
== GL_ALPHA
||
3993 srcFormat
== GL_LUMINANCE
||
3994 srcFormat
== GL_LUMINANCE_ALPHA
||
3995 srcFormat
== GL_INTENSITY
||
3996 srcFormat
== GL_RG
||
3997 srcFormat
== GL_RGB
||
3998 srcFormat
== GL_BGR
||
3999 srcFormat
== GL_RGBA
||
4000 srcFormat
== GL_BGRA
||
4001 srcFormat
== GL_ABGR_EXT
||
4002 srcFormat
== GL_RED_INTEGER_EXT
||
4003 srcFormat
== GL_GREEN_INTEGER_EXT
||
4004 srcFormat
== GL_BLUE_INTEGER_EXT
||
4005 srcFormat
== GL_ALPHA_INTEGER_EXT
||
4006 srcFormat
== GL_RGB_INTEGER_EXT
||
4007 srcFormat
== GL_RGBA_INTEGER_EXT
||
4008 srcFormat
== GL_BGR_INTEGER_EXT
||
4009 srcFormat
== GL_BGRA_INTEGER_EXT
||
4010 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
4011 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
4013 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4014 srcType
== GL_BYTE
||
4015 srcType
== GL_UNSIGNED_SHORT
||
4016 srcType
== GL_SHORT
||
4017 srcType
== GL_UNSIGNED_INT
||
4018 srcType
== GL_INT
||
4019 srcType
== GL_HALF_FLOAT_ARB
||
4020 srcType
== GL_FLOAT
||
4021 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
4022 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
4023 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
4024 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
4025 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
4026 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
4027 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
4028 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
4029 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
4030 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
4031 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
4032 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
4033 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
4034 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
4037 /* Extract image data as uint[4] pixels */
4038 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4039 srcPacking
->SwapBytes
);
4041 if (dstFormat
== GL_RGBA
) {
4043 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
4047 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
4048 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
4050 assert(dstComponents
> 0);
4052 get_component_indexes(dstFormat
,
4053 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
4055 /* Now pack values in the requested dest format */
4059 for (i
= 0; i
< n
; i
++) {
4060 dst
[rDst
] = rgba
[i
][RCOMP
];
4061 dst
+= dstComponents
;
4068 for (i
= 0; i
< n
; i
++) {
4069 dst
[gDst
] = rgba
[i
][GCOMP
];
4070 dst
+= dstComponents
;
4077 for (i
= 0; i
< n
; i
++) {
4078 dst
[bDst
] = rgba
[i
][BCOMP
];
4079 dst
+= dstComponents
;
4086 for (i
= 0; i
< n
; i
++) {
4087 dst
[aDst
] = rgba
[i
][ACOMP
];
4088 dst
+= dstComponents
;
4096 assert(dstComponents
== 1);
4097 for (i
= 0; i
< n
; i
++) {
4098 /* Intensity comes from red channel */
4099 dst
[i
] = rgba
[i
][RCOMP
];
4107 for (i
= 0; i
< n
; i
++) {
4108 /* Luminance comes from red channel */
4109 dst
[0] = rgba
[i
][RCOMP
];
4110 dst
+= dstComponents
;
4121 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4122 * directly return GLbyte data, no transfer ops apply.
4125 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4126 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4127 GLenum srcFormat
, GLenum srcType
,
4128 const GLvoid
*source
,
4129 const struct gl_pixelstore_attrib
*srcPacking
,
4130 GLbitfield transferOps
)
4132 ASSERT(dstFormat
== GL_DUDV_ATI
);
4133 ASSERT(srcFormat
== GL_DUDV_ATI
||
4134 srcFormat
== GL_DU8DV8_ATI
);
4136 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4137 srcType
== GL_BYTE
||
4138 srcType
== GL_UNSIGNED_SHORT
||
4139 srcType
== GL_SHORT
||
4140 srcType
== GL_UNSIGNED_INT
||
4141 srcType
== GL_INT
||
4142 srcType
== GL_HALF_FLOAT_ARB
||
4143 srcType
== GL_FLOAT
);
4145 /* general solution */
4147 GLint dstComponents
;
4150 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4153 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4157 dstComponents
= _mesa_components_in_format( dstFormat
);
4158 /* source & dest image formats should have been error checked by now */
4159 assert(dstComponents
> 0);
4162 * Extract image data and convert to RGBA floats
4164 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4165 srcPacking
->SwapBytes
);
4168 /* Now determine which color channels we need to produce.
4169 * And determine the dest index (offset) within each color tuple.
4172 /* Now pack results in the requested dstFormat */
4173 for (i
= 0; i
< n
; i
++) {
4174 /* not sure - need clamp[-1,1] here? */
4175 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4176 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4177 dst
+= dstComponents
;
4185 * Unpack a row of color index data from a client buffer according to
4186 * the pixel unpacking parameters.
4187 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4189 * Args: ctx - the context
4190 * n - number of pixels
4191 * dstType - destination data type
4192 * dest - destination array
4193 * srcType - source pixel type
4194 * source - source data pointer
4195 * srcPacking - pixel unpacking parameters
4196 * transferOps - the pixel transfer operations to apply
4199 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4200 GLenum dstType
, GLvoid
*dest
,
4201 GLenum srcType
, const GLvoid
*source
,
4202 const struct gl_pixelstore_attrib
*srcPacking
,
4203 GLbitfield transferOps
)
4205 ASSERT(srcType
== GL_BITMAP
||
4206 srcType
== GL_UNSIGNED_BYTE
||
4207 srcType
== GL_BYTE
||
4208 srcType
== GL_UNSIGNED_SHORT
||
4209 srcType
== GL_SHORT
||
4210 srcType
== GL_UNSIGNED_INT
||
4211 srcType
== GL_INT
||
4212 srcType
== GL_HALF_FLOAT_ARB
||
4213 srcType
== GL_FLOAT
);
4215 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4216 dstType
== GL_UNSIGNED_SHORT
||
4217 dstType
== GL_UNSIGNED_INT
);
4220 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4223 * Try simple cases first
4225 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4226 && dstType
== GL_UNSIGNED_BYTE
) {
4227 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4229 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4230 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4231 memcpy(dest
, source
, n
* sizeof(GLuint
));
4237 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4240 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4244 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4248 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4250 /* convert to dest type */
4252 case GL_UNSIGNED_BYTE
:
4254 GLubyte
*dst
= (GLubyte
*) dest
;
4256 for (i
= 0; i
< n
; i
++) {
4257 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4261 case GL_UNSIGNED_SHORT
:
4263 GLuint
*dst
= (GLuint
*) dest
;
4265 for (i
= 0; i
< n
; i
++) {
4266 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4270 case GL_UNSIGNED_INT
:
4271 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4274 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4283 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4284 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4285 const struct gl_pixelstore_attrib
*dstPacking
,
4286 GLbitfield transferOps
)
4288 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4291 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4295 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4297 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4298 /* make a copy of input */
4299 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4300 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4305 case GL_UNSIGNED_BYTE
:
4307 GLubyte
*dst
= (GLubyte
*) dest
;
4309 for (i
= 0; i
< n
; i
++) {
4310 *dst
++ = (GLubyte
) source
[i
];
4316 GLbyte
*dst
= (GLbyte
*) dest
;
4318 for (i
= 0; i
< n
; i
++) {
4319 dst
[i
] = (GLbyte
) source
[i
];
4323 case GL_UNSIGNED_SHORT
:
4325 GLushort
*dst
= (GLushort
*) dest
;
4327 for (i
= 0; i
< n
; i
++) {
4328 dst
[i
] = (GLushort
) source
[i
];
4330 if (dstPacking
->SwapBytes
) {
4331 _mesa_swap2( (GLushort
*) dst
, n
);
4337 GLshort
*dst
= (GLshort
*) dest
;
4339 for (i
= 0; i
< n
; i
++) {
4340 dst
[i
] = (GLshort
) source
[i
];
4342 if (dstPacking
->SwapBytes
) {
4343 _mesa_swap2( (GLushort
*) dst
, n
);
4347 case GL_UNSIGNED_INT
:
4349 GLuint
*dst
= (GLuint
*) dest
;
4351 for (i
= 0; i
< n
; i
++) {
4352 dst
[i
] = (GLuint
) source
[i
];
4354 if (dstPacking
->SwapBytes
) {
4355 _mesa_swap4( (GLuint
*) dst
, n
);
4361 GLint
*dst
= (GLint
*) dest
;
4363 for (i
= 0; i
< n
; i
++) {
4364 dst
[i
] = (GLint
) source
[i
];
4366 if (dstPacking
->SwapBytes
) {
4367 _mesa_swap4( (GLuint
*) dst
, n
);
4373 GLfloat
*dst
= (GLfloat
*) dest
;
4375 for (i
= 0; i
< n
; i
++) {
4376 dst
[i
] = (GLfloat
) source
[i
];
4378 if (dstPacking
->SwapBytes
) {
4379 _mesa_swap4( (GLuint
*) dst
, n
);
4383 case GL_HALF_FLOAT_ARB
:
4385 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4387 for (i
= 0; i
< n
; i
++) {
4388 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4390 if (dstPacking
->SwapBytes
) {
4391 _mesa_swap2( (GLushort
*) dst
, n
);
4396 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4404 * Unpack a row of stencil data from a client buffer according to
4405 * the pixel unpacking parameters.
4406 * This is (or will be) used by glDrawPixels
4408 * Args: ctx - the context
4409 * n - number of pixels
4410 * dstType - destination data type
4411 * dest - destination array
4412 * srcType - source pixel type
4413 * source - source data pointer
4414 * srcPacking - pixel unpacking parameters
4415 * transferOps - apply offset/bias/lookup ops?
4418 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4419 GLenum dstType
, GLvoid
*dest
,
4420 GLenum srcType
, const GLvoid
*source
,
4421 const struct gl_pixelstore_attrib
*srcPacking
,
4422 GLbitfield transferOps
)
4424 ASSERT(srcType
== GL_BITMAP
||
4425 srcType
== GL_UNSIGNED_BYTE
||
4426 srcType
== GL_BYTE
||
4427 srcType
== GL_UNSIGNED_SHORT
||
4428 srcType
== GL_SHORT
||
4429 srcType
== GL_UNSIGNED_INT
||
4430 srcType
== GL_INT
||
4431 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4432 srcType
== GL_HALF_FLOAT_ARB
||
4433 srcType
== GL_FLOAT
||
4434 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4436 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4437 dstType
== GL_UNSIGNED_SHORT
||
4438 dstType
== GL_UNSIGNED_INT
||
4439 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4441 /* only shift and offset apply to stencil */
4442 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4445 * Try simple cases first
4447 if (transferOps
== 0 &&
4448 !ctx
->Pixel
.MapStencilFlag
&&
4449 srcType
== GL_UNSIGNED_BYTE
&&
4450 dstType
== GL_UNSIGNED_BYTE
) {
4451 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4453 else if (transferOps
== 0 &&
4454 !ctx
->Pixel
.MapStencilFlag
&&
4455 srcType
== GL_UNSIGNED_INT
&&
4456 dstType
== GL_UNSIGNED_INT
&&
4457 !srcPacking
->SwapBytes
) {
4458 memcpy(dest
, source
, n
* sizeof(GLuint
));
4464 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4467 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4471 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4474 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4475 /* shift and offset indexes */
4476 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4479 if (ctx
->Pixel
.MapStencilFlag
) {
4480 /* Apply stencil lookup table */
4481 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4483 for (i
= 0; i
< n
; i
++) {
4484 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4488 /* convert to dest type */
4490 case GL_UNSIGNED_BYTE
:
4492 GLubyte
*dst
= (GLubyte
*) dest
;
4494 for (i
= 0; i
< n
; i
++) {
4495 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4499 case GL_UNSIGNED_SHORT
:
4501 GLuint
*dst
= (GLuint
*) dest
;
4503 for (i
= 0; i
< n
; i
++) {
4504 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4508 case GL_UNSIGNED_INT
:
4509 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4511 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4513 GLuint
*dst
= (GLuint
*) dest
;
4515 for (i
= 0; i
< n
; i
++) {
4516 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4521 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4530 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4531 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4532 const struct gl_pixelstore_attrib
*dstPacking
)
4534 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4537 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4541 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4542 ctx
->Pixel
.MapStencilFlag
) {
4543 /* make a copy of input */
4544 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4545 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4550 case GL_UNSIGNED_BYTE
:
4551 if (sizeof(GLstencil
) == 1) {
4552 memcpy( dest
, source
, n
);
4555 GLubyte
*dst
= (GLubyte
*) dest
;
4558 dst
[i
] = (GLubyte
) source
[i
];
4564 GLbyte
*dst
= (GLbyte
*) dest
;
4567 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4571 case GL_UNSIGNED_SHORT
:
4573 GLushort
*dst
= (GLushort
*) dest
;
4576 dst
[i
] = (GLushort
) source
[i
];
4578 if (dstPacking
->SwapBytes
) {
4579 _mesa_swap2( (GLushort
*) dst
, n
);
4585 GLshort
*dst
= (GLshort
*) dest
;
4588 dst
[i
] = (GLshort
) source
[i
];
4590 if (dstPacking
->SwapBytes
) {
4591 _mesa_swap2( (GLushort
*) dst
, n
);
4595 case GL_UNSIGNED_INT
:
4597 GLuint
*dst
= (GLuint
*) dest
;
4600 dst
[i
] = (GLuint
) source
[i
];
4602 if (dstPacking
->SwapBytes
) {
4603 _mesa_swap4( (GLuint
*) dst
, n
);
4609 GLint
*dst
= (GLint
*) dest
;
4612 dst
[i
] = (GLint
) source
[i
];
4614 if (dstPacking
->SwapBytes
) {
4615 _mesa_swap4( (GLuint
*) dst
, n
);
4621 GLfloat
*dst
= (GLfloat
*) dest
;
4624 dst
[i
] = (GLfloat
) source
[i
];
4626 if (dstPacking
->SwapBytes
) {
4627 _mesa_swap4( (GLuint
*) dst
, n
);
4631 case GL_HALF_FLOAT_ARB
:
4633 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4636 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4638 if (dstPacking
->SwapBytes
) {
4639 _mesa_swap2( (GLushort
*) dst
, n
);
4644 if (dstPacking
->LsbFirst
) {
4645 GLubyte
*dst
= (GLubyte
*) dest
;
4648 for (i
= 0; i
< n
; i
++) {
4651 *dst
|= ((source
[i
] != 0) << shift
);
4660 GLubyte
*dst
= (GLubyte
*) dest
;
4663 for (i
= 0; i
< n
; i
++) {
4666 *dst
|= ((source
[i
] != 0) << shift
);
4676 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4682 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4685 const GLTYPE *src = (const GLTYPE *)source; \
4686 for (i = 0; i < n; i++) { \
4687 GLTYPE value = src[i]; \
4688 if (srcPacking->SwapBytes) { \
4689 if (sizeof(GLTYPE) == 2) { \
4691 } else if (sizeof(GLTYPE) == 4) { \
4695 depthValues[i] = GLTYPE2FLOAT(value); \
4701 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4702 * or GLfloat values.
4703 * The glPixelTransfer (scale/bias) params will be applied.
4705 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4706 * \param depthMax max value for returned GLushort or GLuint values
4707 * (ignored for GLfloat).
4710 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4711 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4712 GLenum srcType
, const GLvoid
*source
,
4713 const struct gl_pixelstore_attrib
*srcPacking
)
4715 GLfloat
*depthTemp
= NULL
, *depthValues
;
4716 GLboolean needClamp
= GL_FALSE
;
4718 /* Look for special cases first.
4719 * Not only are these faster, they're less prone to numeric conversion
4720 * problems. Otherwise, converting from an int type to a float then
4721 * back to an int type can introduce errors that will show up as
4722 * artifacts in things like depth peeling which uses glCopyTexImage.
4724 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4725 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4726 const GLuint
*src
= (const GLuint
*) source
;
4727 GLushort
*dst
= (GLushort
*) dest
;
4729 for (i
= 0; i
< n
; i
++) {
4730 dst
[i
] = src
[i
] >> 16;
4734 if (srcType
== GL_UNSIGNED_SHORT
4735 && dstType
== GL_UNSIGNED_INT
4736 && depthMax
== 0xffffffff) {
4737 const GLushort
*src
= (const GLushort
*) source
;
4738 GLuint
*dst
= (GLuint
*) dest
;
4740 for (i
= 0; i
< n
; i
++) {
4741 dst
[i
] = src
[i
] | (src
[i
] << 16);
4745 if (srcType
== GL_UNSIGNED_INT_24_8
4746 && dstType
== GL_UNSIGNED_INT
4747 && depthMax
== 0xffffff) {
4748 const GLuint
*src
= (const GLuint
*) source
;
4749 GLuint
*dst
= (GLuint
*) dest
;
4751 for (i
= 0; i
< n
; i
++) {
4752 dst
[i
] = src
[i
] >> 8;
4756 /* XXX may want to add additional cases here someday */
4759 /* general case path follows */
4761 if (dstType
== GL_FLOAT
) {
4762 depthValues
= (GLfloat
*) dest
;
4765 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4767 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4771 depthValues
= depthTemp
;
4774 /* Convert incoming values to GLfloat. Some conversions will require
4779 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4780 needClamp
= GL_TRUE
;
4782 case GL_UNSIGNED_BYTE
:
4783 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4786 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4787 needClamp
= GL_TRUE
;
4789 case GL_UNSIGNED_SHORT
:
4790 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4793 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4794 needClamp
= GL_TRUE
;
4796 case GL_UNSIGNED_INT
:
4797 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4799 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4800 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4801 depthMax
== 0xffffff &&
4802 ctx
->Pixel
.DepthScale
== 1.0 &&
4803 ctx
->Pixel
.DepthBias
== 0.0) {
4804 const GLuint
*src
= (const GLuint
*) source
;
4805 GLuint
*zValues
= (GLuint
*) dest
;
4807 for (i
= 0; i
< n
; i
++) {
4808 GLuint value
= src
[i
];
4809 if (srcPacking
->SwapBytes
) {
4812 zValues
[i
] = value
& 0xffffff00;
4818 const GLuint
*src
= (const GLuint
*) source
;
4819 const GLfloat scale
= 1.0f
/ 0xffffff;
4821 for (i
= 0; i
< n
; i
++) {
4822 GLuint value
= src
[i
];
4823 if (srcPacking
->SwapBytes
) {
4826 depthValues
[i
] = (value
>> 8) * scale
;
4830 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4833 const GLfloat
*src
= (const GLfloat
*)source
;
4834 for (i
= 0; i
< n
; i
++) {
4835 GLfloat value
= src
[i
* 2];
4836 if (srcPacking
->SwapBytes
) {
4839 depthValues
[i
] = value
;
4841 needClamp
= GL_TRUE
;
4845 DEPTH_VALUES(GLfloat
, 1*);
4846 needClamp
= GL_TRUE
;
4848 case GL_HALF_FLOAT_ARB
:
4851 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4852 for (i
= 0; i
< n
; i
++) {
4853 GLhalfARB value
= src
[i
];
4854 if (srcPacking
->SwapBytes
) {
4857 depthValues
[i
] = _mesa_half_to_float(value
);
4859 needClamp
= GL_TRUE
;
4863 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4868 /* apply depth scale and bias */
4870 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4871 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4872 if (scale
!= 1.0 || bias
!= 0.0) {
4874 for (i
= 0; i
< n
; i
++) {
4875 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4877 needClamp
= GL_TRUE
;
4881 /* clamp to [0, 1] */
4884 for (i
= 0; i
< n
; i
++) {
4885 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4890 * Convert values to dstType
4892 if (dstType
== GL_UNSIGNED_INT
) {
4893 GLuint
*zValues
= (GLuint
*) dest
;
4895 if (depthMax
<= 0xffffff) {
4896 /* no overflow worries */
4897 for (i
= 0; i
< n
; i
++) {
4898 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4902 /* need to use double precision to prevent overflow problems */
4903 for (i
= 0; i
< n
; i
++) {
4904 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4905 if (z
>= (GLdouble
) 0xffffffff)
4906 zValues
[i
] = 0xffffffff;
4908 zValues
[i
] = (GLuint
) z
;
4912 else if (dstType
== GL_UNSIGNED_SHORT
) {
4913 GLushort
*zValues
= (GLushort
*) dest
;
4915 ASSERT(depthMax
<= 0xffff);
4916 for (i
= 0; i
< n
; i
++) {
4917 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4920 else if (dstType
== GL_FLOAT
) {
4921 /* Nothing to do. depthValues is pointing to dest. */
4923 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4924 GLfloat
*zValues
= (GLfloat
*) dest
;
4926 for (i
= 0; i
< n
; i
++) {
4927 zValues
[i
*2] = depthValues
[i
];
4939 * Pack an array of depth values. The values are floats in [0,1].
4942 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4943 GLenum dstType
, const GLfloat
*depthSpan
,
4944 const struct gl_pixelstore_attrib
*dstPacking
)
4946 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4948 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4952 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4953 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4954 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4955 depthSpan
= depthCopy
;
4959 case GL_UNSIGNED_BYTE
:
4961 GLubyte
*dst
= (GLubyte
*) dest
;
4963 for (i
= 0; i
< n
; i
++) {
4964 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4970 GLbyte
*dst
= (GLbyte
*) dest
;
4972 for (i
= 0; i
< n
; i
++) {
4973 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4977 case GL_UNSIGNED_SHORT
:
4979 GLushort
*dst
= (GLushort
*) dest
;
4981 for (i
= 0; i
< n
; i
++) {
4982 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4984 if (dstPacking
->SwapBytes
) {
4985 _mesa_swap2( (GLushort
*) dst
, n
);
4991 GLshort
*dst
= (GLshort
*) dest
;
4993 for (i
= 0; i
< n
; i
++) {
4994 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4996 if (dstPacking
->SwapBytes
) {
4997 _mesa_swap2( (GLushort
*) dst
, n
);
5001 case GL_UNSIGNED_INT
:
5003 GLuint
*dst
= (GLuint
*) dest
;
5005 for (i
= 0; i
< n
; i
++) {
5006 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
5008 if (dstPacking
->SwapBytes
) {
5009 _mesa_swap4( (GLuint
*) dst
, n
);
5015 GLint
*dst
= (GLint
*) dest
;
5017 for (i
= 0; i
< n
; i
++) {
5018 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
5020 if (dstPacking
->SwapBytes
) {
5021 _mesa_swap4( (GLuint
*) dst
, n
);
5027 GLfloat
*dst
= (GLfloat
*) dest
;
5029 for (i
= 0; i
< n
; i
++) {
5030 dst
[i
] = depthSpan
[i
];
5032 if (dstPacking
->SwapBytes
) {
5033 _mesa_swap4( (GLuint
*) dst
, n
);
5037 case GL_HALF_FLOAT_ARB
:
5039 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
5041 for (i
= 0; i
< n
; i
++) {
5042 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
5044 if (dstPacking
->SwapBytes
) {
5045 _mesa_swap2( (GLushort
*) dst
, n
);
5050 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
5059 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5062 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
5063 GLenum dstType
, GLuint
*dest
,
5064 const GLfloat
*depthVals
,
5065 const GLstencil
*stencilVals
,
5066 const struct gl_pixelstore_attrib
*dstPacking
)
5068 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
5069 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
5072 if (!depthCopy
|| !stencilCopy
) {
5073 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
5079 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
5080 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
5081 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
5082 depthVals
= depthCopy
;
5085 if (ctx
->Pixel
.IndexShift
||
5086 ctx
->Pixel
.IndexOffset
||
5087 ctx
->Pixel
.MapStencilFlag
) {
5088 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
5089 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
5090 stencilVals
= stencilCopy
;
5094 case GL_UNSIGNED_INT_24_8
:
5095 for (i
= 0; i
< n
; i
++) {
5096 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
5097 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
5100 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
5101 for (i
= 0; i
< n
; i
++) {
5102 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
5103 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
5108 if (dstPacking
->SwapBytes
) {
5109 _mesa_swap4(dest
, n
);
5120 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5121 * Return all image data in a contiguous block. This is used when we
5122 * compile glDrawPixels, glTexImage, etc into a display list. We
5123 * need a copy of the data in a standard format.
5126 _mesa_unpack_image( GLuint dimensions
,
5127 GLsizei width
, GLsizei height
, GLsizei depth
,
5128 GLenum format
, GLenum type
, const GLvoid
*pixels
,
5129 const struct gl_pixelstore_attrib
*unpack
)
5131 GLint bytesPerRow
, compsPerRow
;
5132 GLboolean flipBytes
, swap2
, swap4
;
5135 return NULL
; /* not necessarily an error */
5137 if (width
<= 0 || height
<= 0 || depth
<= 0)
5138 return NULL
; /* generate error later */
5140 if (type
== GL_BITMAP
) {
5141 bytesPerRow
= (width
+ 7) >> 3;
5142 flipBytes
= unpack
->LsbFirst
;
5143 swap2
= swap4
= GL_FALSE
;
5147 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5148 GLint components
= _mesa_components_in_format(format
);
5151 if (_mesa_type_is_packed(type
))
5154 if (bytesPerPixel
<= 0 || components
<= 0)
5155 return NULL
; /* bad format or type. generate error later */
5156 bytesPerRow
= bytesPerPixel
* width
;
5157 bytesPerComp
= bytesPerPixel
/ components
;
5158 flipBytes
= GL_FALSE
;
5159 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5160 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5161 compsPerRow
= components
* width
;
5162 assert(compsPerRow
>= width
);
5167 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5171 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5174 for (img
= 0; img
< depth
; img
++) {
5175 for (row
= 0; row
< height
; row
++) {
5176 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5177 width
, height
, format
, type
, img
, row
, 0);
5179 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5181 flipBytes
= GL_FALSE
;
5182 if (unpack
->LsbFirst
) {
5183 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5184 GLubyte dstMask
= 128;
5185 const GLubyte
*s
= src
;
5188 for (i
= 0; i
< width
; i
++) {
5192 if (srcMask
== 128) {
5197 srcMask
= srcMask
<< 1;
5205 dstMask
= dstMask
>> 1;
5210 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5211 GLubyte dstMask
= 128;
5212 const GLubyte
*s
= src
;
5215 for (i
= 0; i
< width
; i
++) {
5224 srcMask
= srcMask
>> 1;
5232 dstMask
= dstMask
>> 1;
5238 memcpy(dst
, src
, bytesPerRow
);
5241 /* byte flipping/swapping */
5243 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5246 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5249 _mesa_swap4((GLuint
*) dst
, compsPerRow
);