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) (x)
466 #define FN_NAME pack_ushort_from_uint_rgba
467 #include "pack_tmp.h"
472 #define DST_TYPE GLshort
473 #define SRC_CONVERT(x) (x)
474 #define FN_NAME pack_short_from_uint_rgba
475 #include "pack_tmp.h"
480 #define DST_TYPE GLubyte
481 #define SRC_CONVERT(x) (x)
482 #define FN_NAME pack_ubyte_from_uint_rgba
483 #include "pack_tmp.h"
488 #define DST_TYPE GLbyte
489 #define SRC_CONVERT(x) (x)
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*3+0] = (GLshort) rgba[i][RCOMP];
1179 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1180 dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1183 case GL_RGB_INTEGER_EXT:
1185 dst[i*3+0] = (GLshort) rgba[i][RCOMP];
1186 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1187 dst[i*3+2] = (GLshort) rgba[i][BCOMP];
1190 case GL_RGBA_INTEGER_EXT:
1192 dst[i*4+0] = (GLshort) rgba[i][RCOMP];
1193 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1194 dst[i*4+2] = (GLshort) rgba[i][BCOMP];
1195 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1198 case GL_BGR_INTEGER_EXT:
1200 dst[i*3+0] = (GLshort) rgba[i][BCOMP];
1201 dst[i*3+1] = (GLshort) rgba[i][GCOMP];
1202 dst[i*3+2] = (GLshort) rgba[i][RCOMP];
1205 case GL_BGRA_INTEGER_EXT:
1207 dst[i*4+0] = (GLshort) rgba[i][BCOMP];
1208 dst[i*4+1] = (GLshort) rgba[i][GCOMP];
1209 dst[i*4+2] = (GLshort) rgba[i][RCOMP];
1210 dst[i*4+3] = (GLshort) rgba[i][ACOMP];
1213 case GL_LUMINANCE_INTEGER_EXT:
1215 dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
1218 dst[i*2+1] = (GLshort) rgba[i][ACOMP];
1221 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1223 dst[i] = (GLshort) (rgba[i][RCOMP] +
1231 dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
1232 dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
1236 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1240 case GL_UNSIGNED_INT:
1242 GLuint *dst = (GLuint *) dstAddr;
1243 switch (dstFormat) {
1246 dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1250 dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1254 dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1258 dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1262 dst[i] = FLOAT_TO_UINT(luminance[i]);
1264 case GL_LUMINANCE_ALPHA:
1266 dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
1267 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1272 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1273 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1278 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1279 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1280 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1285 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1286 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1287 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1288 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1293 dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1294 dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1295 dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1300 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1301 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1302 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1303 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1308 dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
1309 dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
1310 dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1311 dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1314 case GL_RED_INTEGER_EXT:
1316 dst[i] = (GLuint) rgba[i][RCOMP];
1319 case GL_GREEN_INTEGER_EXT:
1321 dst[i] = (GLuint) rgba[i][GCOMP];
1324 case GL_BLUE_INTEGER_EXT:
1326 dst[i] = (GLuint) rgba[i][BCOMP];
1329 case GL_ALPHA_INTEGER_EXT:
1331 dst[i] = (GLuint) rgba[i][ACOMP];
1336 dst[i*2+0] = (GLuint) rgba[i][RCOMP];
1337 dst[i*2+1] = (GLuint) rgba[i][GCOMP];
1340 case GL_RGB_INTEGER_EXT:
1342 dst[i*3+0] = (GLuint) rgba[i][RCOMP];
1343 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1344 dst[i*3+2] = (GLuint) rgba[i][BCOMP];
1347 case GL_RGBA_INTEGER_EXT:
1349 dst[i*4+0] = (GLuint) rgba[i][RCOMP];
1350 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1351 dst[i*4+2] = (GLuint) rgba[i][BCOMP];
1352 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1355 case GL_BGR_INTEGER_EXT:
1357 dst[i*3+0] = (GLuint) rgba[i][BCOMP];
1358 dst[i*3+1] = (GLuint) rgba[i][GCOMP];
1359 dst[i*3+2] = (GLuint) rgba[i][RCOMP];
1362 case GL_BGRA_INTEGER_EXT:
1364 dst[i*4+0] = (GLuint) rgba[i][BCOMP];
1365 dst[i*4+1] = (GLuint) rgba[i][GCOMP];
1366 dst[i*4+2] = (GLuint) rgba[i][RCOMP];
1367 dst[i*4+3] = (GLuint) rgba[i][ACOMP];
1370 case GL_LUMINANCE_INTEGER_EXT:
1372 dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
1375 dst[i*2+1] = (GLuint) rgba[i][ACOMP];
1378 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1380 dst[i] = (GLuint) (rgba[i][RCOMP] +
1388 dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
1389 dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
1393 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1399 GLint *dst = (GLint *) dstAddr;
1400 switch (dstFormat) {
1403 dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
1407 dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
1411 dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
1415 dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
1419 dst[i] = FLOAT_TO_INT(luminance[i]);
1421 case GL_LUMINANCE_ALPHA:
1423 dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
1424 dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
1429 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1430 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1435 dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1436 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1437 dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1442 dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1443 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1444 dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
1445 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1450 dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1451 dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1452 dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1457 dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
1458 dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1459 dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
1460 dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
1465 dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
1466 dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
1467 dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
1468 dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
1474 dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
1475 dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
1478 case GL_RED_INTEGER_EXT:
1480 dst[i] = (GLint) rgba[i][RCOMP];
1483 case GL_GREEN_INTEGER_EXT:
1485 dst[i] = (GLint) rgba[i][GCOMP];
1488 case GL_BLUE_INTEGER_EXT:
1490 dst[i] = (GLint) rgba[i][BCOMP];
1493 case GL_ALPHA_INTEGER_EXT:
1495 dst[i] = (GLint) rgba[i][ACOMP];
1500 dst[i*2+0] = (GLint) rgba[i][RCOMP];
1501 dst[i*2+1] = (GLint) rgba[i][GCOMP];
1504 case GL_RGB_INTEGER_EXT:
1506 dst[i*3+0] = (GLint) rgba[i][RCOMP];
1507 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1508 dst[i*3+2] = (GLint) rgba[i][BCOMP];
1511 case GL_RGBA_INTEGER_EXT:
1513 dst[i*4+0] = (GLint) rgba[i][RCOMP];
1514 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1515 dst[i*4+2] = (GLint) rgba[i][BCOMP];
1516 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1519 case GL_BGR_INTEGER_EXT:
1521 dst[i*3+0] = (GLint) rgba[i][BCOMP];
1522 dst[i*3+1] = (GLint) rgba[i][GCOMP];
1523 dst[i*3+2] = (GLint) rgba[i][RCOMP];
1526 case GL_BGRA_INTEGER_EXT:
1528 dst[i*4+0] = (GLint) rgba[i][BCOMP];
1529 dst[i*4+1] = (GLint) rgba[i][GCOMP];
1530 dst[i*4+2] = (GLint) rgba[i][RCOMP];
1531 dst[i*4+3] = (GLint) rgba[i][ACOMP];
1534 case GL_LUMINANCE_INTEGER_EXT:
1536 dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
1539 dst[i*2+1] = (GLint) rgba[i][ACOMP];
1542 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
1544 dst[i] = (GLint) (rgba[i][RCOMP] +
1550 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1556 GLfloat *dst = (GLfloat *) dstAddr;
1557 switch (dstFormat) {
1560 dst[i] = rgba[i][RCOMP];
1564 dst[i] = rgba[i][GCOMP];
1568 dst[i] = rgba[i][BCOMP];
1572 dst[i] = rgba[i][ACOMP];
1576 dst[i] = luminance[i];
1578 case GL_LUMINANCE_ALPHA:
1580 dst[i*2+0] = luminance[i];
1581 dst[i*2+1] = rgba[i][ACOMP];
1586 dst[i*2+0] = rgba[i][RCOMP];
1587 dst[i*2+1] = rgba[i][GCOMP];
1592 dst[i*3+0] = rgba[i][RCOMP];
1593 dst[i*3+1] = rgba[i][GCOMP];
1594 dst[i*3+2] = rgba[i][BCOMP];
1599 dst[i*4+0] = rgba[i][RCOMP];
1600 dst[i*4+1] = rgba[i][GCOMP];
1601 dst[i*4+2] = rgba[i][BCOMP];
1602 dst[i*4+3] = rgba[i][ACOMP];
1607 dst[i*3+0] = rgba[i][BCOMP];
1608 dst[i*3+1] = rgba[i][GCOMP];
1609 dst[i*3+2] = rgba[i][RCOMP];
1614 dst[i*4+0] = rgba[i][BCOMP];
1615 dst[i*4+1] = rgba[i][GCOMP];
1616 dst[i*4+2] = rgba[i][RCOMP];
1617 dst[i*4+3] = rgba[i][ACOMP];
1622 dst[i*4+0] = rgba[i][ACOMP];
1623 dst[i*4+1] = rgba[i][BCOMP];
1624 dst[i*4+2] = rgba[i][GCOMP];
1625 dst[i*4+3] = rgba[i][RCOMP];
1631 dst[i*2+0] = rgba[i][RCOMP];
1632 dst[i*2+1] = rgba[i][GCOMP];
1636 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1640 case GL_HALF_FLOAT_ARB:
1642 GLhalfARB *dst = (GLhalfARB *) dstAddr;
1643 switch (dstFormat) {
1646 dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
1650 dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
1654 dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
1658 dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
1662 dst[i] = _mesa_float_to_half(luminance[i]);
1664 case GL_LUMINANCE_ALPHA:
1666 dst[i*2+0] = _mesa_float_to_half(luminance[i]);
1667 dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
1672 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1673 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1678 dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1679 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1680 dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1685 dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1686 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1687 dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
1688 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1693 dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1694 dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1695 dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1700 dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
1701 dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1702 dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
1703 dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
1708 dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
1709 dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
1710 dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
1711 dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
1717 dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
1718 dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
1722 _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
1726 case GL_UNSIGNED_BYTE_3_3_2:
1727 if (dstFormat == GL_RGB) {
1728 GLubyte *dst = (GLubyte *) dstAddr;
1730 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
1731 | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
1732 | (IROUND(rgba[i][BCOMP] * 3.0F) );
1736 case GL_UNSIGNED_BYTE_2_3_3_REV:
1737 if (dstFormat == GL_RGB) {
1738 GLubyte *dst = (GLubyte *) dstAddr;
1740 dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) )
1741 | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
1742 | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
1746 case GL_UNSIGNED_SHORT_5_6_5:
1747 if (dstFormat == GL_RGB) {
1748 GLushort *dst = (GLushort *) dstAddr;
1750 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1751 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1752 | (IROUND(rgba[i][BCOMP] * 31.0F) );
1756 case GL_UNSIGNED_SHORT_5_6_5_REV:
1757 if (dstFormat == GL_RGB) {
1758 GLushort *dst = (GLushort *) dstAddr;
1760 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1761 | (IROUND(rgba[i][GCOMP] * 63.0F) << 5)
1762 | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
1766 case GL_UNSIGNED_SHORT_4_4_4_4:
1767 if (dstFormat == GL_RGBA) {
1768 GLushort *dst = (GLushort *) dstAddr;
1770 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
1771 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1772 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1773 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1776 else if (dstFormat == GL_BGRA) {
1777 GLushort *dst = (GLushort *) dstAddr;
1779 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
1780 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1781 | (IROUND(rgba[i][RCOMP] * 15.0F) << 4)
1782 | (IROUND(rgba[i][ACOMP] * 15.0F) );
1785 else if (dstFormat == GL_ABGR_EXT) {
1786 GLushort *dst = (GLushort *) dstAddr;
1788 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
1789 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1790 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1791 | (IROUND(rgba[i][RCOMP] * 15.0F) );
1795 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
1796 if (dstFormat == GL_RGBA) {
1797 GLushort *dst = (GLushort *) dstAddr;
1799 dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) )
1800 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1801 | (IROUND(rgba[i][BCOMP] * 15.0F) << 8)
1802 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1805 else if (dstFormat == GL_BGRA) {
1806 GLushort *dst = (GLushort *) dstAddr;
1808 dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) )
1809 | (IROUND(rgba[i][GCOMP] * 15.0F) << 4)
1810 | (IROUND(rgba[i][RCOMP] * 15.0F) << 8)
1811 | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
1814 else if (dstFormat == GL_ABGR_EXT) {
1815 GLushort *dst = (GLushort *) dstAddr;
1817 dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) )
1818 | (IROUND(rgba[i][BCOMP] * 15.0F) << 4)
1819 | (IROUND(rgba[i][GCOMP] * 15.0F) << 8)
1820 | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
1824 case GL_UNSIGNED_SHORT_5_5_5_1:
1825 if (dstFormat == GL_RGBA) {
1826 GLushort *dst = (GLushort *) dstAddr;
1828 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
1829 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1830 | (IROUND(rgba[i][BCOMP] * 31.0F) << 1)
1831 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1834 else if (dstFormat == GL_BGRA) {
1835 GLushort *dst = (GLushort *) dstAddr;
1837 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
1838 | (IROUND(rgba[i][GCOMP] * 31.0F) << 6)
1839 | (IROUND(rgba[i][RCOMP] * 31.0F) << 1)
1840 | (IROUND(rgba[i][ACOMP] * 1.0F) );
1843 else if (dstFormat == GL_ABGR_EXT) {
1844 GLushort *dst = (GLushort *) dstAddr;
1846 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
1847 | (IROUND(rgba[i][BCOMP] * 31.0F) << 6)
1848 | (IROUND(rgba[i][GCOMP] * 31.0F) << 1)
1849 | (IROUND(rgba[i][RCOMP] * 1.0F) );
1853 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
1854 if (dstFormat == GL_RGBA) {
1855 GLushort *dst = (GLushort *) dstAddr;
1857 dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) )
1858 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1859 | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
1860 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1863 else if (dstFormat == GL_BGRA) {
1864 GLushort *dst = (GLushort *) dstAddr;
1866 dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) )
1867 | (IROUND(rgba[i][GCOMP] * 31.0F) << 5)
1868 | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
1869 | (IROUND(rgba[i][ACOMP] * 1.0F) << 15);
1872 else if (dstFormat == GL_ABGR_EXT) {
1873 GLushort *dst = (GLushort *) dstAddr;
1875 dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) )
1876 | (IROUND(rgba[i][BCOMP] * 31.0F) << 5)
1877 | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
1878 | (IROUND(rgba[i][RCOMP] * 1.0F) << 15);
1882 case GL_UNSIGNED_INT_8_8_8_8:
1883 if (dstFormat == GL_RGBA) {
1884 GLuint *dst = (GLuint *) dstAddr;
1886 dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
1887 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1888 | (IROUND(rgba[i][BCOMP] * 255.F) << 8)
1889 | (IROUND(rgba[i][ACOMP] * 255.F) );
1892 else if (dstFormat == GL_BGRA) {
1893 GLuint *dst = (GLuint *) dstAddr;
1895 dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
1896 | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
1897 | (IROUND(rgba[i][RCOMP] * 255.F) << 8)
1898 | (IROUND(rgba[i][ACOMP] * 255.F) );
1901 else if (dstFormat == GL_ABGR_EXT) {
1902 GLuint *dst = (GLuint *) dstAddr;
1904 dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
1905 | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
1906 | (IROUND(rgba[i][GCOMP] * 255.F) << 8)
1907 | (IROUND(rgba[i][RCOMP] * 255.F) );
1911 case GL_UNSIGNED_INT_8_8_8_8_REV:
1912 if (dstFormat == GL_RGBA) {
1913 GLuint *dst = (GLuint *) dstAddr;
1915 dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F) )
1916 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1917 | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
1918 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1921 else if (dstFormat == GL_BGRA) {
1922 GLuint *dst = (GLuint *) dstAddr;
1924 dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F) )
1925 | (IROUND(rgba[i][GCOMP] * 255.0F) << 8)
1926 | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
1927 | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
1930 else if (dstFormat == GL_ABGR_EXT) {
1931 GLuint *dst = (GLuint *) dstAddr;
1933 dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F) )
1934 | (IROUND(rgba[i][BCOMP] * 255.0F) << 8)
1935 | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
1936 | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
1940 case GL_UNSIGNED_INT_10_10_10_2:
1941 if (dstFormat == GL_RGBA) {
1942 GLuint *dst = (GLuint *) dstAddr;
1944 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
1945 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1946 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 2)
1947 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1950 else if (dstFormat == GL_BGRA) {
1951 GLuint *dst = (GLuint *) dstAddr;
1953 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
1954 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
1955 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 2)
1956 | (IROUND(rgba[i][ACOMP] * 3.0F) );
1959 else if (dstFormat == GL_ABGR_EXT) {
1960 GLuint *dst = (GLuint *) dstAddr;
1962 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
1963 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
1964 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 2)
1965 | (IROUND(rgba[i][RCOMP] * 3.0F) );
1969 case GL_UNSIGNED_INT_2_10_10_10_REV:
1970 if (dstFormat == GL_RGBA) {
1971 GLuint *dst = (GLuint *) dstAddr;
1973 dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) )
1974 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1975 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
1976 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1979 else if (dstFormat == GL_BGRA) {
1980 GLuint *dst = (GLuint *) dstAddr;
1982 dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) )
1983 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
1984 | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
1985 | (IROUND(rgba[i][ACOMP] * 3.0F) << 30);
1988 else if (dstFormat == GL_ABGR_EXT) {
1989 GLuint *dst = (GLuint *) dstAddr;
1991 dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) )
1992 | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
1993 | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
1994 | (IROUND(rgba[i][RCOMP] * 3.0F) << 30);
1998 case GL_UNSIGNED_INT_5_9_9_9_REV:
2000 GLuint *dst = (GLuint *) dstAddr;
2001 for (i = 0; i < n; i++) {
2002 dst[i] = float3_to_rgb9e5(rgba[i]);
2006 case GL_UNSIGNED_INT_10F_11F_11F_REV:
2008 GLuint *dst = (GLuint *) dstAddr;
2009 for (i = 0; i < n; i++) {
2010 dst[i] = float3_to_r11g11b10f(rgba[i]);
2015 _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
2020 if (dstPacking->SwapBytes) {
2021 GLint swapSize = _mesa_sizeof_packed_type(dstType);
2022 if (swapSize == 2) {
2023 if (dstPacking->SwapBytes) {
2024 _mesa_swap2((GLushort *) dstAddr, n * comps);
2027 else if (swapSize == 4) {
2028 if (dstPacking->SwapBytes) {
2029 _mesa_swap4((GLuint *) dstAddr, n * comps);
2039 #define SWAP2BYTE(VALUE) \
2041 GLubyte *bytes = (GLubyte *) &(VALUE); \
2042 GLubyte tmp = bytes[0]; \
2043 bytes[0] = bytes[1]; \
2047 #define SWAP4BYTE(VALUE) \
2049 GLubyte *bytes = (GLubyte *) &(VALUE); \
2050 GLubyte tmp = bytes[0]; \
2051 bytes[0] = bytes[3]; \
2054 bytes[1] = bytes[2]; \
2060 extract_uint_indexes(GLuint n, GLuint indexes[],
2061 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2062 const struct gl_pixelstore_attrib *unpack )
2064 ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
2066 ASSERT(srcType == GL_BITMAP ||
2067 srcType == GL_UNSIGNED_BYTE ||
2068 srcType == GL_BYTE ||
2069 srcType == GL_UNSIGNED_SHORT ||
2070 srcType == GL_SHORT ||
2071 srcType == GL_UNSIGNED_INT ||
2072 srcType == GL_INT ||
2073 srcType == GL_UNSIGNED_INT_24_8_EXT ||
2074 srcType == GL_HALF_FLOAT_ARB ||
2075 srcType == GL_FLOAT ||
2076 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
2081 GLubyte *ubsrc = (GLubyte *) src;
2082 if (unpack->LsbFirst) {
2083 GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
2085 for (i = 0; i < n; i++) {
2086 indexes[i] = (*ubsrc & mask) ? 1 : 0;
2097 GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
2099 for (i = 0; i < n; i++) {
2100 indexes[i] = (*ubsrc & mask) ? 1 : 0;
2112 case GL_UNSIGNED_BYTE:
2115 const GLubyte *s = (const GLubyte *) src;
2116 for (i = 0; i < n; i++)
2123 const GLbyte *s = (const GLbyte *) src;
2124 for (i = 0; i < n; i++)
2128 case GL_UNSIGNED_SHORT:
2131 const GLushort *s = (const GLushort *) src;
2132 if (unpack->SwapBytes) {
2133 for (i = 0; i < n; i++) {
2134 GLushort value = s[i];
2140 for (i = 0; i < n; i++)
2148 const GLshort *s = (const GLshort *) src;
2149 if (unpack->SwapBytes) {
2150 for (i = 0; i < n; i++) {
2151 GLshort value = s[i];
2157 for (i = 0; i < n; i++)
2162 case GL_UNSIGNED_INT:
2165 const GLuint *s = (const GLuint *) src;
2166 if (unpack->SwapBytes) {
2167 for (i = 0; i < n; i++) {
2168 GLuint value = s[i];
2174 for (i = 0; i < n; i++)
2182 const GLint *s = (const GLint *) src;
2183 if (unpack->SwapBytes) {
2184 for (i = 0; i < n; i++) {
2191 for (i = 0; i < n; i++)
2199 const GLfloat *s = (const GLfloat *) src;
2200 if (unpack->SwapBytes) {
2201 for (i = 0; i < n; i++) {
2202 GLfloat value = s[i];
2204 indexes[i] = (GLuint) value;
2208 for (i = 0; i < n; i++)
2209 indexes[i] = (GLuint) s[i];
2213 case GL_HALF_FLOAT_ARB:
2216 const GLhalfARB *s = (const GLhalfARB *) src;
2217 if (unpack->SwapBytes) {
2218 for (i = 0; i < n; i++) {
2219 GLhalfARB value = s[i];
2221 indexes[i] = (GLuint) _mesa_half_to_float(value);
2225 for (i = 0; i < n; i++)
2226 indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
2230 case GL_UNSIGNED_INT_24_8_EXT:
2233 const GLuint *s = (const GLuint *) src;
2234 if (unpack->SwapBytes) {
2235 for (i = 0; i < n; i++) {
2236 GLuint value = s[i];
2238 indexes[i] = value & 0xff; /* lower 8 bits */
2242 for (i = 0; i < n; i++)
2243 indexes[i] = s[i] & 0xff; /* lower 8 bits */
2247 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
2250 const GLuint *s = (const GLuint *) src;
2251 if (unpack->SwapBytes) {
2252 for (i = 0; i < n; i++) {
2253 GLuint value = s[i*2+1];
2255 indexes[i] = value & 0xff; /* lower 8 bits */
2259 for (i = 0; i < n; i++)
2260 indexes[i] = s[i*2+1] & 0xff; /* lower 8 bits */
2266 _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
2273 * Return source/dest RGBA indexes for unpacking pixels.
2276 get_component_mapping(GLenum format,
2288 case GL_RED_INTEGER_EXT:
2290 *gSrc = *bSrc = *aSrc = -1;
2293 case GL_GREEN_INTEGER_EXT:
2295 *rSrc = *bSrc = *aSrc = -1;
2298 case GL_BLUE_INTEGER_EXT:
2300 *rSrc = *gSrc = *aSrc = -1;
2303 case GL_ALPHA_INTEGER_EXT:
2304 *rSrc = *gSrc = *bSrc = -1;
2308 case GL_LUMINANCE_INTEGER_EXT:
2309 *rSrc = *gSrc = *bSrc = 0;
2312 case GL_LUMINANCE_ALPHA:
2313 case GL_LUMINANCE_ALPHA_INTEGER_EXT:
2314 *rSrc = *gSrc = *bSrc = 0;
2318 *rSrc = *gSrc = *bSrc = *aSrc = 0;
2332 case GL_RGB_INTEGER:
2343 case GL_BGR_INTEGER:
2354 case GL_RGBA_INTEGER:
2365 case GL_BGRA_INTEGER:
2393 _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
2394 _mesa_lookup_enum_by_nr(format));
2402 * This function extracts floating point RGBA values from arbitrary
2403 * image data. srcFormat and srcType are the format and type parameters
2404 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2406 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2407 * implements the "Conversion to floating point", "Conversion to RGB",
2408 * and "Final Expansion to RGBA" operations.
2410 * Args: n - number of pixels
2411 * rgba - output colors
2412 * srcFormat - format of incoming data
2413 * srcType - data type of incoming data
2414 * src - source data pointer
2415 * swapBytes - perform byteswapping of incoming data?
2418 extract_float_rgba(GLuint n, GLfloat rgba[][4],
2419 GLenum srcFormat, GLenum srcType, const GLvoid *src,
2420 GLboolean swapBytes)
2422 GLint rSrc, gSrc, bSrc, aSrc;
2424 GLint rDst, bDst, gDst, aDst;
2425 GLboolean intFormat;
2426 GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
2428 ASSERT(srcFormat == GL_RED ||
2429 srcFormat == GL_GREEN ||
2430 srcFormat == GL_BLUE ||
2431 srcFormat == GL_ALPHA ||
2432 srcFormat == GL_LUMINANCE ||
2433 srcFormat == GL_LUMINANCE_ALPHA ||
2434 srcFormat == GL_INTENSITY ||
2435 srcFormat == GL_RG ||
2436 srcFormat == GL_RGB ||
2437 srcFormat == GL_BGR ||
2438 srcFormat == GL_RGBA ||
2439 srcFormat == GL_BGRA ||
2440 srcFormat == GL_ABGR_EXT ||
2441 srcFormat == GL_DU8DV8_ATI ||
2442 srcFormat == GL_DUDV_ATI ||
2443 srcFormat == GL_RED_INTEGER_EXT ||
2444 srcFormat == GL_GREEN_INTEGER_EXT ||
2445 srcFormat == GL_BLUE_INTEGER_EXT ||
2446 srcFormat == GL_ALPHA_INTEGER_EXT ||
2447 srcFormat == GL_RG_INTEGER ||
2448 srcFormat == GL_RGB_INTEGER_EXT ||
2449 srcFormat == GL_RGBA_INTEGER_EXT ||
2450 srcFormat == GL_BGR_INTEGER_EXT ||
2451 srcFormat == GL_BGRA_INTEGER_EXT ||
2452 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
2453 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
2455 ASSERT(srcType == GL_UNSIGNED_BYTE ||
2456 srcType == GL_BYTE ||
2457 srcType == GL_UNSIGNED_SHORT ||
2458 srcType == GL_SHORT ||
2459 srcType == GL_UNSIGNED_INT ||
2460 srcType == GL_INT ||
2461 srcType == GL_HALF_FLOAT_ARB ||
2462 srcType == GL_FLOAT ||
2463 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
2464 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
2465 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
2466 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
2467 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
2468 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
2469 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
2470 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
2471 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
2472 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
2473 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
2474 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
2475 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
2476 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
2478 get_component_mapping(srcFormat,
2479 &rSrc, &gSrc, &bSrc, &aSrc,
2480 &rDst, &gDst, &bDst, &aDst);
2482 stride = _mesa_components_in_format(srcFormat);
2484 intFormat = _mesa_is_integer_format(srcFormat);
2486 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2487 if ((SRC_INDEX) < 0) { \
2490 for (i = 0; i < n; i++) { \
2491 rgba[i][DST_INDEX] = DEFAULT_INT; \
2495 for (i = 0; i < n; i++) { \
2496 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2500 else if (swapBytes) { \
2501 const TYPE *s = (const TYPE *) src; \
2503 for (i = 0; i < n; i++) { \
2504 TYPE value = s[SRC_INDEX]; \
2505 if (sizeof(TYPE) == 2) { \
2508 else if (sizeof(TYPE) == 4) { \
2512 rgba[i][DST_INDEX] = (GLfloat) value; \
2514 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2519 const TYPE *s = (const TYPE *) src; \
2522 for (i = 0; i < n; i++) { \
2523 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2528 for (i = 0; i < n; i++) { \
2529 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2536 case GL_UNSIGNED_BYTE:
2537 PROCESS(rSrc, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2538 PROCESS(gSrc, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2539 PROCESS(bSrc, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
2540 PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
2543 PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2544 PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2545 PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ);
2546 PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ);
2548 case GL_UNSIGNED_SHORT:
2549 PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2550 PROCESS(gSrc, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2551 PROCESS(bSrc, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
2552 PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
2555 PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2556 PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2557 PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ);
2558 PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ);
2560 case GL_UNSIGNED_INT:
2561 PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2562 PROCESS(gSrc, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2563 PROCESS(bSrc, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
2564 PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
2567 PROCESS(rSrc, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2568 PROCESS(gSrc, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2569 PROCESS(bSrc, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
2570 PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
2573 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2574 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2575 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
2576 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
2578 case GL_HALF_FLOAT_ARB:
2579 PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2580 PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2581 PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
2582 PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
2584 case GL_UNSIGNED_BYTE_3_3_2:
2586 const GLubyte *ubsrc = (const GLubyte *) src;
2593 for (i = 0; i < n; i ++) {
2594 GLubyte p = ubsrc[i];
2595 rgba[i][rDst] = ((p >> 5) ) * rs;
2596 rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
2597 rgba[i][bDst] = ((p ) & 0x3) * bs;
2598 rgba[i][aDst] = 1.0F;
2602 case GL_UNSIGNED_BYTE_2_3_3_REV:
2604 const GLubyte *ubsrc = (const GLubyte *) src;
2611 for (i = 0; i < n; i ++) {
2612 GLubyte p = ubsrc[i];
2613 rgba[i][rDst] = ((p ) & 0x7) * rs;
2614 rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
2615 rgba[i][bDst] = ((p >> 6) ) * bs;
2616 rgba[i][aDst] = 1.0F;
2620 case GL_UNSIGNED_SHORT_5_6_5:
2627 const GLushort *ussrc = (const GLushort *) src;
2629 for (i = 0; i < n; i ++) {
2630 GLushort p = ussrc[i];
2632 rgba[i][rDst] = ((p >> 11) ) * rs;
2633 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2634 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2635 rgba[i][aDst] = 1.0F;
2639 const GLushort *ussrc = (const GLushort *) src;
2641 for (i = 0; i < n; i ++) {
2642 GLushort p = ussrc[i];
2643 rgba[i][rDst] = ((p >> 11) ) * rs;
2644 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2645 rgba[i][bDst] = ((p ) & 0x1f) * bs;
2646 rgba[i][aDst] = 1.0F;
2650 case GL_UNSIGNED_SHORT_5_6_5_REV:
2657 const GLushort *ussrc = (const GLushort *) src;
2659 for (i = 0; i < n; i ++) {
2660 GLushort p = ussrc[i];
2662 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2663 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2664 rgba[i][bDst] = ((p >> 11) ) * bs;
2665 rgba[i][aDst] = 1.0F;
2669 const GLushort *ussrc = (const GLushort *) src;
2671 for (i = 0; i < n; i ++) {
2672 GLushort p = ussrc[i];
2673 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2674 rgba[i][gDst] = ((p >> 5) & 0x3f) * gs;
2675 rgba[i][bDst] = ((p >> 11) ) * bs;
2676 rgba[i][aDst] = 1.0F;
2680 case GL_UNSIGNED_SHORT_4_4_4_4:
2682 rs = gs = bs = as = 1.0F / 15.0F;
2685 const GLushort *ussrc = (const GLushort *) src;
2687 for (i = 0; i < n; i ++) {
2688 GLushort p = ussrc[i];
2690 rgba[i][rDst] = ((p >> 12) ) * rs;
2691 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2692 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2693 rgba[i][aDst] = ((p ) & 0xf) * as;
2697 const GLushort *ussrc = (const GLushort *) src;
2699 for (i = 0; i < n; i ++) {
2700 GLushort p = ussrc[i];
2701 rgba[i][rDst] = ((p >> 12) ) * rs;
2702 rgba[i][gDst] = ((p >> 8) & 0xf) * gs;
2703 rgba[i][bDst] = ((p >> 4) & 0xf) * bs;
2704 rgba[i][aDst] = ((p ) & 0xf) * as;
2708 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
2710 rs = gs = bs = as = 1.0F / 15.0F;
2713 const GLushort *ussrc = (const GLushort *) src;
2715 for (i = 0; i < n; i ++) {
2716 GLushort p = ussrc[i];
2718 rgba[i][rDst] = ((p ) & 0xf) * rs;
2719 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2720 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2721 rgba[i][aDst] = ((p >> 12) ) * as;
2725 const GLushort *ussrc = (const GLushort *) src;
2727 for (i = 0; i < n; i ++) {
2728 GLushort p = ussrc[i];
2729 rgba[i][rDst] = ((p ) & 0xf) * rs;
2730 rgba[i][gDst] = ((p >> 4) & 0xf) * gs;
2731 rgba[i][bDst] = ((p >> 8) & 0xf) * bs;
2732 rgba[i][aDst] = ((p >> 12) ) * as;
2736 case GL_UNSIGNED_SHORT_5_5_5_1:
2738 rs = gs = bs = 1.0F / 31.0F;
2741 const GLushort *ussrc = (const GLushort *) src;
2743 for (i = 0; i < n; i ++) {
2744 GLushort p = ussrc[i];
2746 rgba[i][rDst] = ((p >> 11) ) * rs;
2747 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2748 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2749 rgba[i][aDst] = ((p ) & 0x1) * as;
2753 const GLushort *ussrc = (const GLushort *) src;
2755 for (i = 0; i < n; i ++) {
2756 GLushort p = ussrc[i];
2757 rgba[i][rDst] = ((p >> 11) ) * rs;
2758 rgba[i][gDst] = ((p >> 6) & 0x1f) * gs;
2759 rgba[i][bDst] = ((p >> 1) & 0x1f) * bs;
2760 rgba[i][aDst] = ((p ) & 0x1) * as;
2764 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
2766 rs = gs = bs = 1.0F / 31.0F;
2769 const GLushort *ussrc = (const GLushort *) src;
2771 for (i = 0; i < n; i ++) {
2772 GLushort p = ussrc[i];
2774 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2775 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2776 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2777 rgba[i][aDst] = ((p >> 15) ) * as;
2781 const GLushort *ussrc = (const GLushort *) src;
2783 for (i = 0; i < n; i ++) {
2784 GLushort p = ussrc[i];
2785 rgba[i][rDst] = ((p ) & 0x1f) * rs;
2786 rgba[i][gDst] = ((p >> 5) & 0x1f) * gs;
2787 rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
2788 rgba[i][aDst] = ((p >> 15) ) * as;
2792 case GL_UNSIGNED_INT_8_8_8_8:
2794 const GLuint *uisrc = (const GLuint *) src;
2797 for (i = 0; i < n; i ++) {
2798 GLuint p = uisrc[i];
2799 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2800 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2801 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2802 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2806 for (i = 0; i < n; i ++) {
2807 GLuint p = uisrc[i];
2808 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2809 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2810 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2811 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2816 const GLuint *uisrc = (const GLuint *) src;
2819 for (i = 0; i < n; i ++) {
2820 GLuint p = uisrc[i];
2821 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2822 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2823 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2824 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2828 for (i = 0; i < n; i ++) {
2829 GLuint p = uisrc[i];
2830 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2831 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2832 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2833 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2838 case GL_UNSIGNED_INT_8_8_8_8_REV:
2840 const GLuint *uisrc = (const GLuint *) src;
2843 for (i = 0; i < n; i ++) {
2844 GLuint p = uisrc[i];
2845 rgba[i][rDst] = (GLfloat) ((p >> 24) );
2846 rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
2847 rgba[i][bDst] = (GLfloat) ((p >> 8) & 0xff);
2848 rgba[i][aDst] = (GLfloat) ((p ) & 0xff);
2852 for (i = 0; i < n; i ++) {
2853 GLuint p = uisrc[i];
2854 rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24) );
2855 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2856 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2857 rgba[i][aDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2862 const GLuint *uisrc = (const GLuint *) src;
2865 for (i = 0; i < n; i ++) {
2866 GLuint p = uisrc[i];
2867 rgba[i][rDst] = (GLfloat) ((p ) & 0xff);
2868 rgba[i][gDst] = (GLfloat) ((p >> 8) & 0xff);
2869 rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
2870 rgba[i][aDst] = (GLfloat) ((p >> 24) );
2874 for (i = 0; i < n; i ++) {
2875 GLuint p = uisrc[i];
2876 rgba[i][rDst] = UBYTE_TO_FLOAT((p ) & 0xff);
2877 rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 8) & 0xff);
2878 rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
2879 rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24) );
2884 case GL_UNSIGNED_INT_10_10_10_2:
2886 rs = 1.0F / 1023.0F;
2887 gs = 1.0F / 1023.0F;
2888 bs = 1.0F / 1023.0F;
2892 const GLuint *uisrc = (const GLuint *) src;
2894 for (i = 0; i < n; i ++) {
2895 GLuint p = uisrc[i];
2897 rgba[i][rDst] = ((p >> 22) ) * rs;
2898 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2899 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2900 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2904 const GLuint *uisrc = (const GLuint *) src;
2906 for (i = 0; i < n; i ++) {
2907 GLuint p = uisrc[i];
2908 rgba[i][rDst] = ((p >> 22) ) * rs;
2909 rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
2910 rgba[i][bDst] = ((p >> 2) & 0x3ff) * bs;
2911 rgba[i][aDst] = ((p ) & 0x3 ) * as;
2915 case GL_UNSIGNED_INT_2_10_10_10_REV:
2917 rs = 1.0F / 1023.0F;
2918 gs = 1.0F / 1023.0F;
2919 bs = 1.0F / 1023.0F;
2923 const GLuint *uisrc = (const GLuint *) src;
2925 for (i = 0; i < n; i ++) {
2926 GLuint p = uisrc[i];
2928 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2929 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2930 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2931 rgba[i][aDst] = ((p >> 30) ) * as;
2935 const GLuint *uisrc = (const GLuint *) src;
2937 for (i = 0; i < n; i ++) {
2938 GLuint p = uisrc[i];
2939 rgba[i][rDst] = ((p ) & 0x3ff) * rs;
2940 rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
2941 rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
2942 rgba[i][aDst] = ((p >> 30) ) * as;
2946 case GL_UNSIGNED_INT_5_9_9_9_REV:
2948 const GLuint *uisrc = (const GLuint *) src;
2951 for (i = 0; i < n; i ++) {
2952 GLuint p = uisrc[i];
2954 rgb9e5_to_float3(p, f);
2955 rgba[i][rDst] = f[0];
2956 rgba[i][gDst] = f[1];
2957 rgba[i][bDst] = f[2];
2958 rgba[i][aDst] = 1.0F;
2962 const GLuint *uisrc = (const GLuint *) src;
2965 for (i = 0; i < n; i ++) {
2966 rgb9e5_to_float3(uisrc[i], f);
2967 rgba[i][rDst] = f[0];
2968 rgba[i][gDst] = f[1];
2969 rgba[i][bDst] = f[2];
2970 rgba[i][aDst] = 1.0F;
2974 case GL_UNSIGNED_INT_10F_11F_11F_REV:
2976 const GLuint *uisrc = (const GLuint *) src;
2979 for (i = 0; i < n; i ++) {
2980 GLuint p = uisrc[i];
2982 r11g11b10f_to_float3(p, f);
2983 rgba[i][rDst] = f[0];
2984 rgba[i][gDst] = f[1];
2985 rgba[i][bDst] = f[2];
2986 rgba[i][aDst] = 1.0F;
2990 const GLuint *uisrc = (const GLuint *) src;
2993 for (i = 0; i < n; i ++) {
2994 r11g11b10f_to_float3(uisrc[i], f);
2995 rgba[i][rDst] = f[0];
2996 rgba[i][gDst] = f[1];
2997 rgba[i][bDst] = f[2];
2998 rgba[i][aDst] = 1.0F;
3003 _mesa_problem(NULL, "bad srcType in extract float data");
3010 static inline GLuint
3011 clamp_byte_to_uint(GLbyte b)
3013 return b < 0 ? 0 : b;
3017 static inline GLuint
3018 clamp_short_to_uint(GLshort s)
3020 return s < 0 ? 0 : s;
3024 static inline GLuint
3025 clamp_int_to_uint(GLint i)
3027 return i < 0 ? 0 : i;
3031 static inline GLuint
3032 clamp_float_to_uint(GLfloat f)
3034 return f < 0.0F ? 0 : IROUND(f);
3038 static inline GLuint
3039 clamp_half_to_uint(GLhalfARB h)
3041 GLfloat f = _mesa_half_to_float(h);
3042 return f < 0.0F ? 0 : IROUND(f);
3047 * \sa extract_float_rgba()
3050 extract_uint_rgba(GLuint n, GLuint rgba[][4],
3051 GLenum srcFormat, GLenum srcType, const GLvoid *src,
3052 GLboolean swapBytes)
3054 GLint rSrc, gSrc, bSrc, aSrc;
3056 GLint rDst, bDst, gDst, aDst;
3058 ASSERT(srcFormat == GL_RED ||
3059 srcFormat == GL_GREEN ||
3060 srcFormat == GL_BLUE ||
3061 srcFormat == GL_ALPHA ||
3062 srcFormat == GL_LUMINANCE ||
3063 srcFormat == GL_LUMINANCE_ALPHA ||
3064 srcFormat == GL_INTENSITY ||
3065 srcFormat == GL_RG ||
3066 srcFormat == GL_RGB ||
3067 srcFormat == GL_BGR ||
3068 srcFormat == GL_RGBA ||
3069 srcFormat == GL_BGRA ||
3070 srcFormat == GL_ABGR_EXT ||
3071 srcFormat == GL_DU8DV8_ATI ||
3072 srcFormat == GL_DUDV_ATI ||
3073 srcFormat == GL_RED_INTEGER_EXT ||
3074 srcFormat == GL_RG_INTEGER ||
3075 srcFormat == GL_GREEN_INTEGER_EXT ||
3076 srcFormat == GL_BLUE_INTEGER_EXT ||
3077 srcFormat == GL_ALPHA_INTEGER_EXT ||
3078 srcFormat == GL_RGB_INTEGER_EXT ||
3079 srcFormat == GL_RGBA_INTEGER_EXT ||
3080 srcFormat == GL_BGR_INTEGER_EXT ||
3081 srcFormat == GL_BGRA_INTEGER_EXT ||
3082 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3083 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
3085 ASSERT(srcType == GL_UNSIGNED_BYTE ||
3086 srcType == GL_BYTE ||
3087 srcType == GL_UNSIGNED_SHORT ||
3088 srcType == GL_SHORT ||
3089 srcType == GL_UNSIGNED_INT ||
3090 srcType == GL_INT ||
3091 srcType == GL_HALF_FLOAT_ARB ||
3092 srcType == GL_FLOAT ||
3093 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3094 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3095 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3096 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3097 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3098 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3099 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3100 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3101 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3102 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3103 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3104 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3105 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3106 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3108 get_component_mapping(srcFormat,
3109 &rSrc, &gSrc, &bSrc, &aSrc,
3110 &rDst, &gDst, &bDst, &aDst);
3112 stride = _mesa_components_in_format(srcFormat);
3114 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3115 if ((SRC_INDEX) < 0) { \
3117 for (i = 0; i < n; i++) { \
3118 rgba[i][DST_INDEX] = DEFAULT; \
3121 else if (swapBytes) { \
3122 const TYPE *s = (const TYPE *) src; \
3124 for (i = 0; i < n; i++) { \
3125 TYPE value = s[SRC_INDEX]; \
3126 if (sizeof(TYPE) == 2) { \
3129 else if (sizeof(TYPE) == 4) { \
3132 rgba[i][DST_INDEX] = CONVERSION(value); \
3137 const TYPE *s = (const TYPE *) src; \
3139 for (i = 0; i < n; i++) { \
3140 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3146 case GL_UNSIGNED_BYTE:
3147 PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
3148 PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
3149 PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
3150 PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
3153 PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint);
3154 PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint);
3155 PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint);
3156 PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint);
3158 case GL_UNSIGNED_SHORT:
3159 PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
3160 PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
3161 PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
3162 PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
3165 PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint);
3166 PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint);
3167 PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint);
3168 PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint);
3170 case GL_UNSIGNED_INT:
3171 PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
3172 PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
3173 PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
3174 PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
3177 PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint);
3178 PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint);
3179 PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint);
3180 PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint);
3183 PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
3184 PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
3185 PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
3186 PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
3188 case GL_HALF_FLOAT_ARB:
3189 PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
3190 PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
3191 PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
3192 PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
3194 case GL_UNSIGNED_BYTE_3_3_2:
3196 const GLubyte *ubsrc = (const GLubyte *) src;
3198 for (i = 0; i < n; i ++) {
3199 GLubyte p = ubsrc[i];
3200 rgba[i][rDst] = ((p >> 5) );
3201 rgba[i][gDst] = ((p >> 2) & 0x7);
3202 rgba[i][bDst] = ((p ) & 0x3);
3207 case GL_UNSIGNED_BYTE_2_3_3_REV:
3209 const GLubyte *ubsrc = (const GLubyte *) src;
3211 for (i = 0; i < n; i ++) {
3212 GLubyte p = ubsrc[i];
3213 rgba[i][rDst] = ((p ) & 0x7);
3214 rgba[i][gDst] = ((p >> 3) & 0x7);
3215 rgba[i][bDst] = ((p >> 6) );
3220 case GL_UNSIGNED_SHORT_5_6_5:
3222 const GLushort *ussrc = (const GLushort *) src;
3224 for (i = 0; i < n; i ++) {
3225 GLushort p = ussrc[i];
3227 rgba[i][rDst] = ((p >> 11) );
3228 rgba[i][gDst] = ((p >> 5) & 0x3f);
3229 rgba[i][bDst] = ((p ) & 0x1f);
3234 const GLushort *ussrc = (const GLushort *) src;
3236 for (i = 0; i < n; i ++) {
3237 GLushort p = ussrc[i];
3238 rgba[i][rDst] = ((p >> 11) );
3239 rgba[i][gDst] = ((p >> 5) & 0x3f);
3240 rgba[i][bDst] = ((p ) & 0x1f);
3245 case GL_UNSIGNED_SHORT_5_6_5_REV:
3247 const GLushort *ussrc = (const GLushort *) src;
3249 for (i = 0; i < n; i ++) {
3250 GLushort p = ussrc[i];
3252 rgba[i][rDst] = ((p ) & 0x1f);
3253 rgba[i][gDst] = ((p >> 5) & 0x3f);
3254 rgba[i][bDst] = ((p >> 11) );
3259 const GLushort *ussrc = (const GLushort *) src;
3261 for (i = 0; i < n; i ++) {
3262 GLushort p = ussrc[i];
3263 rgba[i][rDst] = ((p ) & 0x1f);
3264 rgba[i][gDst] = ((p >> 5) & 0x3f);
3265 rgba[i][bDst] = ((p >> 11) );
3270 case GL_UNSIGNED_SHORT_4_4_4_4:
3272 const GLushort *ussrc = (const GLushort *) src;
3274 for (i = 0; i < n; i ++) {
3275 GLushort p = ussrc[i];
3277 rgba[i][rDst] = ((p >> 12) );
3278 rgba[i][gDst] = ((p >> 8) & 0xf);
3279 rgba[i][bDst] = ((p >> 4) & 0xf);
3280 rgba[i][aDst] = ((p ) & 0xf);
3284 const GLushort *ussrc = (const GLushort *) src;
3286 for (i = 0; i < n; i ++) {
3287 GLushort p = ussrc[i];
3288 rgba[i][rDst] = ((p >> 12) );
3289 rgba[i][gDst] = ((p >> 8) & 0xf);
3290 rgba[i][bDst] = ((p >> 4) & 0xf);
3291 rgba[i][aDst] = ((p ) & 0xf);
3295 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
3297 const GLushort *ussrc = (const GLushort *) src;
3299 for (i = 0; i < n; i ++) {
3300 GLushort p = ussrc[i];
3302 rgba[i][rDst] = ((p ) & 0xf);
3303 rgba[i][gDst] = ((p >> 4) & 0xf);
3304 rgba[i][bDst] = ((p >> 8) & 0xf);
3305 rgba[i][aDst] = ((p >> 12) );
3309 const GLushort *ussrc = (const GLushort *) src;
3311 for (i = 0; i < n; i ++) {
3312 GLushort p = ussrc[i];
3313 rgba[i][rDst] = ((p ) & 0xf);
3314 rgba[i][gDst] = ((p >> 4) & 0xf);
3315 rgba[i][bDst] = ((p >> 8) & 0xf);
3316 rgba[i][aDst] = ((p >> 12) );
3320 case GL_UNSIGNED_SHORT_5_5_5_1:
3322 const GLushort *ussrc = (const GLushort *) src;
3324 for (i = 0; i < n; i ++) {
3325 GLushort p = ussrc[i];
3327 rgba[i][rDst] = ((p >> 11) );
3328 rgba[i][gDst] = ((p >> 6) & 0x1f);
3329 rgba[i][bDst] = ((p >> 1) & 0x1f);
3330 rgba[i][aDst] = ((p ) & 0x1 );
3334 const GLushort *ussrc = (const GLushort *) src;
3336 for (i = 0; i < n; i ++) {
3337 GLushort p = ussrc[i];
3338 rgba[i][rDst] = ((p >> 11) );
3339 rgba[i][gDst] = ((p >> 6) & 0x1f);
3340 rgba[i][bDst] = ((p >> 1) & 0x1f);
3341 rgba[i][aDst] = ((p ) & 0x1 );
3345 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
3347 const GLushort *ussrc = (const GLushort *) src;
3349 for (i = 0; i < n; i ++) {
3350 GLushort p = ussrc[i];
3352 rgba[i][rDst] = ((p ) & 0x1f);
3353 rgba[i][gDst] = ((p >> 5) & 0x1f);
3354 rgba[i][bDst] = ((p >> 10) & 0x1f);
3355 rgba[i][aDst] = ((p >> 15) );
3359 const GLushort *ussrc = (const GLushort *) src;
3361 for (i = 0; i < n; i ++) {
3362 GLushort p = ussrc[i];
3363 rgba[i][rDst] = ((p ) & 0x1f);
3364 rgba[i][gDst] = ((p >> 5) & 0x1f);
3365 rgba[i][bDst] = ((p >> 10) & 0x1f);
3366 rgba[i][aDst] = ((p >> 15) );
3370 case GL_UNSIGNED_INT_8_8_8_8:
3372 const GLuint *uisrc = (const GLuint *) src;
3374 for (i = 0; i < n; i ++) {
3375 GLuint p = uisrc[i];
3376 rgba[i][rDst] = ((p ) & 0xff);
3377 rgba[i][gDst] = ((p >> 8) & 0xff);
3378 rgba[i][bDst] = ((p >> 16) & 0xff);
3379 rgba[i][aDst] = ((p >> 24) );
3383 const GLuint *uisrc = (const GLuint *) src;
3385 for (i = 0; i < n; i ++) {
3386 GLuint p = uisrc[i];
3387 rgba[i][rDst] = ((p >> 24) );
3388 rgba[i][gDst] = ((p >> 16) & 0xff);
3389 rgba[i][bDst] = ((p >> 8) & 0xff);
3390 rgba[i][aDst] = ((p ) & 0xff);
3394 case GL_UNSIGNED_INT_8_8_8_8_REV:
3396 const GLuint *uisrc = (const GLuint *) src;
3398 for (i = 0; i < n; i ++) {
3399 GLuint p = uisrc[i];
3400 rgba[i][rDst] = ((p >> 24) );
3401 rgba[i][gDst] = ((p >> 16) & 0xff);
3402 rgba[i][bDst] = ((p >> 8) & 0xff);
3403 rgba[i][aDst] = ((p ) & 0xff);
3407 const GLuint *uisrc = (const GLuint *) src;
3409 for (i = 0; i < n; i ++) {
3410 GLuint p = uisrc[i];
3411 rgba[i][rDst] = ((p ) & 0xff);
3412 rgba[i][gDst] = ((p >> 8) & 0xff);
3413 rgba[i][bDst] = ((p >> 16) & 0xff);
3414 rgba[i][aDst] = ((p >> 24) );
3418 case GL_UNSIGNED_INT_10_10_10_2:
3420 const GLuint *uisrc = (const GLuint *) src;
3422 for (i = 0; i < n; i ++) {
3423 GLuint p = uisrc[i];
3425 rgba[i][rDst] = ((p >> 22) );
3426 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3427 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3428 rgba[i][aDst] = ((p ) & 0x3 );
3432 const GLuint *uisrc = (const GLuint *) src;
3434 for (i = 0; i < n; i ++) {
3435 GLuint p = uisrc[i];
3436 rgba[i][rDst] = ((p >> 22) );
3437 rgba[i][gDst] = ((p >> 12) & 0x3ff);
3438 rgba[i][bDst] = ((p >> 2) & 0x3ff);
3439 rgba[i][aDst] = ((p ) & 0x3 );
3443 case GL_UNSIGNED_INT_2_10_10_10_REV:
3445 const GLuint *uisrc = (const GLuint *) src;
3447 for (i = 0; i < n; i ++) {
3448 GLuint p = uisrc[i];
3450 rgba[i][rDst] = ((p ) & 0x3ff);
3451 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3452 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3453 rgba[i][aDst] = ((p >> 30) );
3457 const GLuint *uisrc = (const GLuint *) src;
3459 for (i = 0; i < n; i ++) {
3460 GLuint p = uisrc[i];
3461 rgba[i][rDst] = ((p ) & 0x3ff);
3462 rgba[i][gDst] = ((p >> 10) & 0x3ff);
3463 rgba[i][bDst] = ((p >> 20) & 0x3ff);
3464 rgba[i][aDst] = ((p >> 30) );
3468 case GL_UNSIGNED_INT_5_9_9_9_REV:
3470 const GLuint *uisrc = (const GLuint *) src;
3473 for (i = 0; i < n; i ++) {
3474 GLuint p = uisrc[i];
3476 rgb9e5_to_float3(p, f);
3477 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3478 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3479 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3484 const GLuint *uisrc = (const GLuint *) src;
3487 for (i = 0; i < n; i ++) {
3488 GLuint p = uisrc[i];
3489 rgb9e5_to_float3(p, f);
3490 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3491 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3492 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3497 case GL_UNSIGNED_INT_10F_11F_11F_REV:
3499 const GLuint *uisrc = (const GLuint *) src;
3502 for (i = 0; i < n; i ++) {
3503 GLuint p = uisrc[i];
3505 r11g11b10f_to_float3(p, f);
3506 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3507 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3508 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3513 const GLuint *uisrc = (const GLuint *) src;
3516 for (i = 0; i < n; i ++) {
3517 GLuint p = uisrc[i];
3518 r11g11b10f_to_float3(p, f);
3519 rgba[i][rDst] = clamp_float_to_uint(f[0]);
3520 rgba[i][gDst] = clamp_float_to_uint(f[1]);
3521 rgba[i][bDst] = clamp_float_to_uint(f[2]);
3527 _mesa_problem(NULL, "bad srcType in extract uint data");
3536 * Unpack a row of color image data from a client buffer according to
3537 * the pixel unpacking parameters.
3538 * Return GLubyte values in the specified dest image format.
3539 * This is used by glDrawPixels and glTexImage?D().
3540 * \param ctx - the context
3541 * n - number of pixels in the span
3542 * dstFormat - format of destination color array
3543 * dest - the destination color array
3544 * srcFormat - source image format
3545 * srcType - source image data type
3546 * source - source image pointer
3547 * srcPacking - pixel unpacking parameters
3548 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3550 * XXX perhaps expand this to process whole images someday.
3553 _mesa_unpack_color_span_ubyte(struct gl_context *ctx,
3554 GLuint n, GLenum dstFormat, GLubyte dest[],
3555 GLenum srcFormat, GLenum srcType,
3556 const GLvoid *source,
3557 const struct gl_pixelstore_attrib *srcPacking,
3558 GLbitfield transferOps )
3560 GLboolean intFormat = _mesa_is_integer_format(srcFormat);
3561 ASSERT(dstFormat == GL_ALPHA ||
3562 dstFormat == GL_LUMINANCE ||
3563 dstFormat == GL_LUMINANCE_ALPHA ||
3564 dstFormat == GL_INTENSITY ||
3565 dstFormat == GL_RED ||
3566 dstFormat == GL_RG ||
3567 dstFormat == GL_RGB ||
3568 dstFormat == GL_RGBA);
3570 ASSERT(srcFormat == GL_RED ||
3571 srcFormat == GL_GREEN ||
3572 srcFormat == GL_BLUE ||
3573 srcFormat == GL_ALPHA ||
3574 srcFormat == GL_LUMINANCE ||
3575 srcFormat == GL_LUMINANCE_ALPHA ||
3576 srcFormat == GL_INTENSITY ||
3577 srcFormat == GL_RG ||
3578 srcFormat == GL_RGB ||
3579 srcFormat == GL_BGR ||
3580 srcFormat == GL_RGBA ||
3581 srcFormat == GL_BGRA ||
3582 srcFormat == GL_ABGR_EXT ||
3583 srcFormat == GL_COLOR_INDEX);
3585 ASSERT(srcType == GL_BITMAP ||
3586 srcType == GL_UNSIGNED_BYTE ||
3587 srcType == GL_BYTE ||
3588 srcType == GL_UNSIGNED_SHORT ||
3589 srcType == GL_SHORT ||
3590 srcType == GL_UNSIGNED_INT ||
3591 srcType == GL_INT ||
3592 srcType == GL_HALF_FLOAT_ARB ||
3593 srcType == GL_FLOAT ||
3594 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3595 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3596 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3597 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3598 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3599 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3600 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3601 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3602 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3603 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3604 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3605 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3606 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3607 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3609 /* EXT_texture_integer specifies no transfer ops on integer
3610 * types in the resolved issues section. Just set them to 0
3611 * for integer surfaces.
3616 /* Try simple cases first */
3617 if (transferOps == 0) {
3618 if (srcType == GL_UNSIGNED_BYTE) {
3619 if (dstFormat == GL_RGBA) {
3620 if (srcFormat == GL_RGBA) {
3621 memcpy( dest, source, n * 4 * sizeof(GLubyte) );
3624 else if (srcFormat == GL_RGB) {
3626 const GLubyte *src = (const GLubyte *) source;
3627 GLubyte *dst = dest;
3628 for (i = 0; i < n; i++) {
3639 else if (dstFormat == GL_RGB) {
3640 if (srcFormat == GL_RGB) {
3641 memcpy( dest, source, n * 3 * sizeof(GLubyte) );
3644 else if (srcFormat == GL_RGBA) {
3646 const GLubyte *src = (const GLubyte *) source;
3647 GLubyte *dst = dest;
3648 for (i = 0; i < n; i++) {
3658 else if (dstFormat == srcFormat) {
3659 GLint comps = _mesa_components_in_format(srcFormat);
3661 memcpy( dest, source, n * comps * sizeof(GLubyte) );
3668 /* general solution begins here */
3670 GLint dstComponents;
3671 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3672 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3675 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3679 dstComponents = _mesa_components_in_format( dstFormat );
3680 /* source & dest image formats should have been error checked by now */
3681 assert(dstComponents > 0);
3684 * Extract image data and convert to RGBA floats
3686 if (srcFormat == GL_COLOR_INDEX) {
3687 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3690 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3695 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3698 /* Convert indexes to RGBA */
3699 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3700 _mesa_shift_and_offset_ci(ctx, n, indexes);
3702 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3704 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3705 * with color indexes.
3707 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3712 /* non-color index data */
3713 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3714 srcPacking->SwapBytes);
3717 /* Need to clamp if returning GLubytes */
3718 transferOps |= IMAGE_CLAMP_BIT;
3721 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3724 get_component_indexes(dstFormat,
3725 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3727 /* Now return the GLubyte data in the requested dstFormat */
3729 GLubyte *dst = dest;
3731 for (i = 0; i < n; i++) {
3732 CLAMPED_FLOAT_TO_UBYTE(dst[rDst], rgba[i][RCOMP]);
3733 dst += dstComponents;
3738 GLubyte *dst = dest;
3740 for (i = 0; i < n; i++) {
3741 CLAMPED_FLOAT_TO_UBYTE(dst[gDst], rgba[i][GCOMP]);
3742 dst += dstComponents;
3747 GLubyte *dst = dest;
3749 for (i = 0; i < n; i++) {
3750 CLAMPED_FLOAT_TO_UBYTE(dst[bDst], rgba[i][BCOMP]);
3751 dst += dstComponents;
3756 GLubyte *dst = dest;
3758 for (i = 0; i < n; i++) {
3759 CLAMPED_FLOAT_TO_UBYTE(dst[aDst], rgba[i][ACOMP]);
3760 dst += dstComponents;
3765 GLubyte *dst = dest;
3768 assert(dstComponents == 1);
3769 for (i = 0; i < n; i++) {
3770 /* Intensity comes from red channel */
3771 CLAMPED_FLOAT_TO_UBYTE(dst[i], rgba[i][RCOMP]);
3776 GLubyte *dst = dest;
3779 for (i = 0; i < n; i++) {
3780 /* Luminance comes from red channel */
3781 CLAMPED_FLOAT_TO_UBYTE(dst[0], rgba[i][RCOMP]);
3782 dst += dstComponents;
3792 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3793 * instead of GLubyte.
3796 _mesa_unpack_color_span_float( struct gl_context *ctx,
3797 GLuint n, GLenum dstFormat, GLfloat dest[],
3798 GLenum srcFormat, GLenum srcType,
3799 const GLvoid *source,
3800 const struct gl_pixelstore_attrib *srcPacking,
3801 GLbitfield transferOps )
3803 ASSERT(dstFormat == GL_ALPHA ||
3804 dstFormat == GL_LUMINANCE ||
3805 dstFormat == GL_LUMINANCE_ALPHA ||
3806 dstFormat == GL_INTENSITY ||
3807 dstFormat == GL_RED ||
3808 dstFormat == GL_RG ||
3809 dstFormat == GL_RGB ||
3810 dstFormat == GL_RGBA);
3812 ASSERT(srcFormat == GL_RED ||
3813 srcFormat == GL_GREEN ||
3814 srcFormat == GL_BLUE ||
3815 srcFormat == GL_ALPHA ||
3816 srcFormat == GL_LUMINANCE ||
3817 srcFormat == GL_LUMINANCE_ALPHA ||
3818 srcFormat == GL_INTENSITY ||
3819 srcFormat == GL_RG ||
3820 srcFormat == GL_RGB ||
3821 srcFormat == GL_BGR ||
3822 srcFormat == GL_RGBA ||
3823 srcFormat == GL_BGRA ||
3824 srcFormat == GL_ABGR_EXT ||
3825 srcFormat == GL_RED_INTEGER_EXT ||
3826 srcFormat == GL_GREEN_INTEGER_EXT ||
3827 srcFormat == GL_BLUE_INTEGER_EXT ||
3828 srcFormat == GL_ALPHA_INTEGER_EXT ||
3829 srcFormat == GL_RG_INTEGER ||
3830 srcFormat == GL_RGB_INTEGER_EXT ||
3831 srcFormat == GL_RGBA_INTEGER_EXT ||
3832 srcFormat == GL_BGR_INTEGER_EXT ||
3833 srcFormat == GL_BGRA_INTEGER_EXT ||
3834 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
3835 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
3836 srcFormat == GL_COLOR_INDEX);
3838 ASSERT(srcType == GL_BITMAP ||
3839 srcType == GL_UNSIGNED_BYTE ||
3840 srcType == GL_BYTE ||
3841 srcType == GL_UNSIGNED_SHORT ||
3842 srcType == GL_SHORT ||
3843 srcType == GL_UNSIGNED_INT ||
3844 srcType == GL_INT ||
3845 srcType == GL_HALF_FLOAT_ARB ||
3846 srcType == GL_FLOAT ||
3847 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
3848 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
3849 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
3850 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
3851 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
3852 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
3853 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
3854 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
3855 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
3856 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
3857 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
3858 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
3859 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
3860 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
3862 /* general solution, no special cases, yet */
3864 GLint dstComponents;
3865 GLint rDst, gDst, bDst, aDst, lDst, iDst;
3866 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
3867 GLboolean intFormat = _mesa_is_integer_format(srcFormat);
3870 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3874 dstComponents = _mesa_components_in_format( dstFormat );
3875 /* source & dest image formats should have been error checked by now */
3876 assert(dstComponents > 0);
3878 /* EXT_texture_integer specifies no transfer ops on integer
3879 * types in the resolved issues section. Just set them to 0
3880 * for integer surfaces.
3886 * Extract image data and convert to RGBA floats
3888 if (srcFormat == GL_COLOR_INDEX) {
3889 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
3892 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
3897 extract_uint_indexes(n, indexes, srcFormat, srcType, source,
3900 /* Convert indexes to RGBA */
3901 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
3902 _mesa_shift_and_offset_ci(ctx, n, indexes);
3904 _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
3906 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3907 * with color indexes.
3909 transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
3914 /* non-color index data */
3915 extract_float_rgba(n, rgba, srcFormat, srcType, source,
3916 srcPacking->SwapBytes);
3920 _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
3923 get_component_indexes(dstFormat,
3924 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
3926 /* Now pack results in the requested dstFormat */
3928 GLfloat *dst = dest;
3930 for (i = 0; i < n; i++) {
3931 dst[rDst] = rgba[i][RCOMP];
3932 dst += dstComponents;
3937 GLfloat *dst = dest;
3939 for (i = 0; i < n; i++) {
3940 dst[gDst] = rgba[i][GCOMP];
3941 dst += dstComponents;
3946 GLfloat *dst = dest;
3948 for (i = 0; i < n; i++) {
3949 dst[bDst] = rgba[i][BCOMP];
3950 dst += dstComponents;
3955 GLfloat *dst = dest;
3957 for (i = 0; i < n; i++) {
3958 dst[aDst] = rgba[i][ACOMP];
3959 dst += dstComponents;
3964 GLfloat *dst = dest;
3967 assert(dstComponents == 1);
3968 for (i = 0; i < n; i++) {
3969 /* Intensity comes from red channel */
3970 dst[i] = rgba[i][RCOMP];
3975 GLfloat *dst = dest;
3978 for (i = 0; i < n; i++) {
3979 /* Luminance comes from red channel */
3980 dst[0] = rgba[i][RCOMP];
3981 dst += dstComponents;
3991 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3992 * instead of GLubyte.
3993 * No pixel transfer ops are applied.
3996 _mesa_unpack_color_span_uint(struct gl_context *ctx,
3997 GLuint n, GLenum dstFormat, GLuint *dest,
3998 GLenum srcFormat, GLenum srcType,
3999 const GLvoid *source,
4000 const struct gl_pixelstore_attrib *srcPacking)
4002 GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
4005 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4009 ASSERT(dstFormat == GL_ALPHA ||
4010 dstFormat == GL_LUMINANCE ||
4011 dstFormat == GL_LUMINANCE_ALPHA ||
4012 dstFormat == GL_INTENSITY ||
4013 dstFormat == GL_RED ||
4014 dstFormat == GL_RG ||
4015 dstFormat == GL_RGB ||
4016 dstFormat == GL_RGBA);
4018 ASSERT(srcFormat == GL_RED ||
4019 srcFormat == GL_GREEN ||
4020 srcFormat == GL_BLUE ||
4021 srcFormat == GL_ALPHA ||
4022 srcFormat == GL_LUMINANCE ||
4023 srcFormat == GL_LUMINANCE_ALPHA ||
4024 srcFormat == GL_INTENSITY ||
4025 srcFormat == GL_RG ||
4026 srcFormat == GL_RGB ||
4027 srcFormat == GL_BGR ||
4028 srcFormat == GL_RGBA ||
4029 srcFormat == GL_BGRA ||
4030 srcFormat == GL_ABGR_EXT ||
4031 srcFormat == GL_RED_INTEGER_EXT ||
4032 srcFormat == GL_GREEN_INTEGER_EXT ||
4033 srcFormat == GL_BLUE_INTEGER_EXT ||
4034 srcFormat == GL_ALPHA_INTEGER_EXT ||
4035 srcFormat == GL_RG_INTEGER ||
4036 srcFormat == GL_RGB_INTEGER_EXT ||
4037 srcFormat == GL_RGBA_INTEGER_EXT ||
4038 srcFormat == GL_BGR_INTEGER_EXT ||
4039 srcFormat == GL_BGRA_INTEGER_EXT ||
4040 srcFormat == GL_LUMINANCE_INTEGER_EXT ||
4041 srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
4043 ASSERT(srcType == GL_UNSIGNED_BYTE ||
4044 srcType == GL_BYTE ||
4045 srcType == GL_UNSIGNED_SHORT ||
4046 srcType == GL_SHORT ||
4047 srcType == GL_UNSIGNED_INT ||
4048 srcType == GL_INT ||
4049 srcType == GL_HALF_FLOAT_ARB ||
4050 srcType == GL_FLOAT ||
4051 srcType == GL_UNSIGNED_BYTE_3_3_2 ||
4052 srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
4053 srcType == GL_UNSIGNED_SHORT_5_6_5 ||
4054 srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
4055 srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
4056 srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
4057 srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
4058 srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
4059 srcType == GL_UNSIGNED_INT_8_8_8_8 ||
4060 srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
4061 srcType == GL_UNSIGNED_INT_10_10_10_2 ||
4062 srcType == GL_UNSIGNED_INT_2_10_10_10_REV ||
4063 srcType == GL_UNSIGNED_INT_5_9_9_9_REV ||
4064 srcType == GL_UNSIGNED_INT_10F_11F_11F_REV);
4067 /* Extract image data as uint[4] pixels */
4068 extract_uint_rgba(n, rgba, srcFormat, srcType, source,
4069 srcPacking->SwapBytes);
4071 if (dstFormat == GL_RGBA) {
4073 memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
4077 GLint rDst, gDst, bDst, aDst, lDst, iDst;
4078 GLint dstComponents = _mesa_components_in_format( dstFormat );
4080 assert(dstComponents > 0);
4082 get_component_indexes(dstFormat,
4083 &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
4085 /* Now pack values in the requested dest format */
4089 for (i = 0; i < n; i++) {
4090 dst[rDst] = rgba[i][RCOMP];
4091 dst += dstComponents;
4098 for (i = 0; i < n; i++) {
4099 dst[gDst] = rgba[i][GCOMP];
4100 dst += dstComponents;
4107 for (i = 0; i < n; i++) {
4108 dst[bDst] = rgba[i][BCOMP];
4109 dst += dstComponents;
4116 for (i = 0; i < n; i++) {
4117 dst[aDst] = rgba[i][ACOMP];
4118 dst += dstComponents;
4126 assert(dstComponents == 1);
4127 for (i = 0; i < n; i++) {
4128 /* Intensity comes from red channel */
4129 dst[i] = rgba[i][RCOMP];
4137 for (i = 0; i < n; i++) {
4138 /* Luminance comes from red channel */
4139 dst[0] = rgba[i][RCOMP];
4140 dst += dstComponents;
4151 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
4152 * directly return GLbyte data, no transfer ops apply.
4155 _mesa_unpack_dudv_span_byte( struct gl_context *ctx,
4156 GLuint n, GLenum dstFormat, GLbyte dest[],
4157 GLenum srcFormat, GLenum srcType,
4158 const GLvoid *source,
4159 const struct gl_pixelstore_attrib *srcPacking,
4160 GLbitfield transferOps )
4162 ASSERT(dstFormat == GL_DUDV_ATI);
4163 ASSERT(srcFormat == GL_DUDV_ATI ||
4164 srcFormat == GL_DU8DV8_ATI);
4166 ASSERT(srcType == GL_UNSIGNED_BYTE ||
4167 srcType == GL_BYTE ||
4168 srcType == GL_UNSIGNED_SHORT ||
4169 srcType == GL_SHORT ||
4170 srcType == GL_UNSIGNED_INT ||
4171 srcType == GL_INT ||
4172 srcType == GL_HALF_FLOAT_ARB ||
4173 srcType == GL_FLOAT);
4175 /* general solution */
4177 GLint dstComponents;
4180 GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
4183 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4187 dstComponents = _mesa_components_in_format( dstFormat );
4188 /* source & dest image formats should have been error checked by now */
4189 assert(dstComponents > 0);
4192 * Extract image data and convert to RGBA floats
4194 extract_float_rgba(n, rgba, srcFormat, srcType, source,
4195 srcPacking->SwapBytes);
4198 /* Now determine which color channels we need to produce.
4199 * And determine the dest index (offset) within each color tuple.
4202 /* Now pack results in the requested dstFormat */
4203 for (i = 0; i < n; i++) {
4204 /* not sure - need clamp[-1,1] here? */
4205 dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
4206 dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
4207 dst += dstComponents;
4215 * Unpack a row of color index data from a client buffer according to
4216 * the pixel unpacking parameters.
4217 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4219 * Args: ctx - the context
4220 * n - number of pixels
4221 * dstType - destination data type
4222 * dest - destination array
4223 * srcType - source pixel type
4224 * source - source data pointer
4225 * srcPacking - pixel unpacking parameters
4226 * transferOps - the pixel transfer operations to apply
4229 _mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
4230 GLenum dstType, GLvoid *dest,
4231 GLenum srcType, const GLvoid *source,
4232 const struct gl_pixelstore_attrib *srcPacking,
4233 GLbitfield transferOps )
4235 ASSERT(srcType == GL_BITMAP ||
4236 srcType == GL_UNSIGNED_BYTE ||
4237 srcType == GL_BYTE ||
4238 srcType == GL_UNSIGNED_SHORT ||
4239 srcType == GL_SHORT ||
4240 srcType == GL_UNSIGNED_INT ||
4241 srcType == GL_INT ||
4242 srcType == GL_HALF_FLOAT_ARB ||
4243 srcType == GL_FLOAT);
4245 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4246 dstType == GL_UNSIGNED_SHORT ||
4247 dstType == GL_UNSIGNED_INT);
4250 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4253 * Try simple cases first
4255 if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
4256 && dstType == GL_UNSIGNED_BYTE) {
4257 memcpy(dest, source, n * sizeof(GLubyte));
4259 else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
4260 && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
4261 memcpy(dest, source, n * sizeof(GLuint));
4267 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4270 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4274 extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
4278 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4280 /* convert to dest type */
4282 case GL_UNSIGNED_BYTE:
4284 GLubyte *dst = (GLubyte *) dest;
4286 for (i = 0; i < n; i++) {
4287 dst[i] = (GLubyte) (indexes[i] & 0xff);
4291 case GL_UNSIGNED_SHORT:
4293 GLuint *dst = (GLuint *) dest;
4295 for (i = 0; i < n; i++) {
4296 dst[i] = (GLushort) (indexes[i] & 0xffff);
4300 case GL_UNSIGNED_INT:
4301 memcpy(dest, indexes, n * sizeof(GLuint));
4304 _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
4313 _mesa_pack_index_span( struct gl_context *ctx, GLuint n,
4314 GLenum dstType, GLvoid *dest, const GLuint *source,
4315 const struct gl_pixelstore_attrib *dstPacking,
4316 GLbitfield transferOps )
4318 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4321 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4325 transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
4327 if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
4328 /* make a copy of input */
4329 memcpy(indexes, source, n * sizeof(GLuint));
4330 _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
4335 case GL_UNSIGNED_BYTE:
4337 GLubyte *dst = (GLubyte *) dest;
4339 for (i = 0; i < n; i++) {
4340 *dst++ = (GLubyte) source[i];
4346 GLbyte *dst = (GLbyte *) dest;
4348 for (i = 0; i < n; i++) {
4349 dst[i] = (GLbyte) source[i];
4353 case GL_UNSIGNED_SHORT:
4355 GLushort *dst = (GLushort *) dest;
4357 for (i = 0; i < n; i++) {
4358 dst[i] = (GLushort) source[i];
4360 if (dstPacking->SwapBytes) {
4361 _mesa_swap2( (GLushort *) dst, n );
4367 GLshort *dst = (GLshort *) dest;
4369 for (i = 0; i < n; i++) {
4370 dst[i] = (GLshort) source[i];
4372 if (dstPacking->SwapBytes) {
4373 _mesa_swap2( (GLushort *) dst, n );
4377 case GL_UNSIGNED_INT:
4379 GLuint *dst = (GLuint *) dest;
4381 for (i = 0; i < n; i++) {
4382 dst[i] = (GLuint) source[i];
4384 if (dstPacking->SwapBytes) {
4385 _mesa_swap4( (GLuint *) dst, n );
4391 GLint *dst = (GLint *) dest;
4393 for (i = 0; i < n; i++) {
4394 dst[i] = (GLint) source[i];
4396 if (dstPacking->SwapBytes) {
4397 _mesa_swap4( (GLuint *) dst, n );
4403 GLfloat *dst = (GLfloat *) dest;
4405 for (i = 0; i < n; i++) {
4406 dst[i] = (GLfloat) source[i];
4408 if (dstPacking->SwapBytes) {
4409 _mesa_swap4( (GLuint *) dst, n );
4413 case GL_HALF_FLOAT_ARB:
4415 GLhalfARB *dst = (GLhalfARB *) dest;
4417 for (i = 0; i < n; i++) {
4418 dst[i] = _mesa_float_to_half((GLfloat) source[i]);
4420 if (dstPacking->SwapBytes) {
4421 _mesa_swap2( (GLushort *) dst, n );
4426 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4434 * Unpack a row of stencil data from a client buffer according to
4435 * the pixel unpacking parameters.
4436 * This is (or will be) used by glDrawPixels
4438 * Args: ctx - the context
4439 * n - number of pixels
4440 * dstType - destination data type
4441 * dest - destination array
4442 * srcType - source pixel type
4443 * source - source data pointer
4444 * srcPacking - pixel unpacking parameters
4445 * transferOps - apply offset/bias/lookup ops?
4448 _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
4449 GLenum dstType, GLvoid *dest,
4450 GLenum srcType, const GLvoid *source,
4451 const struct gl_pixelstore_attrib *srcPacking,
4452 GLbitfield transferOps )
4454 ASSERT(srcType == GL_BITMAP ||
4455 srcType == GL_UNSIGNED_BYTE ||
4456 srcType == GL_BYTE ||
4457 srcType == GL_UNSIGNED_SHORT ||
4458 srcType == GL_SHORT ||
4459 srcType == GL_UNSIGNED_INT ||
4460 srcType == GL_INT ||
4461 srcType == GL_UNSIGNED_INT_24_8_EXT ||
4462 srcType == GL_HALF_FLOAT_ARB ||
4463 srcType == GL_FLOAT ||
4464 srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4466 ASSERT(dstType == GL_UNSIGNED_BYTE ||
4467 dstType == GL_UNSIGNED_SHORT ||
4468 dstType == GL_UNSIGNED_INT ||
4469 dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
4471 /* only shift and offset apply to stencil */
4472 transferOps &= IMAGE_SHIFT_OFFSET_BIT;
4475 * Try simple cases first
4477 if (transferOps == 0 &&
4478 !ctx->Pixel.MapStencilFlag &&
4479 srcType == GL_UNSIGNED_BYTE &&
4480 dstType == GL_UNSIGNED_BYTE) {
4481 memcpy(dest, source, n * sizeof(GLubyte));
4483 else if (transferOps == 0 &&
4484 !ctx->Pixel.MapStencilFlag &&
4485 srcType == GL_UNSIGNED_INT &&
4486 dstType == GL_UNSIGNED_INT &&
4487 !srcPacking->SwapBytes) {
4488 memcpy(dest, source, n * sizeof(GLuint));
4494 GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
4497 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
4501 extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
4504 if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
4505 /* shift and offset indexes */
4506 _mesa_shift_and_offset_ci(ctx, n, indexes);
4509 if (ctx->Pixel.MapStencilFlag) {
4510 /* Apply stencil lookup table */
4511 const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
4513 for (i = 0; i < n; i++) {
4514 indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
4518 /* convert to dest type */
4520 case GL_UNSIGNED_BYTE:
4522 GLubyte *dst = (GLubyte *) dest;
4524 for (i = 0; i < n; i++) {
4525 dst[i] = (GLubyte) (indexes[i] & 0xff);
4529 case GL_UNSIGNED_SHORT:
4531 GLuint *dst = (GLuint *) dest;
4533 for (i = 0; i < n; i++) {
4534 dst[i] = (GLushort) (indexes[i] & 0xffff);
4538 case GL_UNSIGNED_INT:
4539 memcpy(dest, indexes, n * sizeof(GLuint));
4541 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
4543 GLuint *dst = (GLuint *) dest;
4545 for (i = 0; i < n; i++) {
4546 dst[i*2+1] = indexes[i] & 0xff; /* lower 8 bits */
4551 _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
4560 _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
4561 GLenum dstType, GLvoid *dest, const GLubyte *source,
4562 const struct gl_pixelstore_attrib *dstPacking )
4564 GLubyte *stencil = (GLubyte *) malloc(n * sizeof(GLubyte));
4567 _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
4571 if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
4572 ctx->Pixel.MapStencilFlag) {
4573 /* make a copy of input */
4574 memcpy(stencil, source, n * sizeof(GLubyte));
4575 _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
4580 case GL_UNSIGNED_BYTE:
4581 memcpy(dest, source, n);
4585 GLbyte *dst = (GLbyte *) dest;
4588 dst[i] = (GLbyte) (source[i] & 0x7f);
4592 case GL_UNSIGNED_SHORT:
4594 GLushort *dst = (GLushort *) dest;
4597 dst[i] = (GLushort) source[i];
4599 if (dstPacking->SwapBytes) {
4600 _mesa_swap2( (GLushort *) dst, n );
4606 GLshort *dst = (GLshort *) dest;
4609 dst[i] = (GLshort) source[i];
4611 if (dstPacking->SwapBytes) {
4612 _mesa_swap2( (GLushort *) dst, n );
4616 case GL_UNSIGNED_INT:
4618 GLuint *dst = (GLuint *) dest;
4621 dst[i] = (GLuint) source[i];
4623 if (dstPacking->SwapBytes) {
4624 _mesa_swap4( (GLuint *) dst, n );
4630 GLint *dst = (GLint *) dest;
4633 dst[i] = (GLint) source[i];
4635 if (dstPacking->SwapBytes) {
4636 _mesa_swap4( (GLuint *) dst, n );
4642 GLfloat *dst = (GLfloat *) dest;
4645 dst[i] = (GLfloat) source[i];
4647 if (dstPacking->SwapBytes) {
4648 _mesa_swap4( (GLuint *) dst, n );
4652 case GL_HALF_FLOAT_ARB:
4654 GLhalfARB *dst = (GLhalfARB *) dest;
4657 dst[i] = _mesa_float_to_half( (float) source[i] );
4659 if (dstPacking->SwapBytes) {
4660 _mesa_swap2( (GLushort *) dst, n );
4665 if (dstPacking->LsbFirst) {
4666 GLubyte *dst = (GLubyte *) dest;
4669 for (i = 0; i < n; i++) {
4672 *dst |= ((source[i] != 0) << shift);
4681 GLubyte *dst = (GLubyte *) dest;
4684 for (i = 0; i < n; i++) {
4687 *dst |= ((source[i] != 0) << shift);
4697 _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
4703 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4706 const GLTYPE *src = (const GLTYPE *)source; \
4707 for (i = 0; i < n; i++) { \
4708 GLTYPE value = src[i]; \
4709 if (srcPacking->SwapBytes) { \
4710 if (sizeof(GLTYPE) == 2) { \
4712 } else if (sizeof(GLTYPE) == 4) { \
4716 depthValues[i] = GLTYPE2FLOAT(value); \
4722 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4723 * or GLfloat values.
4724 * The glPixelTransfer (scale/bias) params will be applied.
4726 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4727 * \param depthMax max value for returned GLushort or GLuint values
4728 * (ignored for GLfloat).
4731 _mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
4732 GLenum dstType, GLvoid *dest, GLuint depthMax,
4733 GLenum srcType, const GLvoid *source,
4734 const struct gl_pixelstore_attrib *srcPacking )
4736 GLfloat *depthTemp = NULL, *depthValues;
4737 GLboolean needClamp = GL_FALSE;
4739 /* Look for special cases first.
4740 * Not only are these faster, they're less prone to numeric conversion
4741 * problems. Otherwise, converting from an int type to a float then
4742 * back to an int type can introduce errors that will show up as
4743 * artifacts in things like depth peeling which uses glCopyTexImage.
4745 if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
4746 if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
4747 const GLuint *src = (const GLuint *) source;
4748 GLushort *dst = (GLushort *) dest;
4750 for (i = 0; i < n; i++) {
4751 dst[i] = src[i] >> 16;
4755 if (srcType == GL_UNSIGNED_SHORT
4756 && dstType == GL_UNSIGNED_INT
4757 && depthMax == 0xffffffff) {
4758 const GLushort *src = (const GLushort *) source;
4759 GLuint *dst = (GLuint *) dest;
4761 for (i = 0; i < n; i++) {
4762 dst[i] = src[i] | (src[i] << 16);
4766 if (srcType == GL_UNSIGNED_INT_24_8
4767 && dstType == GL_UNSIGNED_INT
4768 && depthMax == 0xffffff) {
4769 const GLuint *src = (const GLuint *) source;
4770 GLuint *dst = (GLuint *) dest;
4772 for (i = 0; i < n; i++) {
4773 dst[i] = src[i] >> 8;
4777 /* XXX may want to add additional cases here someday */
4780 /* general case path follows */
4782 if (dstType == GL_FLOAT) {
4783 depthValues = (GLfloat *) dest;
4786 depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
4788 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
4792 depthValues = depthTemp;
4795 /* Convert incoming values to GLfloat. Some conversions will require
4800 DEPTH_VALUES(GLbyte, BYTE_TO_FLOATZ);
4801 needClamp = GL_TRUE;
4803 case GL_UNSIGNED_BYTE:
4804 DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
4807 DEPTH_VALUES(GLshort, SHORT_TO_FLOATZ);
4808 needClamp = GL_TRUE;
4810 case GL_UNSIGNED_SHORT:
4811 DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
4814 DEPTH_VALUES(GLint, INT_TO_FLOAT);
4815 needClamp = GL_TRUE;
4817 case GL_UNSIGNED_INT:
4818 DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
4820 case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
4821 if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
4822 depthMax == 0xffffff &&
4823 ctx->Pixel.DepthScale == 1.0 &&
4824 ctx->Pixel.DepthBias == 0.0) {
4825 const GLuint *src = (const GLuint *) source;
4826 GLuint *zValues = (GLuint *) dest;
4828 for (i = 0; i < n; i++) {
4829 GLuint value = src[i];
4830 if (srcPacking->SwapBytes) {
4833 zValues[i] = value & 0xffffff00;
4839 const GLuint *src = (const GLuint *) source;
4840 const GLfloat scale = 1.0f / 0xffffff;
4842 for (i = 0; i < n; i++) {
4843 GLuint value = src[i];
4844 if (srcPacking->SwapBytes) {
4847 depthValues[i] = (value >> 8) * scale;
4851 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
4854 const GLfloat *src = (const GLfloat *)source;
4855 for (i = 0; i < n; i++) {
4856 GLfloat value = src[i * 2];
4857 if (srcPacking->SwapBytes) {
4860 depthValues[i] = value;
4862 needClamp = GL_TRUE;
4866 DEPTH_VALUES(GLfloat, 1*);
4867 needClamp = GL_TRUE;
4869 case GL_HALF_FLOAT_ARB:
4872 const GLhalfARB *src = (const GLhalfARB *) source;
4873 for (i = 0; i < n; i++) {
4874 GLhalfARB value = src[i];
4875 if (srcPacking->SwapBytes) {
4878 depthValues[i] = _mesa_half_to_float(value);
4880 needClamp = GL_TRUE;
4884 _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
4889 /* apply depth scale and bias */
4891 const GLfloat scale = ctx->Pixel.DepthScale;
4892 const GLfloat bias = ctx->Pixel.DepthBias;
4893 if (scale != 1.0 || bias != 0.0) {
4895 for (i = 0; i < n; i++) {
4896 depthValues[i] = depthValues[i] * scale + bias;
4898 needClamp = GL_TRUE;
4902 /* clamp to [0, 1] */
4905 for (i = 0; i < n; i++) {
4906 depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
4911 * Convert values to dstType
4913 if (dstType == GL_UNSIGNED_INT) {
4914 GLuint *zValues = (GLuint *) dest;
4916 if (depthMax <= 0xffffff) {
4917 /* no overflow worries */
4918 for (i = 0; i < n; i++) {
4919 zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
4923 /* need to use double precision to prevent overflow problems */
4924 for (i = 0; i < n; i++) {
4925 GLdouble z = depthValues[i] * (GLfloat) depthMax;
4926 if (z >= (GLdouble) 0xffffffff)
4927 zValues[i] = 0xffffffff;
4929 zValues[i] = (GLuint) z;
4933 else if (dstType == GL_UNSIGNED_SHORT) {
4934 GLushort *zValues = (GLushort *) dest;
4936 ASSERT(depthMax <= 0xffff);
4937 for (i = 0; i < n; i++) {
4938 zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
4941 else if (dstType == GL_FLOAT) {
4942 /* Nothing to do. depthValues is pointing to dest. */
4944 else if (dstType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) {
4945 GLfloat *zValues = (GLfloat*) dest;
4947 for (i = 0; i < n; i++) {
4948 zValues[i*2] = depthValues[i];
4960 * Pack an array of depth values. The values are floats in [0,1].
4963 _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
4964 GLenum dstType, const GLfloat *depthSpan,
4965 const struct gl_pixelstore_attrib *dstPacking )
4967 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
4969 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
4973 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
4974 memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
4975 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
4976 depthSpan = depthCopy;
4980 case GL_UNSIGNED_BYTE:
4982 GLubyte *dst = (GLubyte *) dest;
4984 for (i = 0; i < n; i++) {
4985 dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
4991 GLbyte *dst = (GLbyte *) dest;
4993 for (i = 0; i < n; i++) {
4994 dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
4998 case GL_UNSIGNED_SHORT:
5000 GLushort *dst = (GLushort *) dest;
5002 for (i = 0; i < n; i++) {
5003 CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
5005 if (dstPacking->SwapBytes) {
5006 _mesa_swap2( (GLushort *) dst, n );
5012 GLshort *dst = (GLshort *) dest;
5014 for (i = 0; i < n; i++) {
5015 dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
5017 if (dstPacking->SwapBytes) {
5018 _mesa_swap2( (GLushort *) dst, n );
5022 case GL_UNSIGNED_INT:
5024 GLuint *dst = (GLuint *) dest;
5026 for (i = 0; i < n; i++) {
5027 dst[i] = FLOAT_TO_UINT( depthSpan[i] );
5029 if (dstPacking->SwapBytes) {
5030 _mesa_swap4( (GLuint *) dst, n );
5036 GLint *dst = (GLint *) dest;
5038 for (i = 0; i < n; i++) {
5039 dst[i] = FLOAT_TO_INT( depthSpan[i] );
5041 if (dstPacking->SwapBytes) {
5042 _mesa_swap4( (GLuint *) dst, n );
5048 GLfloat *dst = (GLfloat *) dest;
5050 for (i = 0; i < n; i++) {
5051 dst[i] = depthSpan[i];
5053 if (dstPacking->SwapBytes) {
5054 _mesa_swap4( (GLuint *) dst, n );
5058 case GL_HALF_FLOAT_ARB:
5060 GLhalfARB *dst = (GLhalfARB *) dest;
5062 for (i = 0; i < n; i++) {
5063 dst[i] = _mesa_float_to_half(depthSpan[i]);
5065 if (dstPacking->SwapBytes) {
5066 _mesa_swap2( (GLushort *) dst, n );
5071 _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
5080 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
5083 _mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n,
5084 GLenum dstType, GLuint *dest,
5085 const GLfloat *depthVals,
5086 const GLubyte *stencilVals,
5087 const struct gl_pixelstore_attrib *dstPacking)
5089 GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
5090 GLubyte *stencilCopy = (GLubyte *) malloc(n * sizeof(GLubyte));
5093 if (!depthCopy || !stencilCopy) {
5094 _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
5100 if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
5101 memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
5102 _mesa_scale_and_bias_depth(ctx, n, depthCopy);
5103 depthVals = depthCopy;
5106 if (ctx->Pixel.IndexShift ||
5107 ctx->Pixel.IndexOffset ||
5108 ctx->Pixel.MapStencilFlag) {
5109 memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte));
5110 _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
5111 stencilVals = stencilCopy;
5115 case GL_UNSIGNED_INT_24_8:
5116 for (i = 0; i < n; i++) {
5117 GLuint z = (GLuint) (depthVals[i] * 0xffffff);
5118 dest[i] = (z << 8) | (stencilVals[i] & 0xff);
5121 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
5122 for (i = 0; i < n; i++) {
5123 ((GLfloat*)dest)[i*2] = depthVals[i];
5124 dest[i*2+1] = stencilVals[i] & 0xff;
5129 if (dstPacking->SwapBytes) {
5130 _mesa_swap4(dest, n);
5141 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
5142 * Return all image data in a contiguous block. This is used when we
5143 * compile glDrawPixels, glTexImage, etc into a display list. We
5144 * need a copy of the data in a standard format.
5147 _mesa_unpack_image( GLuint dimensions,
5148 GLsizei width, GLsizei height, GLsizei depth,
5149 GLenum format, GLenum type, const GLvoid *pixels,
5150 const struct gl_pixelstore_attrib *unpack )
5152 GLint bytesPerRow, compsPerRow;
5153 GLboolean flipBytes, swap2, swap4;
5156 return NULL; /* not necessarily an error */
5158 if (width <= 0 || height <= 0 || depth <= 0)
5159 return NULL; /* generate error later */
5161 if (type == GL_BITMAP) {
5162 bytesPerRow = (width + 7) >> 3;
5163 flipBytes = unpack->LsbFirst;
5164 swap2 = swap4 = GL_FALSE;
5168 const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
5169 GLint components = _mesa_components_in_format(format);
5172 if (_mesa_type_is_packed(type))
5175 if (bytesPerPixel <= 0 || components <= 0)
5176 return NULL; /* bad format or type. generate error later */
5177 bytesPerRow = bytesPerPixel * width;
5178 bytesPerComp = bytesPerPixel / components;
5179 flipBytes = GL_FALSE;
5180 swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
5181 swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
5182 compsPerRow = components * width;
5183 assert(compsPerRow >= width);
5188 = (GLubyte *) malloc(bytesPerRow * height * depth);
5192 return NULL; /* generate GL_OUT_OF_MEMORY later */
5195 for (img = 0; img < depth; img++) {
5196 for (row = 0; row < height; row++) {
5197 const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
5198 width, height, format, type, img, row, 0);
5200 if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
5202 flipBytes = GL_FALSE;
5203 if (unpack->LsbFirst) {
5204 GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
5205 GLubyte dstMask = 128;
5206 const GLubyte *s = src;
5209 for (i = 0; i < width; i++) {
5213 if (srcMask == 128) {
5218 srcMask = srcMask << 1;
5226 dstMask = dstMask >> 1;
5231 GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
5232 GLubyte dstMask = 128;
5233 const GLubyte *s = src;
5236 for (i = 0; i < width; i++) {
5245 srcMask = srcMask >> 1;
5253 dstMask = dstMask >> 1;
5259 memcpy(dst, src, bytesPerRow);
5262 /* byte flipping/swapping */
5264 flip_bytes((GLubyte *) dst, bytesPerRow);
5267 _mesa_swap2((GLushort*) dst, compsPerRow);
5270 _mesa_swap4((GLuint*) dst, compsPerRow);