2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Image and pixel span packing and unpacking.
40 #include "pixeltransfer.h"
42 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
43 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
47 * Flip the 8 bits in each byte of the given array.
50 * \param n number of bytes.
52 * \todo try this trick to flip bytes someday:
54 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
55 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
56 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
60 flip_bytes( GLubyte *p, GLuint n )
63 for (i = 0; i < n; i++) {
64 b = (GLuint) p[i]; /* words are often faster than bytes */
65 a = ((b & 0x01) << 7) |
80 * Unpack a 32x32 pixel polygon stipple from user memory using the
81 * current pixel unpack settings.
84 _mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
85 const struct gl_pixelstore_attrib *unpacking )
87 GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
89 /* Convert pattern from GLubytes to GLuints and handle big/little
94 for (i = 0; i < 32; i++) {
95 dest[i] = (p[0] << 24)
107 * Pack polygon stipple into user memory given current pixel packing
111 _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
112 const struct gl_pixelstore_attrib *packing )
114 /* Convert pattern from GLuints to GLubytes to handle big/little
115 * endian differences.
119 for (i = 0; i < 32; i++) {
120 ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
121 ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
122 ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
123 ptrn[i * 4 + 3] = (GLubyte) ((pattern[i] ) & 0xff);
126 _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
131 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
132 * order with row alignment = 1 byte.
135 _mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
136 const struct gl_pixelstore_attrib *packing )
138 GLint bytes, row, width_in_bytes;
139 GLubyte *buffer, *dst;
144 /* Alloc dest storage */
145 bytes = ((width + 7) / 8 * height);
146 buffer = (GLubyte *) malloc( bytes );
150 width_in_bytes = CEILING( width, 8 );
152 for (row = 0; row < height; row++) {
153 const GLubyte *src = (const GLubyte *)
154 _mesa_image_address2d(packing, pixels, width, height,
155 GL_COLOR_INDEX, GL_BITMAP, row, 0);
161 if ((packing->SkipPixels & 7) == 0) {
162 memcpy( dst, src, width_in_bytes );
163 if (packing->LsbFirst) {
164 flip_bytes( dst, width_in_bytes );
168 /* handling SkipPixels is a bit tricky (no pun intended!) */
170 if (packing->LsbFirst) {
171 GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
172 GLubyte dstMask = 128;
173 const GLubyte *s = src;
176 for (i = 0; i < width; i++) {
180 if (srcMask == 128) {
185 srcMask = srcMask << 1;
193 dstMask = dstMask >> 1;
198 GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
199 GLubyte dstMask = 128;
200 const GLubyte *s = src;
203 for (i = 0; i < width; i++) {
212 srcMask = srcMask >> 1;
220 dstMask = dstMask >> 1;
225 dst += width_in_bytes;
236 _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
237 GLubyte *dest, const struct gl_pixelstore_attrib *packing )
239 GLint row, width_in_bytes;
245 width_in_bytes = CEILING( width, 8 );
247 for (row = 0; row < height; row++) {
248 GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
249 width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
253 if ((packing->SkipPixels & 7) == 0) {
254 memcpy( dst, src, width_in_bytes );
255 if (packing->LsbFirst) {
256 flip_bytes( dst, width_in_bytes );
260 /* handling SkipPixels is a bit tricky (no pun intended!) */
262 if (packing->LsbFirst) {
263 GLubyte srcMask = 128;
264 GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
265 const GLubyte *s = src;
268 for (i = 0; i < width; i++) {
277 srcMask = srcMask >> 1;
279 if (dstMask == 128) {
285 dstMask = dstMask << 1;
290 GLubyte srcMask = 128;
291 GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
292 const GLubyte *s = src;
295 for (i = 0; i < width; i++) {
304 srcMask = srcMask >> 1;
312 dstMask = dstMask >> 1;
317 src += width_in_bytes;
323 * Get indexes of color components for a basic color format, such as
324 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
328 get_component_indexes(GLenum format,
333 GLint *luminanceIndex,
334 GLint *intensityIndex)
340 *luminanceIndex = -1;
341 *intensityIndex = -1;
345 case GL_LUMINANCE_INTEGER_EXT:
348 case GL_LUMINANCE_ALPHA:
349 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
357 case GL_RED_INTEGER_EXT:
361 case GL_GREEN_INTEGER_EXT:
365 case GL_BLUE_INTEGER_EXT:
369 case GL_ALPHA_INTEGER_EXT:
378 case GL_RGB_INTEGER_EXT:
384 case GL_BGR_INTEGER_EXT:
390 case GL_RGBA_INTEGER_EXT:
397 case GL_BGRA_INTEGER:
415 assert(0 && "bad format in get_component_indexes()");
422 * For small integer types, return the min and max possible values.
423 * Used for clamping floats to unscaled integer types.
424 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
427 get_type_min_max(GLenum type, GLfloat *min, GLfloat *max)
434 case GL_UNSIGNED_BYTE:
442 case GL_UNSIGNED_SHORT:
451 /* Customization of integer packing. We always treat src as uint, and can pack dst
452 * as any integer type/format combo.
454 #define SRC_TYPE GLuint
456 #define DST_TYPE GLuint
457 #define SRC_CONVERT(x) (x)
458 #define FN_NAME pack_uint_from_uint_rgba
459 #include "pack_tmp.h"
464 #define DST_TYPE GLushort
465 #define SRC_CONVERT(x) MIN2(x, 0xffff)
466 #define FN_NAME pack_ushort_from_uint_rgba
467 #include "pack_tmp.h"
472 #define DST_TYPE GLshort
473 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
474 #define FN_NAME pack_short_from_uint_rgba
475 #include "pack_tmp.h"
480 #define DST_TYPE GLubyte
481 #define SRC_CONVERT(x) MIN2(x, 0xff)
482 #define FN_NAME pack_ubyte_from_uint_rgba
483 #include "pack_tmp.h"
488 #define DST_TYPE GLbyte
489 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
490 #define FN_NAME pack_byte_from_uint_rgba
491 #include "pack_tmp.h"
497 _mesa_pack_rgba_span_int(struct gl_context *ctx, GLuint n, GLuint rgba[][4],
498 GLenum dstFormat, GLenum dstType,
502 case GL_UNSIGNED_INT:
503 pack_uint_from_uint_rgba(dstAddr, dstFormat, rgba, n);
506 /* No conversion necessary. */
507 pack_uint_from_uint_rgba(dstAddr, dstFormat, rgba, n);
509 case GL_UNSIGNED_SHORT:
510 pack_ushort_from_uint_rgba(dstAddr, dstFormat, rgba, n);
513 pack_short_from_uint_rgba(dstAddr, dstFormat, rgba, n);
515 case GL_UNSIGNED_BYTE:
516 pack_ubyte_from_uint_rgba(dstAddr, dstFormat, rgba, n);
519 pack_byte_from_uint_rgba(dstAddr, dstFormat, rgba, n);
529 * Used to pack an array [][4] of RGBA float colors as specified
530 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
531 * Historically, the RGBA values were in [0,1] and rescaled to fit
532 * into GLubytes, etc. But with new integer formats, the RGBA values
533 * may have any value and we don't always rescale when converting to
536 * Note: the rgba values will be modified by this function when any pixel
537 * transfer ops are enabled.
540 _mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
541 GLenum dstFormat, GLenum dstType,
543 const struct gl_pixelstore_attrib *dstPacking,
544 GLbitfield transferOps)
547 const GLint comps = _mesa_components_in_format(dstFormat);
548 const GLboolean intDstFormat = _mesa_is_integer_format(dstFormat);
551 if (dstFormat == GL_LUMINANCE ||
552 dstFormat == GL_LUMINANCE_ALPHA ||
553 dstFormat == GL_LUMINANCE_INTEGER_EXT ||
554 dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) {
555 luminance = (GLfloat *) malloc(n * sizeof(GLfloat));
557 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
565 /* EXT_texture_integer specifies no transfer ops on integer
566 * types in the resolved issues section. Just set them to 0
567 * for integer surfaces.
573 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
577 * Component clamping (besides clamping to [0,1] in
578 * _mesa_apply_rgba_transfer_ops()).
581 /* clamping to dest type's min/max values */
583 if (get_type_min_max(dstType, &min, &max)) {
584 for (i = 0; i < n; i++) {
585 rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
586 rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
587 rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
588 rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
592 else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
593 /* compute luminance values */
594 if (transferOps & IMAGE_CLAMP_BIT) {
595 for (i = 0; i < n; i++) {
596 GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
597 luminance[i] = CLAMP(sum, 0.0F, 1.0F);
601 for (i = 0; i < n; i++) {
602 luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
608 * Pack/store the pixels. Ugh! Lots of cases!!!
611 case GL_UNSIGNED_BYTE:
613 GLubyte *dst = (GLubyte *) dstAddr;
617 dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
621 dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
625 dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
629 dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
633 dst[i] = FLOAT_TO_UBYTE(luminance[i]);
635 case GL_LUMINANCE_ALPHA:
637 dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
638 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
643 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
644 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
649 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
650 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
651 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
656 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
657 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
658 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
659 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
664 dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
665 dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
666 dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
671 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
672 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
673 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
674 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
679 dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
680 dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
681 dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
682 dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
685 case GL_RED_INTEGER_EXT:
687 dst[i] = (GLubyte) rgba[i][RCOMP];
690 case GL_GREEN_INTEGER_EXT:
692 dst[i] = (GLubyte) rgba[i][GCOMP];
695 case GL_BLUE_INTEGER_EXT:
697 dst[i] = (GLubyte) rgba[i][BCOMP];
700 case GL_ALPHA_INTEGER_EXT:
702 dst[i] = (GLubyte) rgba[i][ACOMP];
707 dst[i*2+0] = (GLubyte) rgba[i][RCOMP];
708 dst[i*2+1] = (GLubyte) rgba[i][GCOMP];
711 case GL_RGB_INTEGER_EXT:
713 dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
714 dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
715 dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
718 case GL_RGBA_INTEGER_EXT:
720 dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
721 dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
722 dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
723 dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
726 case GL_BGR_INTEGER_EXT:
728 dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
729 dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
730 dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
733 case GL_BGRA_INTEGER_EXT:
735 dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
736 dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
737 dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
738 dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
741 case GL_LUMINANCE_INTEGER_EXT:
743 dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
746 dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
749 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
751 dst[i] = (GLubyte) (rgba[i][RCOMP] +
759 dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
760 dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
764 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
770 GLbyte *dst = (GLbyte *) dstAddr;
774 dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
778 dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
782 dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
786 dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
790 dst[i] = FLOAT_TO_BYTE(luminance[i]);
792 case GL_LUMINANCE_ALPHA:
794 dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
795 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
800 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
801 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
806 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
807 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
808 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
813 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
814 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
815 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
816 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
821 dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
822 dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
823 dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
828 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
829 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
830 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
831 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
836 dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
837 dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
838 dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
839 dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
842 case GL_RED_INTEGER_EXT:
844 dst[i] = (GLbyte) rgba[i][RCOMP];
847 case GL_GREEN_INTEGER_EXT:
849 dst[i] = (GLbyte) rgba[i][GCOMP];
852 case GL_BLUE_INTEGER_EXT:
854 dst[i] = (GLbyte) rgba[i][BCOMP];
857 case GL_ALPHA_INTEGER_EXT:
859 dst[i] = (GLbyte) rgba[i][ACOMP];
864 dst[i*2+0] = (GLbyte) rgba[i][RCOMP];
865 dst[i*2+1] = (GLbyte) rgba[i][GCOMP];
868 case GL_RGB_INTEGER_EXT:
870 dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
871 dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
872 dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
875 case GL_RGBA_INTEGER_EXT:
877 dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
878 dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
879 dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
880 dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
883 case GL_BGR_INTEGER_EXT:
885 dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
886 dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
887 dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
890 case GL_BGRA_INTEGER_EXT:
892 dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
893 dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
894 dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
895 dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
898 case GL_LUMINANCE_INTEGER_EXT:
900 dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
903 dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
906 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
908 dst[i] = (GLbyte) (rgba[i][RCOMP] +
916 dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
917 dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
921 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
925 case GL_UNSIGNED_SHORT:
927 GLushort *dst = (GLushort *) dstAddr;
931 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
935 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
939 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
943 CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
947 UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
949 case GL_LUMINANCE_ALPHA:
951 UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
952 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
957 CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
958 CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
963 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
964 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
965 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
970 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
971 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
972 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
973 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
978 CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
979 CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
980 CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
985 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
986 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
987 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
988 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
993 CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
994 CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
995 CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
996 CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
999 case GL_RED_INTEGER_EXT:
1001 dst[i] = (GLushort) rgba[i][RCOMP];
1004 case GL_GREEN_INTEGER_EXT:
1006 dst[i] = (GLushort) rgba[i][GCOMP];
1009 case GL_BLUE_INTEGER_EXT:
1011 dst[i] = (GLushort) rgba[i][BCOMP];
1014 case GL_ALPHA_INTEGER_EXT:
1016 dst[i] = (GLushort) rgba[i][ACOMP];
1021 dst[i*2+0] = (GLushort) rgba[i][RCOMP];
1022 dst[i*2+1] = (GLushort) rgba[i][GCOMP];
1025 case GL_RGB_INTEGER_EXT:
1027 dst[i*3+0] = (GLushort) rgba[i][RCOMP];
1028 dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1029 dst[i*3+2] = (GLushort) rgba[i][BCOMP];
1032 case GL_RGBA_INTEGER_EXT:
1034 dst[i*4+0] = (GLushort) rgba[i][RCOMP];
1035 dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1036 dst[i*4+2] = (GLushort) rgba[i][BCOMP];
1037 dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1040 case GL_BGR_INTEGER_EXT:
1042 dst[i*3+0] = (GLushort) rgba[i][BCOMP];
1043 dst[i*3+1] = (GLushort) rgba[i][GCOMP];
1044 dst[i*3+2] = (GLushort) rgba[i][RCOMP];
1047 case GL_BGRA_INTEGER_EXT:
1049 dst[i*4+0] = (GLushort) rgba[i][BCOMP];
1050 dst[i*4+1] = (GLushort) rgba[i][GCOMP];
1051 dst[i*4+2] = (GLushort) rgba[i][RCOMP];
1052 dst[i*4+3] = (GLushort) rgba[i][ACOMP];
1055 case GL_LUMINANCE_INTEGER_EXT:
1057 dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
1060 dst[i*2+1] = (GLushort) rgba[i][ACOMP];
1063 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1065 dst[i] = (GLushort) (rgba[i][RCOMP] +
1073 dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
1074 dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
1078 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1084 GLshort *dst = (GLshort *) dstAddr;
1085 switch (dstFormat) {
1088 dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1092 dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1096 dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1100 dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1104 dst[i] = FLOAT_TO_SHORT(luminance[i]);
1106 case GL_LUMINANCE_ALPHA:
1108 dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
1109 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1114 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1115 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1120 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1121 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1122 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1127 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1128 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1129 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1130 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1135 dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1136 dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1137 dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1142 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1143 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1144 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1145 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1150 dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
1151 dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
1152 dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1153 dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1156 case GL_RED_INTEGER_EXT:
1158 dst[i] = (GLshort) rgba[i][RCOMP];
1161 case GL_GREEN_INTEGER_EXT:
1163 dst[i] = (GLshort) rgba[i][GCOMP];
1166 case GL_BLUE_INTEGER_EXT:
1168 dst[i] = (GLshort) rgba[i][BCOMP];
1171 case GL_ALPHA_INTEGER_EXT:
1173 dst[i] = (GLshort) rgba[i][ACOMP];
1178 dst[i*2+0] = (GLshort) rgba[i][RCOMP];
1179 dst[i*2+1] = (GLshort) rgba[i][GCOMP];
1182 case GL_RGB_INTEGER_EXT:
1184 dst[i*3+0] = (GLshort) rgba[i][RCOMP];
1185 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1186 dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1189 case GL_RGBA_INTEGER_EXT:
1191 dst[i*4+0] = (GLshort) rgba[i][RCOMP];
1192 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1193 dst[i*4+2] = (GLshort) rgba[i][BCOMP];
1194 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1197 case GL_BGR_INTEGER_EXT:
1199 dst[i*3+0] = (GLshort) rgba[i][BCOMP];
1200 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1201 dst[i*3+2] = (GLshort) rgba[i][RCOMP];
1204 case GL_BGRA_INTEGER_EXT:
1206 dst[i*4+0] = (GLshort) rgba[i][BCOMP];
1207 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1208 dst[i*4+2] = (GLshort) rgba[i][RCOMP];
1209 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1212 case GL_LUMINANCE_INTEGER_EXT:
1214 dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
1217 dst[i*2+1] = (GLshort) rgba[i][ACOMP];
1220 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1222 dst[i] = (GLshort) (rgba[i][RCOMP] +
1230 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1231 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1235 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1239 case GL_UNSIGNED_INT:
1241 GLuint *dst = (GLuint *) dstAddr;
1242 switch (dstFormat) {
1245 dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1249 dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1253 dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1257 dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1261 dst[i] = FLOAT_TO_UINT(luminance[i]);
1263 case GL_LUMINANCE_ALPHA:
1265 dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1266 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1271 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1272 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1277 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1278 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1279 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1284 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1285 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1286 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1287 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1292 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1293 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1294 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1299 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1300 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1301 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1302 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1307 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1308 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1309 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1310 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1313 case GL_RED_INTEGER_EXT:
1315 dst[i] = (GLuint) rgba[i][RCOMP];
1318 case GL_GREEN_INTEGER_EXT:
1320 dst[i] = (GLuint) rgba[i][GCOMP];
1323 case GL_BLUE_INTEGER_EXT:
1325 dst[i] = (GLuint) rgba[i][BCOMP];
1328 case GL_ALPHA_INTEGER_EXT:
1330 dst[i] = (GLuint) rgba[i][ACOMP];
1335 dst[i*2+0] = (GLuint) rgba[i][RCOMP];
1336 dst[i*2+1] = (GLuint) rgba[i][GCOMP];
1339 case GL_RGB_INTEGER_EXT:
1341 dst[i*3+0] = (GLuint) rgba[i][RCOMP];
1342 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1343 dst[i*3+2] = (GLuint) rgba[i][BCOMP];
1346 case GL_RGBA_INTEGER_EXT:
1348 dst[i*4+0] = (GLuint) rgba[i][RCOMP];
1349 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1350 dst[i*4+2] = (GLuint) rgba[i][BCOMP];
1351 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1354 case GL_BGR_INTEGER_EXT:
1356 dst[i*3+0] = (GLuint) rgba[i][BCOMP];
1357 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1358 dst[i*3+2] = (GLuint) rgba[i][RCOMP];
1361 case GL_BGRA_INTEGER_EXT:
1363 dst[i*4+0] = (GLuint) rgba[i][BCOMP];
1364 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1365 dst[i*4+2] = (GLuint) rgba[i][RCOMP];
1366 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1369 case GL_LUMINANCE_INTEGER_EXT:
1371 dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
1374 dst[i*2+1] = (GLuint) rgba[i][ACOMP];
1377 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1379 dst[i] = (GLuint) (rgba[i][RCOMP] +
1387 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1388 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1392 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1398 GLint *dst = (GLint *) dstAddr;
1399 switch (dstFormat) {
1402 dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1406 dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1410 dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1414 dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1418 dst[i] = FLOAT_TO_INT(luminance[i]);
1420 case GL_LUMINANCE_ALPHA:
1422 dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1423 dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1428 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1429 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1434 dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1435 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1436 dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1441 dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1442 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1443 dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1444 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1449 dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1450 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1451 dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1456 dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1457 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1458 dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1459 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1464 dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1465 dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1466 dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1467 dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1473 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1474 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1477 case GL_RED_INTEGER_EXT:
1479 dst[i] = (GLint) rgba[i][RCOMP];
1482 case GL_GREEN_INTEGER_EXT:
1484 dst[i] = (GLint) rgba[i][GCOMP];
1487 case GL_BLUE_INTEGER_EXT:
1489 dst[i] = (GLint) rgba[i][BCOMP];
1492 case GL_ALPHA_INTEGER_EXT:
1494 dst[i] = (GLint) rgba[i][ACOMP];
1499 dst[i*2+0] = (GLint) rgba[i][RCOMP];
1500 dst[i*2+1] = (GLint) rgba[i][GCOMP];
1503 case GL_RGB_INTEGER_EXT:
1505 dst[i*3+0] = (GLint) rgba[i][RCOMP];
1506 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1507 dst[i*3+2] = (GLint) rgba[i][BCOMP];
1510 case GL_RGBA_INTEGER_EXT:
1512 dst[i*4+0] = (GLint) rgba[i][RCOMP];
1513 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1514 dst[i*4+2] = (GLint) rgba[i][BCOMP];
1515 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1518 case GL_BGR_INTEGER_EXT:
1520 dst[i*3+0] = (GLint) rgba[i][BCOMP];
1521 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1522 dst[i*3+2] = (GLint) rgba[i][RCOMP];
1525 case GL_BGRA_INTEGER_EXT:
1527 dst[i*4+0] = (GLint) rgba[i][BCOMP];
1528 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1529 dst[i*4+2] = (GLint) rgba[i][RCOMP];
1530 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1533 case GL_LUMINANCE_INTEGER_EXT:
1535 dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
1538 dst[i*2+1] = (GLint) rgba[i][ACOMP];
1541 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1543 dst[i] = (GLint) (rgba[i][RCOMP] +
1549 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1555 GLfloat *dst = (GLfloat *) dstAddr;
1556 switch (dstFormat) {
1559 dst[i] = rgba[i][RCOMP];
1563 dst[i] = rgba[i][GCOMP];
1567 dst[i] = rgba[i][BCOMP];
1571 dst[i] = rgba[i][ACOMP];
1575 dst[i] = luminance[i];
1577 case GL_LUMINANCE_ALPHA:
1579 dst[i*2+0] = luminance[i];
1580 dst[i*2+1] = rgba[i][ACOMP];
1585 dst[i*2+0] = rgba[i][RCOMP];
1586 dst[i*2+1] = rgba[i][GCOMP];
1591 dst[i*3+0] = rgba[i][RCOMP];
1592 dst[i*3+1] = rgba[i][GCOMP];
1593 dst[i*3+2] = rgba[i][BCOMP];
1598 dst[i*4+0] = rgba[i][RCOMP];
1599 dst[i*4+1] = rgba[i][GCOMP];
1600 dst[i*4+2] = rgba[i][BCOMP];
1601 dst[i*4+3] = rgba[i][ACOMP];
1606 dst[i*3+0] = rgba[i][BCOMP];
1607 dst[i*3+1] = rgba[i][GCOMP];
1608 dst[i*3+2] = rgba[i][RCOMP];
1613 dst[i*4+0] = rgba[i][BCOMP];
1614 dst[i*4+1] = rgba[i][GCOMP];
1615 dst[i*4+2] = rgba[i][RCOMP];
1616 dst[i*4+3] = rgba[i][ACOMP];
1621 dst[i*4+0] = rgba[i][ACOMP];
1622 dst[i*4+1] = rgba[i][BCOMP];
1623 dst[i*4+2] = rgba[i][GCOMP];
1624 dst[i*4+3] = rgba[i][RCOMP];
1630 dst[i*2+0] = rgba[i][RCOMP];
1631 dst[i*2+1] = rgba[i][GCOMP];
1635 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1639 case GL_HALF_FLOAT_ARB:
1641 GLhalfARB *dst = (GLhalfARB *) dstAddr;
1642 switch (dstFormat) {
1645 dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
1649 dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
1653 dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
1657 dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
1661 dst[i] = _mesa_float_to_half(luminance[i]);
1663 case GL_LUMINANCE_ALPHA:
1665 dst[i*2+0] = _mesa_float_to_half(luminance[i]);
1666 dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
1671 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1672 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1677 dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1678 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1679 dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1684 dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1685 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1686 dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1687 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1692 dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1693 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1694 dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1699 dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1700 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1701 dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1702 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1707 dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
1708 dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
1709 dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
1710 dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
1716 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1717 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1721 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1725 case GL_UNSIGNED_BYTE_3_3_2:
1726 if (dstFormat == GL_RGB) {
1727 GLubyte *dst = (GLubyte *) dstAddr;
1729 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
1730 | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
1731 | (IROUND(rgba[i][BCOMP] * 3.0F) );
1735 case GL_UNSIGNED_BYTE_2_3_3_REV:
1736 if (dstFormat == GL_RGB) {
1737 GLubyte *dst = (GLubyte *) dstAddr;
1739 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) )
1740 | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
1741 | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
1745 case GL_UNSIGNED_SHORT_5_6_5:
1746 if (dstFormat == GL_RGB) {
1747 GLushort *dst = (GLushort *) dstAddr;
1749 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1750 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1751 | (IROUND(rgba[i][BCOMP] * 31.0F) );
1755 case GL_UNSIGNED_SHORT_5_6_5_REV:
1756 if (dstFormat == GL_RGB) {
1757 GLushort *dst = (GLushort *) dstAddr;
1759 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1760 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1761 | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
1765 case GL_UNSIGNED_SHORT_4_4_4_4:
1766 if (dstFormat == GL_RGBA) {
1767 GLushort *dst = (GLushort *) dstAddr;
1769 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
1770 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1771 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1772 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1775 else if (dstFormat == GL_BGRA) {
1776 GLushort *dst = (GLushort *) dstAddr;
1778 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
1779 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1780 | (IROUND(rgba[i][RCOMP] * 15.0F) << 4)
1781 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1784 else if (dstFormat == GL_ABGR_EXT) {
1785 GLushort *dst = (GLushort *) dstAddr;
1787 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
1788 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1789 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1790 | (IROUND(rgba[i][RCOMP] * 15.0F) );
1794 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1795 if (dstFormat == GL_RGBA) {
1796 GLushort *dst = (GLushort *) dstAddr;
1798 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) )
1799 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1800 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1801 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1804 else if (dstFormat == GL_BGRA) {
1805 GLushort *dst = (GLushort *) dstAddr;
1807 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) )
1808 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1809 | (IROUND(rgba[i][RCOMP] * 15.0F) << 8)
1810 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1813 else if (dstFormat == GL_ABGR_EXT) {
1814 GLushort *dst = (GLushort *) dstAddr;
1816 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) )
1817 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1818 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1819 | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
1823 case GL_UNSIGNED_SHORT_5_5_5_1:
1824 if (dstFormat == GL_RGBA) {
1825 GLushort *dst = (GLushort *) dstAddr;
1827 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1828 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1829 | (IROUND(rgba[i][BCOMP] * 31.0F) << 1)
1830 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1833 else if (dstFormat == GL_BGRA) {
1834 GLushort *dst = (GLushort *) dstAddr;
1836 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
1837 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1838 | (IROUND(rgba[i][RCOMP] * 31.0F) << 1)
1839 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1842 else if (dstFormat == GL_ABGR_EXT) {
1843 GLushort *dst = (GLushort *) dstAddr;
1845 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
1846 | (IROUND(rgba[i][BCOMP] * 31.0F) << 6)
1847 | (IROUND(rgba[i][GCOMP] * 31.0F) << 1)
1848 | (IROUND(rgba[i][RCOMP] * 1.0F) );
1852 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1853 if (dstFormat == GL_RGBA) {
1854 GLushort *dst = (GLushort *) dstAddr;
1856 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1857 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1858 | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
1859 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1862 else if (dstFormat == GL_BGRA) {
1863 GLushort *dst = (GLushort *) dstAddr;
1865 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) )
1866 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1867 | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
1868 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1871 else if (dstFormat == GL_ABGR_EXT) {
1872 GLushort *dst = (GLushort *) dstAddr;
1874 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) )
1875 | (IROUND(rgba[i][BCOMP] * 31.0F) << 5)
1876 | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
1877 | (IROUND(rgba[i][RCOMP] * 1.0F) << 15);
1881 case GL_UNSIGNED_INT_8_8_8_8:
1882 if (dstFormat == GL_RGBA) {
1883 GLuint *dst = (GLuint *) dstAddr;
1885 dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
1886 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1887 | (IROUND(rgba[i][BCOMP] * 255.F) << 8)
1888 | (IROUND(rgba[i][ACOMP] * 255.F) );
1891 else if (dstFormat == GL_BGRA) {
1892 GLuint *dst = (GLuint *) dstAddr;
1894 dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
1895 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1896 | (IROUND(rgba[i][RCOMP] * 255.F) << 8)
1897 | (IROUND(rgba[i][ACOMP] * 255.F) );
1900 else if (dstFormat == GL_ABGR_EXT) {
1901 GLuint *dst = (GLuint *) dstAddr;
1903 dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
1904 | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
1905 | (IROUND(rgba[i][GCOMP] * 255.F) << 8)
1906 | (IROUND(rgba[i][RCOMP] * 255.F) );
1910 case GL_UNSIGNED_INT_8_8_8_8_REV:
1911 if (dstFormat == GL_RGBA) {
1912 GLuint *dst = (GLuint *) dstAddr;
1914 dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F) )
1915 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1916 | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
1917 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1920 else if (dstFormat == GL_BGRA) {
1921 GLuint *dst = (GLuint *) dstAddr;
1923 dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F) )
1924 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1925 | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
1926 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1929 else if (dstFormat == GL_ABGR_EXT) {
1930 GLuint *dst = (GLuint *) dstAddr;
1932 dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F) )
1933 | (IROUND(rgba[i][BCOMP] * 255.0F) << 8)
1934 | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
1935 | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
1939 case GL_UNSIGNED_INT_10_10_10_2:
1940 if (dstFormat == GL_RGBA) {
1941 GLuint *dst = (GLuint *) dstAddr;
1943 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
1944 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1945 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 2)
1946 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1949 else if (dstFormat == GL_BGRA) {
1950 GLuint *dst = (GLuint *) dstAddr;
1952 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
1953 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1954 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 2)
1955 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1958 else if (dstFormat == GL_ABGR_EXT) {
1959 GLuint *dst = (GLuint *) dstAddr;
1961 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
1962 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
1963 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 2)
1964 | (IROUND(rgba[i][RCOMP] * 3.0F) );
1968 case GL_UNSIGNED_INT_2_10_10_10_REV:
1969 if (dstFormat == GL_RGBA) {
1970 GLuint *dst = (GLuint *) dstAddr;
1972 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) )
1973 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1974 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
1975 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1978 else if (dstFormat == GL_BGRA) {
1979 GLuint *dst = (GLuint *) dstAddr;
1981 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) )
1982 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1983 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
1984 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1987 else if (dstFormat == GL_ABGR_EXT) {
1988 GLuint *dst = (GLuint *) dstAddr;
1990 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) )
1991 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
1992 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
1993 | (IROUND(rgba[i][RCOMP] * 3.0F) << 30);
1997 case GL_UNSIGNED_INT_5_9_9_9_REV:
1999 GLuint *dst = (GLuint *) dstAddr;
2000 for (i = 0; i < n; i++) {
2001 dst[i] = float3_to_rgb9e5(rgba[i]);
2005 case GL_UNSIGNED_INT_10F_11F_11F_REV:
2007 GLuint *dst = (GLuint *) dstAddr;
2008 for (i = 0; i < n; i++) {
2009 dst[i] = float3_to_r11g11b10f(rgba[i]);
2014 _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
2019 if (dstPacking->SwapBytes) {
2020 GLint swapSize = _mesa_sizeof_packed_type(dstType);
2021 if (swapSize == 2) {
2022 if (dstPacking->SwapBytes) {
2023 _mesa_swap2((GLushort *) dstAddr, n * comps);
2026 else if (swapSize == 4) {
2027 if (dstPacking->SwapBytes) {
2028 _mesa_swap4((GLuint *) dstAddr, n * comps);
2038 #define SWAP2BYTE(VALUE) \
2040 GLubyte *bytes = (GLubyte *) &(VALUE); \
2041 GLubyte tmp = bytes[0]; \
2042 bytes[0] = bytes[1]; \
2046 #define SWAP4BYTE(VALUE) \
2048 GLubyte *bytes = (GLubyte *) &(VALUE); \
2049 GLubyte tmp = bytes[0]; \
2050 bytes[0] = bytes[3]; \
2053 bytes[1] = bytes[2]; \
2059 extract_uint_indexes(GLuint n, GLuint indexes[],
2060 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2061 const struct gl_pixelstore_attrib *unpack )
2063 ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
2065 ASSERT(srcType == GL_BITMAP ||
2066 srcType == GL_UNSIGNED_BYTE ||
2067 srcType == GL_BYTE ||
2068 srcType == GL_UNSIGNED_SHORT ||
2069 srcType == GL_SHORT ||
2070 srcType == GL_UNSIGNED_INT ||
2071 srcType == GL_INT ||
2072 srcType == GL_UNSIGNED_INT_24_8_EXT ||
2073 srcType == GL_HALF_FLOAT_ARB ||
2074 srcType == GL_FLOAT ||
2075 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
2080 GLubyte *ubsrc = (GLubyte *) src;
2081 if (unpack->LsbFirst) {
2082 GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2084 for (i = 0; i < n; i++) {
2085 indexes[i] = (*ubsrc & mask) ? 1 : 0;
2096 GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2098 for (i = 0; i < n; i++) {
2099 indexes[i] = (*ubsrc & mask) ? 1 : 0;
2111 case GL_UNSIGNED_BYTE:
2114 const GLubyte *s = (const GLubyte *) src;
2115 for (i = 0; i < n; i++)
2122 const GLbyte *s = (const GLbyte *) src;
2123 for (i = 0; i < n; i++)
2127 case GL_UNSIGNED_SHORT:
2130 const GLushort *s = (const GLushort *) src;
2131 if (unpack->SwapBytes) {
2132 for (i = 0; i < n; i++) {
2133 GLushort value = s[i];
2139 for (i = 0; i < n; i++)
2147 const GLshort *s = (const GLshort *) src;
2148 if (unpack->SwapBytes) {
2149 for (i = 0; i < n; i++) {
2150 GLshort value = s[i];
2156 for (i = 0; i < n; i++)
2161 case GL_UNSIGNED_INT:
2164 const GLuint *s = (const GLuint *) src;
2165 if (unpack->SwapBytes) {
2166 for (i = 0; i < n; i++) {
2167 GLuint value = s[i];
2173 for (i = 0; i < n; i++)
2181 const GLint *s = (const GLint *) src;
2182 if (unpack->SwapBytes) {
2183 for (i = 0; i < n; i++) {
2190 for (i = 0; i < n; i++)
2198 const GLfloat *s = (const GLfloat *) src;
2199 if (unpack->SwapBytes) {
2200 for (i = 0; i < n; i++) {
2201 GLfloat value = s[i];
2203 indexes[i] = (GLuint) value;
2207 for (i = 0; i < n; i++)
2208 indexes[i] = (GLuint) s[i];
2212 case GL_HALF_FLOAT_ARB:
2215 const GLhalfARB *s = (const GLhalfARB *) src;
2216 if (unpack->SwapBytes) {
2217 for (i = 0; i < n; i++) {
2218 GLhalfARB value = s[i];
2220 indexes[i] = (GLuint) _mesa_half_to_float(value);
2224 for (i = 0; i < n; i++)
2225 indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
2229 case GL_UNSIGNED_INT_24_8_EXT:
2232 const GLuint *s = (const GLuint *) src;
2233 if (unpack->SwapBytes) {
2234 for (i = 0; i < n; i++) {
2235 GLuint value = s[i];
2237 indexes[i] = value & 0xff; /* lower 8 bits */
2241 for (i = 0; i < n; i++)
2242 indexes[i] = s[i] & 0xff; /* lower 8 bits */
2246 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2249 const GLuint *s = (const GLuint *) src;
2250 if (unpack->SwapBytes) {
2251 for (i = 0; i < n; i++) {
2252 GLuint value = s[i*2+1];
2254 indexes[i] = value & 0xff; /* lower 8 bits */
2258 for (i = 0; i < n; i++)
2259 indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */
2265 _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2272 * Return source/dest RGBA indexes for unpacking pixels.
2275 get_component_mapping(GLenum format,
2287 case GL_RED_INTEGER_EXT:
2289 *gSrc = *bSrc = *aSrc = -1;
2292 case GL_GREEN_INTEGER_EXT:
2294 *rSrc = *bSrc = *aSrc = -1;
2297 case GL_BLUE_INTEGER_EXT:
2299 *rSrc = *gSrc = *aSrc = -1;
2302 case GL_ALPHA_INTEGER_EXT:
2303 *rSrc = *gSrc = *bSrc = -1;
2307 case GL_LUMINANCE_INTEGER_EXT:
2308 *rSrc = *gSrc = *bSrc = 0;
2311 case GL_LUMINANCE_ALPHA:
2312 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2313 *rSrc = *gSrc = *bSrc = 0;
2317 *rSrc = *gSrc = *bSrc = *aSrc = 0;
2331 case GL_RGB_INTEGER:
2342 case GL_BGR_INTEGER:
2353 case GL_RGBA_INTEGER:
2364 case GL_BGRA_INTEGER:
2392 _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
2393 _mesa_lookup_enum_by_nr(format));
2401 * This function extracts floating point RGBA values from arbitrary
2402 * image data. srcFormat and srcType are the format and type parameters
2403 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2405 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2406 * implements the "Conversion to floating point", "Conversion to RGB",
2407 * and "Final Expansion to RGBA" operations.
2409 * Args: n - number of pixels
2410 * rgba - output colors
2411 * srcFormat - format of incoming data
2412 * srcType - data type of incoming data
2413 * src - source data pointer
2414 * swapBytes - perform byteswapping of incoming data?
2417 extract_float_rgba(GLuint n, GLfloat rgba[][4],
2418 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2419 GLboolean swapBytes)
2421 GLint rSrc, gSrc, bSrc, aSrc;
2423 GLint rDst, bDst, gDst, aDst;
2424 GLboolean intFormat;
2425 GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
2427 ASSERT(srcFormat == GL_RED ||
2428 srcFormat == GL_GREEN ||
2429 srcFormat == GL_BLUE ||
2430 srcFormat == GL_ALPHA ||
2431 srcFormat == GL_LUMINANCE ||
2432 srcFormat == GL_LUMINANCE_ALPHA ||
2433 srcFormat == GL_INTENSITY ||
2434 srcFormat == GL_RG ||
2435 srcFormat == GL_RGB ||
2436 srcFormat == GL_BGR ||
2437 srcFormat == GL_RGBA ||
2438 srcFormat == GL_BGRA ||
2439 srcFormat == GL_ABGR_EXT ||
2440 srcFormat == GL_DU8DV8_ATI ||
2441 srcFormat == GL_DUDV_ATI ||
2442 srcFormat == GL_RED_INTEGER_EXT ||
2443 srcFormat == GL_GREEN_INTEGER_EXT ||
2444 srcFormat == GL_BLUE_INTEGER_EXT ||
2445 srcFormat == GL_ALPHA_INTEGER_EXT ||
2446 srcFormat == GL_RG_INTEGER ||
2447 srcFormat == GL_RGB_INTEGER_EXT ||
2448 srcFormat == GL_RGBA_INTEGER_EXT ||
2449 srcFormat == GL_BGR_INTEGER_EXT ||
2450 srcFormat == GL_BGRA_INTEGER_EXT ||
2451 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
2452 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
2454 ASSERT(srcType == GL_UNSIGNED_BYTE ||
2455 srcType == GL_BYTE ||
2456 srcType == GL_UNSIGNED_SHORT ||
2457 srcType == GL_SHORT ||
2458 srcType == GL_UNSIGNED_INT ||
2459 srcType == GL_INT ||
2460 srcType == GL_HALF_FLOAT_ARB ||
2461 srcType == GL_FLOAT ||
2462 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2463 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2464 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2465 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2466 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2467 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2468 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2469 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2470 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2471 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2472 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2473 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
2474 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
2475 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
2477 get_component_mapping(srcFormat,
2478 &rSrc, &gSrc, &bSrc, &aSrc,
2479 &rDst, &gDst, &bDst, &aDst);
2481 stride = _mesa_components_in_format(srcFormat);
2483 intFormat = _mesa_is_integer_format(srcFormat);
2485 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2486 if ((SRC_INDEX) < 0) { \
2489 for (i = 0; i < n; i++) { \
2490 rgba[i][DST_INDEX] = DEFAULT_INT; \
2494 for (i = 0; i < n; i++) { \
2495 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2499 else if (swapBytes) { \
2500 const TYPE *s = (const TYPE *) src; \
2502 for (i = 0; i < n; i++) { \
2503 TYPE value = s[SRC_INDEX]; \
2504 if (sizeof(TYPE) == 2) { \
2507 else if (sizeof(TYPE) == 4) { \
2511 rgba[i][DST_INDEX] = (GLfloat) value; \
2513 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2518 const TYPE *s = (const TYPE *) src; \
2521 for (i = 0; i < n; i++) { \
2522 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2527 for (i = 0; i < n; i++) { \
2528 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2535 case GL_UNSIGNED_BYTE:
2536 PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2537 PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2538 PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2539 PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
2542 PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2543 PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2544 PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2545 PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ);
2547 case GL_UNSIGNED_SHORT:
2548 PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2549 PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2550 PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2551 PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
2554 PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2555 PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2556 PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2557 PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ);
2559 case GL_UNSIGNED_INT:
2560 PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2561 PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2562 PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2563 PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
2566 PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2567 PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2568 PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2569 PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
2572 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2573 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2574 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2575 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
2577 case GL_HALF_FLOAT_ARB:
2578 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2579 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2580 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2581 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
2583 case GL_UNSIGNED_BYTE_3_3_2:
2585 const GLubyte *ubsrc = (const GLubyte *) src;
2592 for (i = 0; i < n; i ++) {
2593 GLubyte p = ubsrc[i];
2594 rgba[i][rDst] = ((p >> 5) ) * rs;
2595 rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
2596 rgba[i][bDst] = ((p ) & 0x3) * bs;
2597 rgba[i][aDst] = 1.0F;
2601 case GL_UNSIGNED_BYTE_2_3_3_REV:
2603 const GLubyte *ubsrc = (const GLubyte *) src;
2610 for (i = 0; i < n; i ++) {
2611 GLubyte p = ubsrc[i];
2612 rgba[i][rDst] = ((p ) & 0x7) * rs;
2613 rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
2614 rgba[i][bDst] = ((p >> 6) ) * bs;
2615 rgba[i][aDst] = 1.0F;
2619 case GL_UNSIGNED_SHORT_5_6_5:
2626 const GLushort *ussrc = (const GLushort *) src;
2628 for (i = 0; i < n; i ++) {
2629 GLushort p = ussrc[i];
2631 rgba[i][rDst] = ((p >> 11) ) * rs;
2632 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2633 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2634 rgba[i][aDst] = 1.0F;
2638 const GLushort *ussrc = (const GLushort *) src;
2640 for (i = 0; i < n; i ++) {
2641 GLushort p = ussrc[i];
2642 rgba[i][rDst] = ((p >> 11) ) * rs;
2643 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2644 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2645 rgba[i][aDst] = 1.0F;
2649 case GL_UNSIGNED_SHORT_5_6_5_REV:
2656 const GLushort *ussrc = (const GLushort *) src;
2658 for (i = 0; i < n; i ++) {
2659 GLushort p = ussrc[i];
2661 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2662 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2663 rgba[i][bDst] = ((p >> 11) ) * bs;
2664 rgba[i][aDst] = 1.0F;
2668 const GLushort *ussrc = (const GLushort *) src;
2670 for (i = 0; i < n; i ++) {
2671 GLushort p = ussrc[i];
2672 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2673 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2674 rgba[i][bDst] = ((p >> 11) ) * bs;
2675 rgba[i][aDst] = 1.0F;
2679 case GL_UNSIGNED_SHORT_4_4_4_4:
2681 rs = gs = bs = as = 1.0F / 15.0F;
2684 const GLushort *ussrc = (const GLushort *) src;
2686 for (i = 0; i < n; i ++) {
2687 GLushort p = ussrc[i];
2689 rgba[i][rDst] = ((p >> 12) ) * rs;
2690 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2691 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2692 rgba[i][aDst] = ((p ) & 0xf) * as;
2696 const GLushort *ussrc = (const GLushort *) src;
2698 for (i = 0; i < n; i ++) {
2699 GLushort p = ussrc[i];
2700 rgba[i][rDst] = ((p >> 12) ) * rs;
2701 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2702 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2703 rgba[i][aDst] = ((p ) & 0xf) * as;
2707 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2709 rs = gs = bs = as = 1.0F / 15.0F;
2712 const GLushort *ussrc = (const GLushort *) src;
2714 for (i = 0; i < n; i ++) {
2715 GLushort p = ussrc[i];
2717 rgba[i][rDst] = ((p ) & 0xf) * rs;
2718 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2719 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2720 rgba[i][aDst] = ((p >> 12) ) * as;
2724 const GLushort *ussrc = (const GLushort *) src;
2726 for (i = 0; i < n; i ++) {
2727 GLushort p = ussrc[i];
2728 rgba[i][rDst] = ((p ) & 0xf) * rs;
2729 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2730 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2731 rgba[i][aDst] = ((p >> 12) ) * as;
2735 case GL_UNSIGNED_SHORT_5_5_5_1:
2737 rs = gs = bs = 1.0F / 31.0F;
2740 const GLushort *ussrc = (const GLushort *) src;
2742 for (i = 0; i < n; i ++) {
2743 GLushort p = ussrc[i];
2745 rgba[i][rDst] = ((p >> 11) ) * rs;
2746 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2747 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2748 rgba[i][aDst] = ((p ) & 0x1) * as;
2752 const GLushort *ussrc = (const GLushort *) src;
2754 for (i = 0; i < n; i ++) {
2755 GLushort p = ussrc[i];
2756 rgba[i][rDst] = ((p >> 11) ) * rs;
2757 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2758 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2759 rgba[i][aDst] = ((p ) & 0x1) * as;
2763 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2765 rs = gs = bs = 1.0F / 31.0F;
2768 const GLushort *ussrc = (const GLushort *) src;
2770 for (i = 0; i < n; i ++) {
2771 GLushort p = ussrc[i];
2773 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2774 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2775 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2776 rgba[i][aDst] = ((p >> 15) ) * as;
2780 const GLushort *ussrc = (const GLushort *) src;
2782 for (i = 0; i < n; i ++) {
2783 GLushort p = ussrc[i];
2784 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2785 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2786 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2787 rgba[i][aDst] = ((p >> 15) ) * as;
2791 case GL_UNSIGNED_INT_8_8_8_8:
2793 const GLuint *uisrc = (const GLuint *) src;
2796 for (i = 0; i < n; i ++) {
2797 GLuint p = uisrc[i];
2798 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2799 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2800 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2801 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2805 for (i = 0; i < n; i ++) {
2806 GLuint p = uisrc[i];
2807 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2808 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2809 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2810 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2815 const GLuint *uisrc = (const GLuint *) src;
2818 for (i = 0; i < n; i ++) {
2819 GLuint p = uisrc[i];
2820 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2821 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2822 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2823 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2827 for (i = 0; i < n; i ++) {
2828 GLuint p = uisrc[i];
2829 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2830 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2831 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2832 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2837 case GL_UNSIGNED_INT_8_8_8_8_REV:
2839 const GLuint *uisrc = (const GLuint *) src;
2842 for (i = 0; i < n; i ++) {
2843 GLuint p = uisrc[i];
2844 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2845 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2846 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2847 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2851 for (i = 0; i < n; i ++) {
2852 GLuint p = uisrc[i];
2853 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2854 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2855 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2856 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2861 const GLuint *uisrc = (const GLuint *) src;
2864 for (i = 0; i < n; i ++) {
2865 GLuint p = uisrc[i];
2866 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2867 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2868 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2869 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2873 for (i = 0; i < n; i ++) {
2874 GLuint p = uisrc[i];
2875 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2876 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2877 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2878 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2883 case GL_UNSIGNED_INT_10_10_10_2:
2885 rs = 1.0F / 1023.0F;
2886 gs = 1.0F / 1023.0F;
2887 bs = 1.0F / 1023.0F;
2891 const GLuint *uisrc = (const GLuint *) src;
2893 for (i = 0; i < n; i ++) {
2894 GLuint p = uisrc[i];
2896 rgba[i][rDst] = ((p >> 22) ) * rs;
2897 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2898 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2899 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2903 const GLuint *uisrc = (const GLuint *) src;
2905 for (i = 0; i < n; i ++) {
2906 GLuint p = uisrc[i];
2907 rgba[i][rDst] = ((p >> 22) ) * rs;
2908 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2909 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2910 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2914 case GL_UNSIGNED_INT_2_10_10_10_REV:
2916 rs = 1.0F / 1023.0F;
2917 gs = 1.0F / 1023.0F;
2918 bs = 1.0F / 1023.0F;
2922 const GLuint *uisrc = (const GLuint *) src;
2924 for (i = 0; i < n; i ++) {
2925 GLuint p = uisrc[i];
2927 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2928 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2929 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2930 rgba[i][aDst] = ((p >> 30) ) * as;
2934 const GLuint *uisrc = (const GLuint *) src;
2936 for (i = 0; i < n; i ++) {
2937 GLuint p = uisrc[i];
2938 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2939 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2940 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2941 rgba[i][aDst] = ((p >> 30) ) * as;
2945 case GL_UNSIGNED_INT_5_9_9_9_REV:
2947 const GLuint *uisrc = (const GLuint *) src;
2950 for (i = 0; i < n; i ++) {
2951 GLuint p = uisrc[i];
2953 rgb9e5_to_float3(p, f);
2954 rgba[i][rDst] = f[0];
2955 rgba[i][gDst] = f[1];
2956 rgba[i][bDst] = f[2];
2957 rgba[i][aDst] = 1.0F;
2961 const GLuint *uisrc = (const GLuint *) src;
2964 for (i = 0; i < n; i ++) {
2965 rgb9e5_to_float3(uisrc[i], f);
2966 rgba[i][rDst] = f[0];
2967 rgba[i][gDst] = f[1];
2968 rgba[i][bDst] = f[2];
2969 rgba[i][aDst] = 1.0F;
2973 case GL_UNSIGNED_INT_10F_11F_11F_REV:
2975 const GLuint *uisrc = (const GLuint *) src;
2978 for (i = 0; i < n; i ++) {
2979 GLuint p = uisrc[i];
2981 r11g11b10f_to_float3(p, f);
2982 rgba[i][rDst] = f[0];
2983 rgba[i][gDst] = f[1];
2984 rgba[i][bDst] = f[2];
2985 rgba[i][aDst] = 1.0F;
2989 const GLuint *uisrc = (const GLuint *) src;
2992 for (i = 0; i < n; i ++) {
2993 r11g11b10f_to_float3(uisrc[i], f);
2994 rgba[i][rDst] = f[0];
2995 rgba[i][gDst] = f[1];
2996 rgba[i][bDst] = f[2];
2997 rgba[i][aDst] = 1.0F;
3002 _mesa_problem(NULL, "bad srcType in extract float data");
3009 static inline GLuint
3010 clamp_float_to_uint(GLfloat f)
3012 return f < 0.0F ? 0 : IROUND(f);
3016 static inline GLuint
3017 clamp_half_to_uint(GLhalfARB h)
3019 GLfloat f = _mesa_half_to_float(h);
3020 return f < 0.0F ? 0 : IROUND(f);
3025 * \sa extract_float_rgba()
3028 extract_uint_rgba(GLuint n, GLuint rgba[][4],
3029 GLenum srcFormat, GLenum srcType, const GLvoid *src,
3030 GLboolean swapBytes)
3032 GLint rSrc, gSrc, bSrc, aSrc;
3034 GLint rDst, bDst, gDst, aDst;
3036 ASSERT(srcFormat == GL_RED ||
3037 srcFormat == GL_GREEN ||
3038 srcFormat == GL_BLUE ||
3039 srcFormat == GL_ALPHA ||
3040 srcFormat == GL_LUMINANCE ||
3041 srcFormat == GL_LUMINANCE_ALPHA ||
3042 srcFormat == GL_INTENSITY ||
3043 srcFormat == GL_RG ||
3044 srcFormat == GL_RGB ||
3045 srcFormat == GL_BGR ||
3046 srcFormat == GL_RGBA ||
3047 srcFormat == GL_BGRA ||
3048 srcFormat == GL_ABGR_EXT ||
3049 srcFormat == GL_DU8DV8_ATI ||
3050 srcFormat == GL_DUDV_ATI ||
3051 srcFormat == GL_RED_INTEGER_EXT ||
3052 srcFormat == GL_RG_INTEGER ||
3053 srcFormat == GL_GREEN_INTEGER_EXT ||
3054 srcFormat == GL_BLUE_INTEGER_EXT ||
3055 srcFormat == GL_ALPHA_INTEGER_EXT ||
3056 srcFormat == GL_RGB_INTEGER_EXT ||
3057 srcFormat == GL_RGBA_INTEGER_EXT ||
3058 srcFormat == GL_BGR_INTEGER_EXT ||
3059 srcFormat == GL_BGRA_INTEGER_EXT ||
3060 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3061 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
3063 ASSERT(srcType == GL_UNSIGNED_BYTE ||
3064 srcType == GL_BYTE ||
3065 srcType == GL_UNSIGNED_SHORT ||
3066 srcType == GL_SHORT ||
3067 srcType == GL_UNSIGNED_INT ||
3068 srcType == GL_INT ||
3069 srcType == GL_HALF_FLOAT_ARB ||
3070 srcType == GL_FLOAT ||
3071 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3072 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3073 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3074 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3075 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3076 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3077 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3078 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3079 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3080 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3081 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3082 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3083 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3084 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3086 get_component_mapping(srcFormat,
3087 &rSrc, &gSrc, &bSrc, &aSrc,
3088 &rDst, &gDst, &bDst, &aDst);
3090 stride = _mesa_components_in_format(srcFormat);
3092 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3093 if ((SRC_INDEX) < 0) { \
3095 for (i = 0; i < n; i++) { \
3096 rgba[i][DST_INDEX] = DEFAULT; \
3099 else if (swapBytes) { \
3100 const TYPE *s = (const TYPE *) src; \
3102 for (i = 0; i < n; i++) { \
3103 TYPE value = s[SRC_INDEX]; \
3104 if (sizeof(TYPE) == 2) { \
3107 else if (sizeof(TYPE) == 4) { \
3110 rgba[i][DST_INDEX] = CONVERSION(value); \
3115 const TYPE *s = (const TYPE *) src; \
3117 for (i = 0; i < n; i++) { \
3118 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3124 case GL_UNSIGNED_BYTE:
3125 PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
3126 PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
3127 PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
3128 PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
3131 PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint));
3132 PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint));
3133 PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint));
3134 PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint));
3136 case GL_UNSIGNED_SHORT:
3137 PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
3138 PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
3139 PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
3140 PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
3143 PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint));
3144 PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint));
3145 PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint));
3146 PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint));
3148 case GL_UNSIGNED_INT:
3149 PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
3150 PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
3151 PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
3152 PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
3155 PROCESS(rSrc, RCOMP, 0, GLint, (GLuint));
3156 PROCESS(gSrc, GCOMP, 0, GLint, (GLuint));
3157 PROCESS(bSrc, BCOMP, 0, GLint, (GLuint));
3158 PROCESS(aSrc, ACOMP, 1, GLint, (GLuint));
3161 PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
3162 PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
3163 PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
3164 PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
3166 case GL_HALF_FLOAT_ARB:
3167 PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
3168 PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
3169 PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
3170 PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
3172 case GL_UNSIGNED_BYTE_3_3_2:
3174 const GLubyte *ubsrc = (const GLubyte *) src;
3176 for (i = 0; i < n; i ++) {
3177 GLubyte p = ubsrc[i];
3178 rgba[i][rDst] = ((p >> 5) );
3179 rgba[i][gDst] = ((p >> 2) & 0x7);
3180 rgba[i][bDst] = ((p ) & 0x3);
3185 case GL_UNSIGNED_BYTE_2_3_3_REV:
3187 const GLubyte *ubsrc = (const GLubyte *) src;
3189 for (i = 0; i < n; i ++) {
3190 GLubyte p = ubsrc[i];
3191 rgba[i][rDst] = ((p ) & 0x7);
3192 rgba[i][gDst] = ((p >> 3) & 0x7);
3193 rgba[i][bDst] = ((p >> 6) );
3198 case GL_UNSIGNED_SHORT_5_6_5:
3200 const GLushort *ussrc = (const GLushort *) src;
3202 for (i = 0; i < n; i ++) {
3203 GLushort p = ussrc[i];
3205 rgba[i][rDst] = ((p >> 11) );
3206 rgba[i][gDst] = ((p >> 5) & 0x3f);
3207 rgba[i][bDst] = ((p ) & 0x1f);
3212 const GLushort *ussrc = (const GLushort *) src;
3214 for (i = 0; i < n; i ++) {
3215 GLushort p = ussrc[i];
3216 rgba[i][rDst] = ((p >> 11) );
3217 rgba[i][gDst] = ((p >> 5) & 0x3f);
3218 rgba[i][bDst] = ((p ) & 0x1f);
3223 case GL_UNSIGNED_SHORT_5_6_5_REV:
3225 const GLushort *ussrc = (const GLushort *) src;
3227 for (i = 0; i < n; i ++) {
3228 GLushort p = ussrc[i];
3230 rgba[i][rDst] = ((p ) & 0x1f);
3231 rgba[i][gDst] = ((p >> 5) & 0x3f);
3232 rgba[i][bDst] = ((p >> 11) );
3237 const GLushort *ussrc = (const GLushort *) src;
3239 for (i = 0; i < n; i ++) {
3240 GLushort p = ussrc[i];
3241 rgba[i][rDst] = ((p ) & 0x1f);
3242 rgba[i][gDst] = ((p >> 5) & 0x3f);
3243 rgba[i][bDst] = ((p >> 11) );
3248 case GL_UNSIGNED_SHORT_4_4_4_4:
3250 const GLushort *ussrc = (const GLushort *) src;
3252 for (i = 0; i < n; i ++) {
3253 GLushort p = ussrc[i];
3255 rgba[i][rDst] = ((p >> 12) );
3256 rgba[i][gDst] = ((p >> 8) & 0xf);
3257 rgba[i][bDst] = ((p >> 4) & 0xf);
3258 rgba[i][aDst] = ((p ) & 0xf);
3262 const GLushort *ussrc = (const GLushort *) src;
3264 for (i = 0; i < n; i ++) {
3265 GLushort p = ussrc[i];
3266 rgba[i][rDst] = ((p >> 12) );
3267 rgba[i][gDst] = ((p >> 8) & 0xf);
3268 rgba[i][bDst] = ((p >> 4) & 0xf);
3269 rgba[i][aDst] = ((p ) & 0xf);
3273 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3275 const GLushort *ussrc = (const GLushort *) src;
3277 for (i = 0; i < n; i ++) {
3278 GLushort p = ussrc[i];
3280 rgba[i][rDst] = ((p ) & 0xf);
3281 rgba[i][gDst] = ((p >> 4) & 0xf);
3282 rgba[i][bDst] = ((p >> 8) & 0xf);
3283 rgba[i][aDst] = ((p >> 12) );
3287 const GLushort *ussrc = (const GLushort *) src;
3289 for (i = 0; i < n; i ++) {
3290 GLushort p = ussrc[i];
3291 rgba[i][rDst] = ((p ) & 0xf);
3292 rgba[i][gDst] = ((p >> 4) & 0xf);
3293 rgba[i][bDst] = ((p >> 8) & 0xf);
3294 rgba[i][aDst] = ((p >> 12) );
3298 case GL_UNSIGNED_SHORT_5_5_5_1:
3300 const GLushort *ussrc = (const GLushort *) src;
3302 for (i = 0; i < n; i ++) {
3303 GLushort p = ussrc[i];
3305 rgba[i][rDst] = ((p >> 11) );
3306 rgba[i][gDst] = ((p >> 6) & 0x1f);
3307 rgba[i][bDst] = ((p >> 1) & 0x1f);
3308 rgba[i][aDst] = ((p ) & 0x1 );
3312 const GLushort *ussrc = (const GLushort *) src;
3314 for (i = 0; i < n; i ++) {
3315 GLushort p = ussrc[i];
3316 rgba[i][rDst] = ((p >> 11) );
3317 rgba[i][gDst] = ((p >> 6) & 0x1f);
3318 rgba[i][bDst] = ((p >> 1) & 0x1f);
3319 rgba[i][aDst] = ((p ) & 0x1 );
3323 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3325 const GLushort *ussrc = (const GLushort *) src;
3327 for (i = 0; i < n; i ++) {
3328 GLushort p = ussrc[i];
3330 rgba[i][rDst] = ((p ) & 0x1f);
3331 rgba[i][gDst] = ((p >> 5) & 0x1f);
3332 rgba[i][bDst] = ((p >> 10) & 0x1f);
3333 rgba[i][aDst] = ((p >> 15) );
3337 const GLushort *ussrc = (const GLushort *) src;
3339 for (i = 0; i < n; i ++) {
3340 GLushort p = ussrc[i];
3341 rgba[i][rDst] = ((p ) & 0x1f);
3342 rgba[i][gDst] = ((p >> 5) & 0x1f);
3343 rgba[i][bDst] = ((p >> 10) & 0x1f);
3344 rgba[i][aDst] = ((p >> 15) );
3348 case GL_UNSIGNED_INT_8_8_8_8:
3350 const GLuint *uisrc = (const GLuint *) src;
3352 for (i = 0; i < n; i ++) {
3353 GLuint p = uisrc[i];
3354 rgba[i][rDst] = ((p ) & 0xff);
3355 rgba[i][gDst] = ((p >> 8) & 0xff);
3356 rgba[i][bDst] = ((p >> 16) & 0xff);
3357 rgba[i][aDst] = ((p >> 24) );
3361 const GLuint *uisrc = (const GLuint *) src;
3363 for (i = 0; i < n; i ++) {
3364 GLuint p = uisrc[i];
3365 rgba[i][rDst] = ((p >> 24) );
3366 rgba[i][gDst] = ((p >> 16) & 0xff);
3367 rgba[i][bDst] = ((p >> 8) & 0xff);
3368 rgba[i][aDst] = ((p ) & 0xff);
3372 case GL_UNSIGNED_INT_8_8_8_8_REV:
3374 const GLuint *uisrc = (const GLuint *) src;
3376 for (i = 0; i < n; i ++) {
3377 GLuint p = uisrc[i];
3378 rgba[i][rDst] = ((p >> 24) );
3379 rgba[i][gDst] = ((p >> 16) & 0xff);
3380 rgba[i][bDst] = ((p >> 8) & 0xff);
3381 rgba[i][aDst] = ((p ) & 0xff);
3385 const GLuint *uisrc = (const GLuint *) src;
3387 for (i = 0; i < n; i ++) {
3388 GLuint p = uisrc[i];
3389 rgba[i][rDst] = ((p ) & 0xff);
3390 rgba[i][gDst] = ((p >> 8) & 0xff);
3391 rgba[i][bDst] = ((p >> 16) & 0xff);
3392 rgba[i][aDst] = ((p >> 24) );
3396 case GL_UNSIGNED_INT_10_10_10_2:
3398 const GLuint *uisrc = (const GLuint *) src;
3400 for (i = 0; i < n; i ++) {
3401 GLuint p = uisrc[i];
3403 rgba[i][rDst] = ((p >> 22) );
3404 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3405 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3406 rgba[i][aDst] = ((p ) & 0x3 );
3410 const GLuint *uisrc = (const GLuint *) src;
3412 for (i = 0; i < n; i ++) {
3413 GLuint p = uisrc[i];
3414 rgba[i][rDst] = ((p >> 22) );
3415 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3416 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3417 rgba[i][aDst] = ((p ) & 0x3 );
3421 case GL_UNSIGNED_INT_2_10_10_10_REV:
3423 const GLuint *uisrc = (const GLuint *) src;
3425 for (i = 0; i < n; i ++) {
3426 GLuint p = uisrc[i];
3428 rgba[i][rDst] = ((p ) & 0x3ff);
3429 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3430 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3431 rgba[i][aDst] = ((p >> 30) );
3435 const GLuint *uisrc = (const GLuint *) src;
3437 for (i = 0; i < n; i ++) {
3438 GLuint p = uisrc[i];
3439 rgba[i][rDst] = ((p ) & 0x3ff);
3440 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3441 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3442 rgba[i][aDst] = ((p >> 30) );
3446 case GL_UNSIGNED_INT_5_9_9_9_REV:
3448 const GLuint *uisrc = (const GLuint *) src;
3451 for (i = 0; i < n; i ++) {
3452 GLuint p = uisrc[i];
3454 rgb9e5_to_float3(p, f);
3455 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3456 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3457 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3462 const GLuint *uisrc = (const GLuint *) src;
3465 for (i = 0; i < n; i ++) {
3466 GLuint p = uisrc[i];
3467 rgb9e5_to_float3(p, f);
3468 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3469 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3470 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3475 case GL_UNSIGNED_INT_10F_11F_11F_REV:
3477 const GLuint *uisrc = (const GLuint *) src;
3480 for (i = 0; i < n; i ++) {
3481 GLuint p = uisrc[i];
3483 r11g11b10f_to_float3(p, f);
3484 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3485 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3486 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3491 const GLuint *uisrc = (const GLuint *) src;
3494 for (i = 0; i < n; i ++) {
3495 GLuint p = uisrc[i];
3496 r11g11b10f_to_float3(p, f);
3497 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3498 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3499 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3505 _mesa_problem(NULL, "bad srcType in extract uint data");
3514 * Unpack a row of color image data from a client buffer according to
3515 * the pixel unpacking parameters.
3516 * Return GLubyte values in the specified dest image format.
3517 * This is used by glDrawPixels and glTexImage?D().
3518 * \param ctx - the context
3519 * n - number of pixels in the span
3520 * dstFormat - format of destination color array
3521 * dest - the destination color array
3522 * srcFormat - source image format
3523 * srcType - source image data type
3524 * source - source image pointer
3525 * srcPacking - pixel unpacking parameters
3526 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3528 * XXX perhaps expand this to process whole images someday.
3531 _mesa_unpack_color_span_ubyte(struct gl_context *ctx,
3532 GLuint n, GLenum dstFormat, GLubyte dest[],
3533 GLenum srcFormat, GLenum srcType,
3534 const GLvoid *source,
3535 const struct gl_pixelstore_attrib *srcPacking,
3536 GLbitfield transferOps )
3538 GLboolean intFormat = _mesa_is_integer_format(srcFormat);
3539 ASSERT(dstFormat == GL_ALPHA ||
3540 dstFormat == GL_LUMINANCE ||
3541 dstFormat == GL_LUMINANCE_ALPHA ||
3542 dstFormat == GL_INTENSITY ||
3543 dstFormat == GL_RED ||
3544 dstFormat == GL_RG ||
3545 dstFormat == GL_RGB ||
3546 dstFormat == GL_RGBA);
3548 ASSERT(srcFormat == GL_RED ||
3549 srcFormat == GL_GREEN ||
3550 srcFormat == GL_BLUE ||
3551 srcFormat == GL_ALPHA ||
3552 srcFormat == GL_LUMINANCE ||
3553 srcFormat == GL_LUMINANCE_ALPHA ||
3554 srcFormat == GL_INTENSITY ||
3555 srcFormat == GL_RG ||
3556 srcFormat == GL_RGB ||
3557 srcFormat == GL_BGR ||
3558 srcFormat == GL_RGBA ||
3559 srcFormat == GL_BGRA ||
3560 srcFormat == GL_ABGR_EXT ||
3561 srcFormat == GL_COLOR_INDEX);
3563 ASSERT(srcType == GL_BITMAP ||
3564 srcType == GL_UNSIGNED_BYTE ||
3565 srcType == GL_BYTE ||
3566 srcType == GL_UNSIGNED_SHORT ||
3567 srcType == GL_SHORT ||
3568 srcType == GL_UNSIGNED_INT ||
3569 srcType == GL_INT ||
3570 srcType == GL_HALF_FLOAT_ARB ||
3571 srcType == GL_FLOAT ||
3572 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3573 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3574 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3575 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3576 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3577 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3578 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3579 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3580 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3581 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3582 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3583 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3584 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3585 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3587 /* EXT_texture_integer specifies no transfer ops on integer
3588 * types in the resolved issues section. Just set them to 0
3589 * for integer surfaces.
3594 /* Try simple cases first */
3595 if (transferOps == 0) {
3596 if (srcType == GL_UNSIGNED_BYTE) {
3597 if (dstFormat == GL_RGBA) {
3598 if (srcFormat == GL_RGBA) {
3599 memcpy( dest, source, n * 4 * sizeof(GLubyte) );
3602 else if (srcFormat == GL_RGB) {
3604 const GLubyte *src = (const GLubyte *) source;
3605 GLubyte *dst = dest;
3606 for (i = 0; i < n; i++) {
3617 else if (dstFormat == GL_RGB) {
3618 if (srcFormat == GL_RGB) {
3619 memcpy( dest, source, n * 3 * sizeof(GLubyte) );
3622 else if (srcFormat == GL_RGBA) {
3624 const GLubyte *src = (const GLubyte *) source;
3625 GLubyte *dst = dest;
3626 for (i = 0; i < n; i++) {
3636 else if (dstFormat == srcFormat) {
3637 GLint comps = _mesa_components_in_format(srcFormat);
3639 memcpy( dest, source, n * comps * sizeof(GLubyte) );
3646 /* general solution begins here */
3648 GLint dstComponents;
3649 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3650 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3653 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3657 dstComponents = _mesa_components_in_format( dstFormat );
3658 /* source & dest image formats should have been error checked by now */
3659 assert(dstComponents > 0);
3662 * Extract image data and convert to RGBA floats
3664 if (srcFormat == GL_COLOR_INDEX) {
3665 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3668 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3673 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3676 /* Convert indexes to RGBA */
3677 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3678 _mesa_shift_and_offset_ci(ctx, n, indexes);
3680 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3682 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3683 * with color indexes.
3685 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3690 /* non-color index data */
3691 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3692 srcPacking->SwapBytes);
3695 /* Need to clamp if returning GLubytes */
3696 transferOps |= IMAGE_CLAMP_BIT;
3699 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3702 get_component_indexes(dstFormat,
3703 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3705 /* Now return the GLubyte data in the requested dstFormat */
3707 GLubyte *dst = dest;
3709 for (i = 0; i < n; i++) {
3710 CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]);
3711 dst += dstComponents;
3716 GLubyte *dst = dest;
3718 for (i = 0; i < n; i++) {
3719 CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]);
3720 dst += dstComponents;
3725 GLubyte *dst = dest;
3727 for (i = 0; i < n; i++) {
3728 CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]);
3729 dst += dstComponents;
3734 GLubyte *dst = dest;
3736 for (i = 0; i < n; i++) {
3737 CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]);
3738 dst += dstComponents;
3743 GLubyte *dst = dest;
3746 assert(dstComponents == 1);
3747 for (i = 0; i < n; i++) {
3748 /* Intensity comes from red channel */
3749 CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]);
3754 GLubyte *dst = dest;
3757 for (i = 0; i < n; i++) {
3758 /* Luminance comes from red channel */
3759 CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]);
3760 dst += dstComponents;
3770 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3771 * instead of GLubyte.
3774 _mesa_unpack_color_span_float( struct gl_context *ctx,
3775 GLuint n, GLenum dstFormat, GLfloat dest[],
3776 GLenum srcFormat, GLenum srcType,
3777 const GLvoid *source,
3778 const struct gl_pixelstore_attrib *srcPacking,
3779 GLbitfield transferOps )
3781 ASSERT(dstFormat == GL_ALPHA ||
3782 dstFormat == GL_LUMINANCE ||
3783 dstFormat == GL_LUMINANCE_ALPHA ||
3784 dstFormat == GL_INTENSITY ||
3785 dstFormat == GL_RED ||
3786 dstFormat == GL_RG ||
3787 dstFormat == GL_RGB ||
3788 dstFormat == GL_RGBA);
3790 ASSERT(srcFormat == GL_RED ||
3791 srcFormat == GL_GREEN ||
3792 srcFormat == GL_BLUE ||
3793 srcFormat == GL_ALPHA ||
3794 srcFormat == GL_LUMINANCE ||
3795 srcFormat == GL_LUMINANCE_ALPHA ||
3796 srcFormat == GL_INTENSITY ||
3797 srcFormat == GL_RG ||
3798 srcFormat == GL_RGB ||
3799 srcFormat == GL_BGR ||
3800 srcFormat == GL_RGBA ||
3801 srcFormat == GL_BGRA ||
3802 srcFormat == GL_ABGR_EXT ||
3803 srcFormat == GL_RED_INTEGER_EXT ||
3804 srcFormat == GL_GREEN_INTEGER_EXT ||
3805 srcFormat == GL_BLUE_INTEGER_EXT ||
3806 srcFormat == GL_ALPHA_INTEGER_EXT ||
3807 srcFormat == GL_RG_INTEGER ||
3808 srcFormat == GL_RGB_INTEGER_EXT ||
3809 srcFormat == GL_RGBA_INTEGER_EXT ||
3810 srcFormat == GL_BGR_INTEGER_EXT ||
3811 srcFormat == GL_BGRA_INTEGER_EXT ||
3812 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3813 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
3814 srcFormat == GL_COLOR_INDEX);
3816 ASSERT(srcType == GL_BITMAP ||
3817 srcType == GL_UNSIGNED_BYTE ||
3818 srcType == GL_BYTE ||
3819 srcType == GL_UNSIGNED_SHORT ||
3820 srcType == GL_SHORT ||
3821 srcType == GL_UNSIGNED_INT ||
3822 srcType == GL_INT ||
3823 srcType == GL_HALF_FLOAT_ARB ||
3824 srcType == GL_FLOAT ||
3825 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3826 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3827 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3828 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3829 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3830 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3831 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3832 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3833 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3834 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3835 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3836 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3837 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3838 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3840 /* general solution, no special cases, yet */
3842 GLint dstComponents;
3843 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3844 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3845 GLboolean intFormat = _mesa_is_integer_format(srcFormat);
3848 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3852 dstComponents = _mesa_components_in_format( dstFormat );
3853 /* source & dest image formats should have been error checked by now */
3854 assert(dstComponents > 0);
3856 /* EXT_texture_integer specifies no transfer ops on integer
3857 * types in the resolved issues section. Just set them to 0
3858 * for integer surfaces.
3864 * Extract image data and convert to RGBA floats
3866 if (srcFormat == GL_COLOR_INDEX) {
3867 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3870 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3875 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3878 /* Convert indexes to RGBA */
3879 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3880 _mesa_shift_and_offset_ci(ctx, n, indexes);
3882 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3884 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3885 * with color indexes.
3887 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3892 /* non-color index data */
3893 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3894 srcPacking->SwapBytes);
3898 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3901 get_component_indexes(dstFormat,
3902 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3904 /* Now pack results in the requested dstFormat */
3906 GLfloat *dst = dest;
3908 for (i = 0; i < n; i++) {
3909 dst[rDst] = rgba[i][RCOMP];
3910 dst += dstComponents;
3915 GLfloat *dst = dest;
3917 for (i = 0; i < n; i++) {
3918 dst[gDst] = rgba[i][GCOMP];
3919 dst += dstComponents;
3924 GLfloat *dst = dest;
3926 for (i = 0; i < n; i++) {
3927 dst[bDst] = rgba[i][BCOMP];
3928 dst += dstComponents;
3933 GLfloat *dst = dest;
3935 for (i = 0; i < n; i++) {
3936 dst[aDst] = rgba[i][ACOMP];
3937 dst += dstComponents;
3942 GLfloat *dst = dest;
3945 assert(dstComponents == 1);
3946 for (i = 0; i < n; i++) {
3947 /* Intensity comes from red channel */
3948 dst[i] = rgba[i][RCOMP];
3953 GLfloat *dst = dest;
3956 for (i = 0; i < n; i++) {
3957 /* Luminance comes from red channel */
3958 dst[0] = rgba[i][RCOMP];
3959 dst += dstComponents;
3969 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3970 * instead of GLubyte.
3971 * No pixel transfer ops are applied.
3974 _mesa_unpack_color_span_uint(struct gl_context *ctx,
3975 GLuint n, GLenum dstFormat, GLuint *dest,
3976 GLenum srcFormat, GLenum srcType,
3977 const GLvoid *source,
3978 const struct gl_pixelstore_attrib *srcPacking)
3980 GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
3983 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3987 ASSERT(dstFormat == GL_ALPHA ||
3988 dstFormat == GL_LUMINANCE ||
3989 dstFormat == GL_LUMINANCE_ALPHA ||
3990 dstFormat == GL_INTENSITY ||
3991 dstFormat == GL_RED ||
3992 dstFormat == GL_RG ||
3993 dstFormat == GL_RGB ||
3994 dstFormat == GL_RGBA);
3996 ASSERT(srcFormat == GL_RED ||
3997 srcFormat == GL_GREEN ||
3998 srcFormat == GL_BLUE ||
3999 srcFormat == GL_ALPHA ||
4000 srcFormat == GL_LUMINANCE ||
4001 srcFormat == GL_LUMINANCE_ALPHA ||
4002 srcFormat == GL_INTENSITY ||
4003 srcFormat == GL_RG ||
4004 srcFormat == GL_RGB ||
4005 srcFormat == GL_BGR ||
4006 srcFormat == GL_RGBA ||
4007 srcFormat == GL_BGRA ||
4008 srcFormat == GL_ABGR_EXT ||
4009 srcFormat == GL_RED_INTEGER_EXT ||
4010 srcFormat == GL_GREEN_INTEGER_EXT ||
4011 srcFormat == GL_BLUE_INTEGER_EXT ||
4012 srcFormat == GL_ALPHA_INTEGER_EXT ||
4013 srcFormat == GL_RG_INTEGER ||
4014 srcFormat == GL_RGB_INTEGER_EXT ||
4015 srcFormat == GL_RGBA_INTEGER_EXT ||
4016 srcFormat == GL_BGR_INTEGER_EXT ||
4017 srcFormat == GL_BGRA_INTEGER_EXT ||
4018 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
4019 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
4021 ASSERT(srcType == GL_UNSIGNED_BYTE ||
4022 srcType == GL_BYTE ||
4023 srcType == GL_UNSIGNED_SHORT ||
4024 srcType == GL_SHORT ||
4025 srcType == GL_UNSIGNED_INT ||
4026 srcType == GL_INT ||
4027 srcType == GL_HALF_FLOAT_ARB ||
4028 srcType == GL_FLOAT ||
4029 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4030 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4031 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4032 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4033 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4034 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4035 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4036 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4037 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4038 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4039 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4040 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4041 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4042 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4045 /* Extract image data as uint[4] pixels */
4046 extract_uint_rgba(n, rgba, srcFormat, srcType, source,
4047 srcPacking->SwapBytes);
4049 if (dstFormat == GL_RGBA) {
4051 memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
4055 GLint rDst, gDst, bDst, aDst, lDst, iDst;
4056 GLint dstComponents = _mesa_components_in_format( dstFormat );
4058 assert(dstComponents > 0);
4060 get_component_indexes(dstFormat,
4061 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4063 /* Now pack values in the requested dest format */
4067 for (i = 0; i < n; i++) {
4068 dst[rDst] = rgba[i][RCOMP];
4069 dst += dstComponents;
4076 for (i = 0; i < n; i++) {
4077 dst[gDst] = rgba[i][GCOMP];
4078 dst += dstComponents;
4085 for (i = 0; i < n; i++) {
4086 dst[bDst] = rgba[i][BCOMP];
4087 dst += dstComponents;
4094 for (i = 0; i < n; i++) {
4095 dst[aDst] = rgba[i][ACOMP];
4096 dst += dstComponents;
4104 assert(dstComponents == 1);
4105 for (i = 0; i < n; i++) {
4106 /* Intensity comes from red channel */
4107 dst[i] = rgba[i][RCOMP];
4115 for (i = 0; i < n; i++) {
4116 /* Luminance comes from red channel */
4117 dst[0] = rgba[i][RCOMP];
4118 dst += dstComponents;
4129 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4130 * directly return GLbyte data, no transfer ops apply.
4133 _mesa_unpack_dudv_span_byte( struct gl_context *ctx,
4134 GLuint n, GLenum dstFormat, GLbyte dest[],
4135 GLenum srcFormat, GLenum srcType,
4136 const GLvoid *source,
4137 const struct gl_pixelstore_attrib *srcPacking,
4138 GLbitfield transferOps )
4140 ASSERT(dstFormat == GL_DUDV_ATI);
4141 ASSERT(srcFormat == GL_DUDV_ATI ||
4142 srcFormat == GL_DU8DV8_ATI);
4144 ASSERT(srcType == GL_UNSIGNED_BYTE ||
4145 srcType == GL_BYTE ||
4146 srcType == GL_UNSIGNED_SHORT ||
4147 srcType == GL_SHORT ||
4148 srcType == GL_UNSIGNED_INT ||
4149 srcType == GL_INT ||
4150 srcType == GL_HALF_FLOAT_ARB ||
4151 srcType == GL_FLOAT);
4153 /* general solution */
4155 GLint dstComponents;
4158 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
4161 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4165 dstComponents = _mesa_components_in_format( dstFormat );
4166 /* source & dest image formats should have been error checked by now */
4167 assert(dstComponents > 0);
4170 * Extract image data and convert to RGBA floats
4172 extract_float_rgba(n, rgba, srcFormat, srcType, source,
4173 srcPacking->SwapBytes);
4176 /* Now determine which color channels we need to produce.
4177 * And determine the dest index (offset) within each color tuple.
4180 /* Now pack results in the requested dstFormat */
4181 for (i = 0; i < n; i++) {
4182 /* not sure - need clamp[-1,1] here? */
4183 dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
4184 dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
4185 dst += dstComponents;
4193 * Unpack a row of color index data from a client buffer according to
4194 * the pixel unpacking parameters.
4195 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4197 * Args: ctx - the context
4198 * n - number of pixels
4199 * dstType - destination data type
4200 * dest - destination array
4201 * srcType - source pixel type
4202 * source - source data pointer
4203 * srcPacking - pixel unpacking parameters
4204 * transferOps - the pixel transfer operations to apply
4207 _mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
4208 GLenum dstType, GLvoid *dest,
4209 GLenum srcType, const GLvoid *source,
4210 const struct gl_pixelstore_attrib *srcPacking,
4211 GLbitfield transferOps )
4213 ASSERT(srcType == GL_BITMAP ||
4214 srcType == GL_UNSIGNED_BYTE ||
4215 srcType == GL_BYTE ||
4216 srcType == GL_UNSIGNED_SHORT ||
4217 srcType == GL_SHORT ||
4218 srcType == GL_UNSIGNED_INT ||
4219 srcType == GL_INT ||
4220 srcType == GL_HALF_FLOAT_ARB ||
4221 srcType == GL_FLOAT);
4223 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4224 dstType == GL_UNSIGNED_SHORT ||
4225 dstType == GL_UNSIGNED_INT);
4228 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4231 * Try simple cases first
4233 if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
4234 && dstType == GL_UNSIGNED_BYTE) {
4235 memcpy(dest, source, n * sizeof(GLubyte));
4237 else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
4238 && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
4239 memcpy(dest, source, n * sizeof(GLuint));
4245 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4248 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4252 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
4256 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4258 /* convert to dest type */
4260 case GL_UNSIGNED_BYTE:
4262 GLubyte *dst = (GLubyte *) dest;
4264 for (i = 0; i < n; i++) {
4265 dst[i] = (GLubyte) (indexes[i] & 0xff);
4269 case GL_UNSIGNED_SHORT:
4271 GLuint *dst = (GLuint *) dest;
4273 for (i = 0; i < n; i++) {
4274 dst[i] = (GLushort) (indexes[i] & 0xffff);
4278 case GL_UNSIGNED_INT:
4279 memcpy(dest, indexes, n * sizeof(GLuint));
4282 _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
4291 _mesa_pack_index_span( struct gl_context *ctx, GLuint n,
4292 GLenum dstType, GLvoid *dest, const GLuint *source,
4293 const struct gl_pixelstore_attrib *dstPacking,
4294 GLbitfield transferOps )
4296 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4299 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4303 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4305 if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
4306 /* make a copy of input */
4307 memcpy(indexes, source, n * sizeof(GLuint));
4308 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4313 case GL_UNSIGNED_BYTE:
4315 GLubyte *dst = (GLubyte *) dest;
4317 for (i = 0; i < n; i++) {
4318 *dst++ = (GLubyte) source[i];
4324 GLbyte *dst = (GLbyte *) dest;
4326 for (i = 0; i < n; i++) {
4327 dst[i] = (GLbyte) source[i];
4331 case GL_UNSIGNED_SHORT:
4333 GLushort *dst = (GLushort *) dest;
4335 for (i = 0; i < n; i++) {
4336 dst[i] = (GLushort) source[i];
4338 if (dstPacking->SwapBytes) {
4339 _mesa_swap2( (GLushort *) dst, n );
4345 GLshort *dst = (GLshort *) dest;
4347 for (i = 0; i < n; i++) {
4348 dst[i] = (GLshort) source[i];
4350 if (dstPacking->SwapBytes) {
4351 _mesa_swap2( (GLushort *) dst, n );
4355 case GL_UNSIGNED_INT:
4357 GLuint *dst = (GLuint *) dest;
4359 for (i = 0; i < n; i++) {
4360 dst[i] = (GLuint) source[i];
4362 if (dstPacking->SwapBytes) {
4363 _mesa_swap4( (GLuint *) dst, n );
4369 GLint *dst = (GLint *) dest;
4371 for (i = 0; i < n; i++) {
4372 dst[i] = (GLint) source[i];
4374 if (dstPacking->SwapBytes) {
4375 _mesa_swap4( (GLuint *) dst, n );
4381 GLfloat *dst = (GLfloat *) dest;
4383 for (i = 0; i < n; i++) {
4384 dst[i] = (GLfloat) source[i];
4386 if (dstPacking->SwapBytes) {
4387 _mesa_swap4( (GLuint *) dst, n );
4391 case GL_HALF_FLOAT_ARB:
4393 GLhalfARB *dst = (GLhalfARB *) dest;
4395 for (i = 0; i < n; i++) {
4396 dst[i] = _mesa_float_to_half((GLfloat) source[i]);
4398 if (dstPacking->SwapBytes) {
4399 _mesa_swap2( (GLushort *) dst, n );
4404 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4412 * Unpack a row of stencil data from a client buffer according to
4413 * the pixel unpacking parameters.
4414 * This is (or will be) used by glDrawPixels
4416 * Args: ctx - the context
4417 * n - number of pixels
4418 * dstType - destination data type
4419 * dest - destination array
4420 * srcType - source pixel type
4421 * source - source data pointer
4422 * srcPacking - pixel unpacking parameters
4423 * transferOps - apply offset/bias/lookup ops?
4426 _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
4427 GLenum dstType, GLvoid *dest,
4428 GLenum srcType, const GLvoid *source,
4429 const struct gl_pixelstore_attrib *srcPacking,
4430 GLbitfield transferOps )
4432 ASSERT(srcType == GL_BITMAP ||
4433 srcType == GL_UNSIGNED_BYTE ||
4434 srcType == GL_BYTE ||
4435 srcType == GL_UNSIGNED_SHORT ||
4436 srcType == GL_SHORT ||
4437 srcType == GL_UNSIGNED_INT ||
4438 srcType == GL_INT ||
4439 srcType == GL_UNSIGNED_INT_24_8_EXT ||
4440 srcType == GL_HALF_FLOAT_ARB ||
4441 srcType == GL_FLOAT ||
4442 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4444 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4445 dstType == GL_UNSIGNED_SHORT ||
4446 dstType == GL_UNSIGNED_INT ||
4447 dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4449 /* only shift and offset apply to stencil */
4450 transferOps &= IMAGE_SHIFT_OFFSET_BIT;
4453 * Try simple cases first
4455 if (transferOps == 0 &&
4456 !ctx->Pixel.MapStencilFlag &&
4457 srcType == GL_UNSIGNED_BYTE &&
4458 dstType == GL_UNSIGNED_BYTE) {
4459 memcpy(dest, source, n * sizeof(GLubyte));
4461 else if (transferOps == 0 &&
4462 !ctx->Pixel.MapStencilFlag &&
4463 srcType == GL_UNSIGNED_INT &&
4464 dstType == GL_UNSIGNED_INT &&
4465 !srcPacking->SwapBytes) {
4466 memcpy(dest, source, n * sizeof(GLuint));
4472 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4475 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
4479 extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
4482 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4483 /* shift and offset indexes */
4484 _mesa_shift_and_offset_ci(ctx, n, indexes);
4487 if (ctx->Pixel.MapStencilFlag) {
4488 /* Apply stencil lookup table */
4489 const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
4491 for (i = 0; i < n; i++) {
4492 indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
4496 /* convert to dest type */
4498 case GL_UNSIGNED_BYTE:
4500 GLubyte *dst = (GLubyte *) dest;
4502 for (i = 0; i < n; i++) {
4503 dst[i] = (GLubyte) (indexes[i] & 0xff);
4507 case GL_UNSIGNED_SHORT:
4509 GLuint *dst = (GLuint *) dest;
4511 for (i = 0; i < n; i++) {
4512 dst[i] = (GLushort) (indexes[i] & 0xffff);
4516 case GL_UNSIGNED_INT:
4517 memcpy(dest, indexes, n * sizeof(GLuint));
4519 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
4521 GLuint *dst = (GLuint *) dest;
4523 for (i = 0; i < n; i++) {
4524 dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */
4529 _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
4538 _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
4539 GLenum dstType, GLvoid *dest, const GLubyte *source,
4540 const struct gl_pixelstore_attrib *dstPacking )
4542 GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte));
4545 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
4549 if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
4550 ctx->Pixel.MapStencilFlag) {
4551 /* make a copy of input */
4552 memcpy(stencil, source, n * sizeof(GLubyte));
4553 _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
4558 case GL_UNSIGNED_BYTE:
4559 memcpy(dest, source, n);
4563 GLbyte *dst = (GLbyte *) dest;
4566 dst[i] = (GLbyte) (source[i] & 0x7f);
4570 case GL_UNSIGNED_SHORT:
4572 GLushort *dst = (GLushort *) dest;
4575 dst[i] = (GLushort) source[i];
4577 if (dstPacking->SwapBytes) {
4578 _mesa_swap2( (GLushort *) dst, n );
4584 GLshort *dst = (GLshort *) dest;
4587 dst[i] = (GLshort) source[i];
4589 if (dstPacking->SwapBytes) {
4590 _mesa_swap2( (GLushort *) dst, n );
4594 case GL_UNSIGNED_INT:
4596 GLuint *dst = (GLuint *) dest;
4599 dst[i] = (GLuint) source[i];
4601 if (dstPacking->SwapBytes) {
4602 _mesa_swap4( (GLuint *) dst, n );
4608 GLint *dst = (GLint *) dest;
4611 dst[i] = (GLint) source[i];
4613 if (dstPacking->SwapBytes) {
4614 _mesa_swap4( (GLuint *) dst, n );
4620 GLfloat *dst = (GLfloat *) dest;
4623 dst[i] = (GLfloat) source[i];
4625 if (dstPacking->SwapBytes) {
4626 _mesa_swap4( (GLuint *) dst, n );
4630 case GL_HALF_FLOAT_ARB:
4632 GLhalfARB *dst = (GLhalfARB *) dest;
4635 dst[i] = _mesa_float_to_half( (float) source[i] );
4637 if (dstPacking->SwapBytes) {
4638 _mesa_swap2( (GLushort *) dst, n );
4643 if (dstPacking->LsbFirst) {
4644 GLubyte *dst = (GLubyte *) dest;
4647 for (i = 0; i < n; i++) {
4650 *dst |= ((source[i] != 0) << shift);
4659 GLubyte *dst = (GLubyte *) dest;
4662 for (i = 0; i < n; i++) {
4665 *dst |= ((source[i] != 0) << shift);
4675 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4681 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4684 const GLTYPE *src = (const GLTYPE *)source; \
4685 for (i = 0; i < n; i++) { \
4686 GLTYPE value = src[i]; \
4687 if (srcPacking->SwapBytes) { \
4688 if (sizeof(GLTYPE) == 2) { \
4690 } else if (sizeof(GLTYPE) == 4) { \
4694 depthValues[i] = GLTYPE2FLOAT(value); \
4700 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4701 * or GLfloat values.
4702 * The glPixelTransfer (scale/bias) params will be applied.
4704 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4705 * \param depthMax max value for returned GLushort or GLuint values
4706 * (ignored for GLfloat).
4709 _mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
4710 GLenum dstType, GLvoid *dest, GLuint depthMax,
4711 GLenum srcType, const GLvoid *source,
4712 const struct gl_pixelstore_attrib *srcPacking )
4714 GLfloat *depthTemp = NULL, *depthValues;
4715 GLboolean needClamp = GL_FALSE;
4717 /* Look for special cases first.
4718 * Not only are these faster, they're less prone to numeric conversion
4719 * problems. Otherwise, converting from an int type to a float then
4720 * back to an int type can introduce errors that will show up as
4721 * artifacts in things like depth peeling which uses glCopyTexImage.
4723 if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
4724 if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
4725 const GLuint *src = (const GLuint *) source;
4726 GLushort *dst = (GLushort *) dest;
4728 for (i = 0; i < n; i++) {
4729 dst[i] = src[i] >> 16;
4733 if (srcType == GL_UNSIGNED_SHORT
4734 && dstType == GL_UNSIGNED_INT
4735 && depthMax == 0xffffffff) {
4736 const GLushort *src = (const GLushort *) source;
4737 GLuint *dst = (GLuint *) dest;
4739 for (i = 0; i < n; i++) {
4740 dst[i] = src[i] | (src[i] << 16);
4744 if (srcType == GL_UNSIGNED_INT_24_8
4745 && dstType == GL_UNSIGNED_INT
4746 && depthMax == 0xffffff) {
4747 const GLuint *src = (const GLuint *) source;
4748 GLuint *dst = (GLuint *) dest;
4750 for (i = 0; i < n; i++) {
4751 dst[i] = src[i] >> 8;
4755 /* XXX may want to add additional cases here someday */
4758 /* general case path follows */
4760 if (dstType == GL_FLOAT) {
4761 depthValues = (GLfloat *) dest;
4764 depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
4766 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4770 depthValues = depthTemp;
4773 /* Convert incoming values to GLfloat. Some conversions will require
4778 DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ);
4779 needClamp = GL_TRUE;
4781 case GL_UNSIGNED_BYTE:
4782 DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
4785 DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ);
4786 needClamp = GL_TRUE;
4788 case GL_UNSIGNED_SHORT:
4789 DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
4792 DEPTH_VALUES(GLint, INT_TO_FLOAT);
4793 needClamp = GL_TRUE;
4795 case GL_UNSIGNED_INT:
4796 DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
4798 case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
4799 if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
4800 depthMax == 0xffffff &&
4801 ctx->Pixel.DepthScale == 1.0 &&
4802 ctx->Pixel.DepthBias == 0.0) {
4803 const GLuint *src = (const GLuint *) source;
4804 GLuint *zValues = (GLuint *) dest;
4806 for (i = 0; i < n; i++) {
4807 GLuint value = src[i];
4808 if (srcPacking->SwapBytes) {
4811 zValues[i] = value & 0xffffff00;
4817 const GLuint *src = (const GLuint *) source;
4818 const GLfloat scale = 1.0f / 0xffffff;
4820 for (i = 0; i < n; i++) {
4821 GLuint value = src[i];
4822 if (srcPacking->SwapBytes) {
4825 depthValues[i] = (value >> 8) * scale;
4829 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
4832 const GLfloat *src = (const GLfloat *)source;
4833 for (i = 0; i < n; i++) {
4834 GLfloat value = src[i * 2];
4835 if (srcPacking->SwapBytes) {
4838 depthValues[i] = value;
4840 needClamp = GL_TRUE;
4844 DEPTH_VALUES(GLfloat, 1*);
4845 needClamp = GL_TRUE;
4847 case GL_HALF_FLOAT_ARB:
4850 const GLhalfARB *src = (const GLhalfARB *) source;
4851 for (i = 0; i < n; i++) {
4852 GLhalfARB value = src[i];
4853 if (srcPacking->SwapBytes) {
4856 depthValues[i] = _mesa_half_to_float(value);
4858 needClamp = GL_TRUE;
4862 _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
4867 /* apply depth scale and bias */
4869 const GLfloat scale = ctx->Pixel.DepthScale;
4870 const GLfloat bias = ctx->Pixel.DepthBias;
4871 if (scale != 1.0 || bias != 0.0) {
4873 for (i = 0; i < n; i++) {
4874 depthValues[i] = depthValues[i] * scale + bias;
4876 needClamp = GL_TRUE;
4880 /* clamp to [0, 1] */
4883 for (i = 0; i < n; i++) {
4884 depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
4889 * Convert values to dstType
4891 if (dstType == GL_UNSIGNED_INT) {
4892 GLuint *zValues = (GLuint *) dest;
4894 if (depthMax <= 0xffffff) {
4895 /* no overflow worries */
4896 for (i = 0; i < n; i++) {
4897 zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
4901 /* need to use double precision to prevent overflow problems */
4902 for (i = 0; i < n; i++) {
4903 GLdouble z = depthValues[i] * (GLfloat) depthMax;
4904 if (z >= (GLdouble) 0xffffffff)
4905 zValues[i] = 0xffffffff;
4907 zValues[i] = (GLuint) z;
4911 else if (dstType == GL_UNSIGNED_SHORT) {
4912 GLushort *zValues = (GLushort *) dest;
4914 ASSERT(depthMax <= 0xffff);
4915 for (i = 0; i < n; i++) {
4916 zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
4919 else if (dstType == GL_FLOAT) {
4920 /* Nothing to do. depthValues is pointing to dest. */
4922 else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
4923 GLfloat *zValues = (GLfloat*) dest;
4925 for (i = 0; i < n; i++) {
4926 zValues[i*2] = depthValues[i];
4938 * Pack an array of depth values. The values are floats in [0,1].
4941 _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
4942 GLenum dstType, const GLfloat *depthSpan,
4943 const struct gl_pixelstore_attrib *dstPacking )
4945 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
4947 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4951 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
4952 memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
4953 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
4954 depthSpan = depthCopy;
4958 case GL_UNSIGNED_BYTE:
4960 GLubyte *dst = (GLubyte *) dest;
4962 for (i = 0; i < n; i++) {
4963 dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
4969 GLbyte *dst = (GLbyte *) dest;
4971 for (i = 0; i < n; i++) {
4972 dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
4976 case GL_UNSIGNED_SHORT:
4978 GLushort *dst = (GLushort *) dest;
4980 for (i = 0; i < n; i++) {
4981 CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
4983 if (dstPacking->SwapBytes) {
4984 _mesa_swap2( (GLushort *) dst, n );
4990 GLshort *dst = (GLshort *) dest;
4992 for (i = 0; i < n; i++) {
4993 dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
4995 if (dstPacking->SwapBytes) {
4996 _mesa_swap2( (GLushort *) dst, n );
5000 case GL_UNSIGNED_INT:
5002 GLuint *dst = (GLuint *) dest;
5004 for (i = 0; i < n; i++) {
5005 dst[i] = FLOAT_TO_UINT( depthSpan[i] );
5007 if (dstPacking->SwapBytes) {
5008 _mesa_swap4( (GLuint *) dst, n );
5014 GLint *dst = (GLint *) dest;
5016 for (i = 0; i < n; i++) {
5017 dst[i] = FLOAT_TO_INT( depthSpan[i] );
5019 if (dstPacking->SwapBytes) {
5020 _mesa_swap4( (GLuint *) dst, n );
5026 GLfloat *dst = (GLfloat *) dest;
5028 for (i = 0; i < n; i++) {
5029 dst[i] = depthSpan[i];
5031 if (dstPacking->SwapBytes) {
5032 _mesa_swap4( (GLuint *) dst, n );
5036 case GL_HALF_FLOAT_ARB:
5038 GLhalfARB *dst = (GLhalfARB *) dest;
5040 for (i = 0; i < n; i++) {
5041 dst[i] = _mesa_float_to_half(depthSpan[i]);
5043 if (dstPacking->SwapBytes) {
5044 _mesa_swap2( (GLushort *) dst, n );
5049 _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
5058 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5061 _mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n,
5062 GLenum dstType, GLuint *dest,
5063 const GLfloat *depthVals,
5064 const GLubyte *stencilVals,
5065 const struct gl_pixelstore_attrib *dstPacking)
5067 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
5068 GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte));
5071 if (!depthCopy || !stencilCopy) {
5072 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
5078 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5079 memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
5080 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5081 depthVals = depthCopy;
5084 if (ctx->Pixel.IndexShift ||
5085 ctx->Pixel.IndexOffset ||
5086 ctx->Pixel.MapStencilFlag) {
5087 memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte));
5088 _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
5089 stencilVals = stencilCopy;
5093 case GL_UNSIGNED_INT_24_8:
5094 for (i = 0; i < n; i++) {
5095 GLuint z = (GLuint) (depthVals[i] * 0xffffff);
5096 dest[i] = (z << 8) | (stencilVals[i] & 0xff);
5099 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5100 for (i = 0; i < n; i++) {
5101 ((GLfloat*)dest)[i*2] = depthVals[i];
5102 dest[i*2+1] = stencilVals[i] & 0xff;
5107 if (dstPacking->SwapBytes) {
5108 _mesa_swap4(dest, n);
5119 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5120 * Return all image data in a contiguous block. This is used when we
5121 * compile glDrawPixels, glTexImage, etc into a display list. We
5122 * need a copy of the data in a standard format.
5125 _mesa_unpack_image( GLuint dimensions,
5126 GLsizei width, GLsizei height, GLsizei depth,
5127 GLenum format, GLenum type, const GLvoid *pixels,
5128 const struct gl_pixelstore_attrib *unpack )
5130 GLint bytesPerRow, compsPerRow;
5131 GLboolean flipBytes, swap2, swap4;
5134 return NULL; /* not necessarily an error */
5136 if (width <= 0 || height <= 0 || depth <= 0)
5137 return NULL; /* generate error later */
5139 if (type == GL_BITMAP) {
5140 bytesPerRow = (width + 7) >> 3;
5141 flipBytes = unpack->LsbFirst;
5142 swap2 = swap4 = GL_FALSE;
5146 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
5147 GLint components = _mesa_components_in_format(format);
5150 if (_mesa_type_is_packed(type))
5153 if (bytesPerPixel <= 0 || components <= 0)
5154 return NULL; /* bad format or type. generate error later */
5155 bytesPerRow = bytesPerPixel * width;
5156 bytesPerComp = bytesPerPixel / components;
5157 flipBytes = GL_FALSE;
5158 swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
5159 swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
5160 compsPerRow = components * width;
5161 assert(compsPerRow >= width);
5166 = (GLubyte *) malloc(bytesPerRow * height * depth);
5170 return NULL; /* generate GL_OUT_OF_MEMORY later */
5173 for (img = 0; img < depth; img++) {
5174 for (row = 0; row < height; row++) {
5175 const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
5176 width, height, format, type, img, row, 0);
5178 if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
5180 flipBytes = GL_FALSE;
5181 if (unpack->LsbFirst) {
5182 GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
5183 GLubyte dstMask = 128;
5184 const GLubyte *s = src;
5187 for (i = 0; i < width; i++) {
5191 if (srcMask == 128) {
5196 srcMask = srcMask << 1;
5204 dstMask = dstMask >> 1;
5209 GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
5210 GLubyte dstMask = 128;
5211 const GLubyte *s = src;
5214 for (i = 0; i < width; i++) {
5223 srcMask = srcMask >> 1;
5231 dstMask = dstMask >> 1;
5237 memcpy(dst, src, bytesPerRow);
5240 /* byte flipping/swapping */
5242 flip_bytes((GLubyte *) dst, bytesPerRow);
5245 _mesa_swap2((GLushort*) dst, compsPerRow);
5248 _mesa_swap4((GLuint*) dst, compsPerRow);