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"
45 * Flip the 8 bits in each byte of the given array.
48 * \param n number of bytes.
50 * \todo try this trick to flip bytes someday:
52 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
53 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
54 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
58 flip_bytes( GLubyte
*p
, GLuint n
)
61 for (i
= 0; i
< n
; i
++) {
62 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
63 a
= ((b
& 0x01) << 7) |
78 * Unpack a 32x32 pixel polygon stipple from user memory using the
79 * current pixel unpack settings.
82 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
83 const struct gl_pixelstore_attrib
*unpacking
)
85 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
87 /* Convert pattern from GLubytes to GLuints and handle big/little
92 for (i
= 0; i
< 32; i
++) {
93 dest
[i
] = (p
[0] << 24)
105 * Pack polygon stipple into user memory given current pixel packing
109 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
110 const struct gl_pixelstore_attrib
*packing
)
112 /* Convert pattern from GLuints to GLubytes to handle big/little
113 * endian differences.
117 for (i
= 0; i
< 32; i
++) {
118 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
119 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
120 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
121 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
124 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
129 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
130 * order with row alignment = 1 byte.
133 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
134 const struct gl_pixelstore_attrib
*packing
)
136 GLint bytes
, row
, width_in_bytes
;
137 GLubyte
*buffer
, *dst
;
142 /* Alloc dest storage */
143 bytes
= ((width
+ 7) / 8 * height
);
144 buffer
= (GLubyte
*) malloc( bytes
);
148 width_in_bytes
= CEILING( width
, 8 );
150 for (row
= 0; row
< height
; row
++) {
151 const GLubyte
*src
= (const GLubyte
*)
152 _mesa_image_address2d(packing
, pixels
, width
, height
,
153 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
159 if ((packing
->SkipPixels
& 7) == 0) {
160 memcpy( dst
, src
, width_in_bytes
);
161 if (packing
->LsbFirst
) {
162 flip_bytes( dst
, width_in_bytes
);
166 /* handling SkipPixels is a bit tricky (no pun intended!) */
168 if (packing
->LsbFirst
) {
169 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
170 GLubyte dstMask
= 128;
171 const GLubyte
*s
= src
;
174 for (i
= 0; i
< width
; i
++) {
178 if (srcMask
== 128) {
183 srcMask
= srcMask
<< 1;
191 dstMask
= dstMask
>> 1;
196 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
197 GLubyte dstMask
= 128;
198 const GLubyte
*s
= src
;
201 for (i
= 0; i
< width
; i
++) {
210 srcMask
= srcMask
>> 1;
218 dstMask
= dstMask
>> 1;
223 dst
+= width_in_bytes
;
234 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
235 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
237 GLint row
, width_in_bytes
;
243 width_in_bytes
= CEILING( width
, 8 );
245 for (row
= 0; row
< height
; row
++) {
246 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
247 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
251 if ((packing
->SkipPixels
& 7) == 0) {
252 memcpy( dst
, src
, width_in_bytes
);
253 if (packing
->LsbFirst
) {
254 flip_bytes( dst
, width_in_bytes
);
258 /* handling SkipPixels is a bit tricky (no pun intended!) */
260 if (packing
->LsbFirst
) {
261 GLubyte srcMask
= 128;
262 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
263 const GLubyte
*s
= src
;
266 for (i
= 0; i
< width
; i
++) {
275 srcMask
= srcMask
>> 1;
277 if (dstMask
== 128) {
283 dstMask
= dstMask
<< 1;
288 GLubyte srcMask
= 128;
289 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
290 const GLubyte
*s
= src
;
293 for (i
= 0; i
< width
; i
++) {
302 srcMask
= srcMask
>> 1;
310 dstMask
= dstMask
>> 1;
315 src
+= width_in_bytes
;
321 * Get indexes of color components for a basic color format, such as
322 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
326 get_component_indexes(GLenum format
,
331 GLint
*luminanceIndex
,
332 GLint
*intensityIndex
)
338 *luminanceIndex
= -1;
339 *intensityIndex
= -1;
343 case GL_LUMINANCE_INTEGER_EXT
:
346 case GL_LUMINANCE_ALPHA
:
347 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
355 case GL_RED_INTEGER_EXT
:
359 case GL_GREEN_INTEGER_EXT
:
363 case GL_BLUE_INTEGER_EXT
:
367 case GL_ALPHA_INTEGER_EXT
:
376 case GL_RGB_INTEGER_EXT
:
382 case GL_BGR_INTEGER_EXT
:
388 case GL_RGBA_INTEGER_EXT
:
395 case GL_BGRA_INTEGER
:
408 assert(0 && "bad format in get_component_indexes()");
415 * For small integer types, return the min and max possible values.
416 * Used for clamping floats to unscaled integer types.
417 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
420 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
427 case GL_UNSIGNED_BYTE
:
435 case GL_UNSIGNED_SHORT
:
444 /* Customization of integer packing. We always treat src as uint, and can pack dst
445 * as any integer type/format combo.
447 #define SRC_TYPE GLuint
449 #define DST_TYPE GLuint
450 #define SRC_CONVERT(x) (x)
451 #define FN_NAME pack_uint_from_uint_rgba
452 #include "pack_tmp.h"
457 #define DST_TYPE GLushort
458 #define SRC_CONVERT(x) MIN2(x, 0xffff)
459 #define FN_NAME pack_ushort_from_uint_rgba
460 #include "pack_tmp.h"
465 #define DST_TYPE GLshort
466 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
467 #define FN_NAME pack_short_from_uint_rgba
468 #include "pack_tmp.h"
473 #define DST_TYPE GLubyte
474 #define SRC_CONVERT(x) MIN2(x, 0xff)
475 #define FN_NAME pack_ubyte_from_uint_rgba
476 #include "pack_tmp.h"
481 #define DST_TYPE GLbyte
482 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
483 #define FN_NAME pack_byte_from_uint_rgba
484 #include "pack_tmp.h"
490 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
491 GLenum dstFormat
, GLenum dstType
,
495 case GL_UNSIGNED_INT
:
496 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
499 /* No conversion necessary. */
500 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
502 case GL_UNSIGNED_SHORT
:
503 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
506 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
508 case GL_UNSIGNED_BYTE
:
509 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
512 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
522 * Used to pack an array [][4] of RGBA float colors as specified
523 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
524 * Historically, the RGBA values were in [0,1] and rescaled to fit
525 * into GLubytes, etc. But with new integer formats, the RGBA values
526 * may have any value and we don't always rescale when converting to
529 * Note: the rgba values will be modified by this function when any pixel
530 * transfer ops are enabled.
533 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
534 GLenum dstFormat
, GLenum dstType
,
536 const struct gl_pixelstore_attrib
*dstPacking
,
537 GLbitfield transferOps
)
540 const GLint comps
= _mesa_components_in_format(dstFormat
);
541 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
544 if (dstFormat
== GL_LUMINANCE
||
545 dstFormat
== GL_LUMINANCE_ALPHA
||
546 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
547 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
548 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
550 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
558 /* EXT_texture_integer specifies no transfer ops on integer
559 * types in the resolved issues section. Just set them to 0
560 * for integer surfaces.
566 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
570 * Component clamping (besides clamping to [0,1] in
571 * _mesa_apply_rgba_transfer_ops()).
574 /* clamping to dest type's min/max values */
576 if (get_type_min_max(dstType
, &min
, &max
)) {
577 for (i
= 0; i
< n
; i
++) {
578 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
579 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
580 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
581 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
585 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
586 /* compute luminance values */
587 if (transferOps
& IMAGE_CLAMP_BIT
) {
588 for (i
= 0; i
< n
; i
++) {
589 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
590 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
594 for (i
= 0; i
< n
; i
++) {
595 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
601 * Pack/store the pixels. Ugh! Lots of cases!!!
604 case GL_UNSIGNED_BYTE
:
606 GLubyte
*dst
= (GLubyte
*) dstAddr
;
610 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
614 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
618 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
622 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
626 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
628 case GL_LUMINANCE_ALPHA
:
630 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
631 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
636 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
637 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
642 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
643 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
644 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
649 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
650 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
651 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
652 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
657 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
658 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
659 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
664 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
665 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
666 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
667 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
672 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
673 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
674 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
675 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
678 case GL_RED_INTEGER_EXT
:
680 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
683 case GL_GREEN_INTEGER_EXT
:
685 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
688 case GL_BLUE_INTEGER_EXT
:
690 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
693 case GL_ALPHA_INTEGER_EXT
:
695 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
700 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
701 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
704 case GL_RGB_INTEGER_EXT
:
706 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
707 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
708 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
711 case GL_RGBA_INTEGER_EXT
:
713 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
714 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
715 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
716 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
719 case GL_BGR_INTEGER_EXT
:
721 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
722 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
723 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
726 case GL_BGRA_INTEGER_EXT
:
728 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
729 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
730 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
731 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
734 case GL_LUMINANCE_INTEGER_EXT
:
736 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
739 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
742 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
744 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
750 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
756 GLbyte
*dst
= (GLbyte
*) dstAddr
;
760 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
764 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
768 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
772 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
776 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
778 case GL_LUMINANCE_ALPHA
:
780 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
781 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
786 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
787 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
792 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
793 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
794 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
799 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
800 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
801 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
802 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
807 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
808 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
809 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
814 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
815 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
816 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
817 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
822 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
823 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
824 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
825 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
828 case GL_RED_INTEGER_EXT
:
830 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
833 case GL_GREEN_INTEGER_EXT
:
835 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
838 case GL_BLUE_INTEGER_EXT
:
840 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
843 case GL_ALPHA_INTEGER_EXT
:
845 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
850 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
851 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
854 case GL_RGB_INTEGER_EXT
:
856 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
857 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
858 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
861 case GL_RGBA_INTEGER_EXT
:
863 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
864 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
865 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
866 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
869 case GL_BGR_INTEGER_EXT
:
871 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
872 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
873 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
876 case GL_BGRA_INTEGER_EXT
:
878 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
879 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
880 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
881 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
884 case GL_LUMINANCE_INTEGER_EXT
:
886 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
889 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
892 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
894 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
900 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
904 case GL_UNSIGNED_SHORT
:
906 GLushort
*dst
= (GLushort
*) dstAddr
;
910 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
914 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
922 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
926 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
928 case GL_LUMINANCE_ALPHA
:
930 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
931 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
936 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
937 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
942 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
943 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
944 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
949 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
950 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
951 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
952 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
957 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
958 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
959 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
964 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
965 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
966 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
967 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
972 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
973 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
974 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
975 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
978 case GL_RED_INTEGER_EXT
:
980 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
983 case GL_GREEN_INTEGER_EXT
:
985 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
988 case GL_BLUE_INTEGER_EXT
:
990 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
993 case GL_ALPHA_INTEGER_EXT
:
995 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1000 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1001 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1004 case GL_RGB_INTEGER_EXT
:
1006 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1007 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1008 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1011 case GL_RGBA_INTEGER_EXT
:
1013 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1014 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1015 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1016 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1019 case GL_BGR_INTEGER_EXT
:
1021 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1022 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1023 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1026 case GL_BGRA_INTEGER_EXT
:
1028 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1029 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1030 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1031 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1034 case GL_LUMINANCE_INTEGER_EXT
:
1036 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1039 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1042 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1044 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1050 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1056 GLshort
*dst
= (GLshort
*) dstAddr
;
1057 switch (dstFormat
) {
1060 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1064 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1068 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1072 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1076 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1078 case GL_LUMINANCE_ALPHA
:
1080 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1081 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1086 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1087 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1092 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1093 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1094 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1099 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1100 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1101 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1102 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1107 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1108 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1109 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1114 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1115 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1116 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1117 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1122 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1123 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1124 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1125 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1128 case GL_RED_INTEGER_EXT
:
1130 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1133 case GL_GREEN_INTEGER_EXT
:
1135 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1138 case GL_BLUE_INTEGER_EXT
:
1140 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1143 case GL_ALPHA_INTEGER_EXT
:
1145 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1150 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1151 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1154 case GL_RGB_INTEGER_EXT
:
1156 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1157 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1158 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1161 case GL_RGBA_INTEGER_EXT
:
1163 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1164 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1165 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1166 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1169 case GL_BGR_INTEGER_EXT
:
1171 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1172 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1173 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1176 case GL_BGRA_INTEGER_EXT
:
1178 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1179 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1180 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1181 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1184 case GL_LUMINANCE_INTEGER_EXT
:
1186 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1189 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1192 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1194 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1200 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1204 case GL_UNSIGNED_INT
:
1206 GLuint
*dst
= (GLuint
*) dstAddr
;
1207 switch (dstFormat
) {
1210 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1214 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1218 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1222 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1226 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1228 case GL_LUMINANCE_ALPHA
:
1230 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1231 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1236 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1237 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1242 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1243 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1244 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1249 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1250 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1251 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1252 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1257 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1258 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1259 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1264 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1265 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1266 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1267 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1272 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1273 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1274 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1275 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1278 case GL_RED_INTEGER_EXT
:
1280 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1283 case GL_GREEN_INTEGER_EXT
:
1285 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1288 case GL_BLUE_INTEGER_EXT
:
1290 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1293 case GL_ALPHA_INTEGER_EXT
:
1295 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1300 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1301 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1304 case GL_RGB_INTEGER_EXT
:
1306 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1307 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1308 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1311 case GL_RGBA_INTEGER_EXT
:
1313 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1314 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1315 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1316 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1319 case GL_BGR_INTEGER_EXT
:
1321 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1322 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1323 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1326 case GL_BGRA_INTEGER_EXT
:
1328 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1329 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1330 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1331 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1334 case GL_LUMINANCE_INTEGER_EXT
:
1336 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1339 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1342 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1344 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1350 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1356 GLint
*dst
= (GLint
*) dstAddr
;
1357 switch (dstFormat
) {
1360 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1364 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1368 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1372 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1376 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1378 case GL_LUMINANCE_ALPHA
:
1380 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1381 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1386 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1387 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1392 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1393 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1394 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1399 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1400 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1401 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1402 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1407 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1408 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1409 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1414 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1415 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1416 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1417 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1422 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1423 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1424 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1425 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1428 case GL_RED_INTEGER_EXT
:
1430 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1433 case GL_GREEN_INTEGER_EXT
:
1435 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1438 case GL_BLUE_INTEGER_EXT
:
1440 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1443 case GL_ALPHA_INTEGER_EXT
:
1445 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1450 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1451 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1454 case GL_RGB_INTEGER_EXT
:
1456 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1457 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1458 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1461 case GL_RGBA_INTEGER_EXT
:
1463 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1464 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1465 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1466 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1469 case GL_BGR_INTEGER_EXT
:
1471 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1472 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1473 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1476 case GL_BGRA_INTEGER_EXT
:
1478 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1479 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1480 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1481 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1484 case GL_LUMINANCE_INTEGER_EXT
:
1486 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1489 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1492 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1494 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1500 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1506 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1507 switch (dstFormat
) {
1510 dst
[i
] = rgba
[i
][RCOMP
];
1514 dst
[i
] = rgba
[i
][GCOMP
];
1518 dst
[i
] = rgba
[i
][BCOMP
];
1522 dst
[i
] = rgba
[i
][ACOMP
];
1526 dst
[i
] = luminance
[i
];
1528 case GL_LUMINANCE_ALPHA
:
1530 dst
[i
*2+0] = luminance
[i
];
1531 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1536 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1537 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1542 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1543 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1544 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1549 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1550 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1551 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1552 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1557 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1558 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1559 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1564 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1565 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1566 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1567 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1572 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1573 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1574 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1575 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1579 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1583 case GL_HALF_FLOAT_ARB
:
1585 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1586 switch (dstFormat
) {
1589 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1593 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1597 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1601 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1605 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1607 case GL_LUMINANCE_ALPHA
:
1609 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1610 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1615 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1616 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1621 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1622 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1623 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1628 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1629 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1630 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1631 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1636 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1637 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1638 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1643 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1644 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1645 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1646 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1651 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1652 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1653 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1654 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1658 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1662 case GL_UNSIGNED_BYTE_3_3_2
:
1663 if (dstFormat
== GL_RGB
) {
1664 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1666 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1667 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1668 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1672 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1673 if (dstFormat
== GL_RGB
) {
1674 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1676 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1677 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1678 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1682 case GL_UNSIGNED_SHORT_5_6_5
:
1683 if (dstFormat
== GL_RGB
) {
1684 GLushort
*dst
= (GLushort
*) dstAddr
;
1686 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1687 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1688 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1692 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1693 if (dstFormat
== GL_RGB
) {
1694 GLushort
*dst
= (GLushort
*) dstAddr
;
1696 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1697 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1698 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1702 case GL_UNSIGNED_SHORT_4_4_4_4
:
1703 if (dstFormat
== GL_RGBA
) {
1704 GLushort
*dst
= (GLushort
*) dstAddr
;
1706 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1707 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1708 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1709 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1712 else if (dstFormat
== GL_BGRA
) {
1713 GLushort
*dst
= (GLushort
*) dstAddr
;
1715 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1716 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1717 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1718 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1721 else if (dstFormat
== GL_ABGR_EXT
) {
1722 GLushort
*dst
= (GLushort
*) dstAddr
;
1724 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1725 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1726 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1727 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1731 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1732 if (dstFormat
== GL_RGBA
) {
1733 GLushort
*dst
= (GLushort
*) dstAddr
;
1735 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1736 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1737 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1738 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1741 else if (dstFormat
== GL_BGRA
) {
1742 GLushort
*dst
= (GLushort
*) dstAddr
;
1744 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1745 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1746 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1747 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1750 else if (dstFormat
== GL_ABGR_EXT
) {
1751 GLushort
*dst
= (GLushort
*) dstAddr
;
1753 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1754 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1755 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1756 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1760 case GL_UNSIGNED_SHORT_5_5_5_1
:
1761 if (dstFormat
== GL_RGBA
) {
1762 GLushort
*dst
= (GLushort
*) dstAddr
;
1764 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1765 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1766 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1767 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1770 else if (dstFormat
== GL_BGRA
) {
1771 GLushort
*dst
= (GLushort
*) dstAddr
;
1773 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1774 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1775 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1776 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1779 else if (dstFormat
== GL_ABGR_EXT
) {
1780 GLushort
*dst
= (GLushort
*) dstAddr
;
1782 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1783 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1784 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1785 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1789 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1790 if (dstFormat
== GL_RGBA
) {
1791 GLushort
*dst
= (GLushort
*) dstAddr
;
1793 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1794 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1795 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1796 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1799 else if (dstFormat
== GL_BGRA
) {
1800 GLushort
*dst
= (GLushort
*) dstAddr
;
1802 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1803 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1804 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1805 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1808 else if (dstFormat
== GL_ABGR_EXT
) {
1809 GLushort
*dst
= (GLushort
*) dstAddr
;
1811 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1812 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1813 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1814 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1818 case GL_UNSIGNED_INT_8_8_8_8
:
1819 if (dstFormat
== GL_RGBA
) {
1820 GLuint
*dst
= (GLuint
*) dstAddr
;
1822 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1823 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1824 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1825 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1828 else if (dstFormat
== GL_BGRA
) {
1829 GLuint
*dst
= (GLuint
*) dstAddr
;
1831 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1832 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1833 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1834 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1837 else if (dstFormat
== GL_ABGR_EXT
) {
1838 GLuint
*dst
= (GLuint
*) dstAddr
;
1840 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1841 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1842 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1843 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1847 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1848 if (dstFormat
== GL_RGBA
) {
1849 GLuint
*dst
= (GLuint
*) dstAddr
;
1851 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1852 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1853 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1854 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1857 else if (dstFormat
== GL_BGRA
) {
1858 GLuint
*dst
= (GLuint
*) dstAddr
;
1860 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1861 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1862 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1863 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1866 else if (dstFormat
== GL_ABGR_EXT
) {
1867 GLuint
*dst
= (GLuint
*) dstAddr
;
1869 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1870 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1871 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1872 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1877 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1882 if (dstPacking
->SwapBytes
) {
1883 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1884 if (swapSize
== 2) {
1885 if (dstPacking
->SwapBytes
) {
1886 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1889 else if (swapSize
== 4) {
1890 if (dstPacking
->SwapBytes
) {
1891 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1901 #define SWAP2BYTE(VALUE) \
1903 GLubyte *bytes = (GLubyte *) &(VALUE); \
1904 GLubyte tmp = bytes[0]; \
1905 bytes[0] = bytes[1]; \
1909 #define SWAP4BYTE(VALUE) \
1911 GLubyte *bytes = (GLubyte *) &(VALUE); \
1912 GLubyte tmp = bytes[0]; \
1913 bytes[0] = bytes[3]; \
1916 bytes[1] = bytes[2]; \
1922 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1923 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1924 const struct gl_pixelstore_attrib
*unpack
)
1926 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1928 ASSERT(srcType
== GL_BITMAP
||
1929 srcType
== GL_UNSIGNED_BYTE
||
1930 srcType
== GL_BYTE
||
1931 srcType
== GL_UNSIGNED_SHORT
||
1932 srcType
== GL_SHORT
||
1933 srcType
== GL_UNSIGNED_INT
||
1934 srcType
== GL_INT
||
1935 srcType
== GL_HALF_FLOAT_ARB
||
1936 srcType
== GL_FLOAT
);
1941 GLubyte
*ubsrc
= (GLubyte
*) src
;
1942 if (unpack
->LsbFirst
) {
1943 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1945 for (i
= 0; i
< n
; i
++) {
1946 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1957 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1959 for (i
= 0; i
< n
; i
++) {
1960 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1972 case GL_UNSIGNED_BYTE
:
1975 const GLubyte
*s
= (const GLubyte
*) src
;
1976 for (i
= 0; i
< n
; i
++)
1983 const GLbyte
*s
= (const GLbyte
*) src
;
1984 for (i
= 0; i
< n
; i
++)
1988 case GL_UNSIGNED_SHORT
:
1991 const GLushort
*s
= (const GLushort
*) src
;
1992 if (unpack
->SwapBytes
) {
1993 for (i
= 0; i
< n
; i
++) {
1994 GLushort value
= s
[i
];
2000 for (i
= 0; i
< n
; i
++)
2008 const GLshort
*s
= (const GLshort
*) src
;
2009 if (unpack
->SwapBytes
) {
2010 for (i
= 0; i
< n
; i
++) {
2011 GLshort value
= s
[i
];
2017 for (i
= 0; i
< n
; i
++)
2022 case GL_UNSIGNED_INT
:
2025 const GLuint
*s
= (const GLuint
*) src
;
2026 if (unpack
->SwapBytes
) {
2027 for (i
= 0; i
< n
; i
++) {
2028 GLuint value
= s
[i
];
2034 for (i
= 0; i
< n
; i
++)
2042 const GLint
*s
= (const GLint
*) src
;
2043 if (unpack
->SwapBytes
) {
2044 for (i
= 0; i
< n
; i
++) {
2051 for (i
= 0; i
< n
; i
++)
2059 const GLfloat
*s
= (const GLfloat
*) src
;
2060 if (unpack
->SwapBytes
) {
2061 for (i
= 0; i
< n
; i
++) {
2062 GLfloat value
= s
[i
];
2064 indexes
[i
] = (GLuint
) value
;
2068 for (i
= 0; i
< n
; i
++)
2069 indexes
[i
] = (GLuint
) s
[i
];
2073 case GL_HALF_FLOAT_ARB
:
2076 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2077 if (unpack
->SwapBytes
) {
2078 for (i
= 0; i
< n
; i
++) {
2079 GLhalfARB value
= s
[i
];
2081 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2085 for (i
= 0; i
< n
; i
++)
2086 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2092 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2099 * Return source/dest RGBA indexes for unpacking pixels.
2102 get_component_mapping(GLenum format
,
2114 case GL_RED_INTEGER_EXT
:
2116 *gSrc
= *bSrc
= *aSrc
= -1;
2119 case GL_GREEN_INTEGER_EXT
:
2121 *rSrc
= *bSrc
= *aSrc
= -1;
2124 case GL_BLUE_INTEGER_EXT
:
2126 *rSrc
= *gSrc
= *aSrc
= -1;
2129 case GL_ALPHA_INTEGER_EXT
:
2130 *rSrc
= *gSrc
= *bSrc
= -1;
2134 case GL_LUMINANCE_INTEGER_EXT
:
2135 *rSrc
= *gSrc
= *bSrc
= 0;
2138 case GL_LUMINANCE_ALPHA
:
2139 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2140 *rSrc
= *gSrc
= *bSrc
= 0;
2144 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2158 case GL_RGB_INTEGER
:
2169 case GL_BGR_INTEGER
:
2180 case GL_RGBA_INTEGER
:
2191 case GL_BGRA_INTEGER
:
2212 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2213 _mesa_lookup_enum_by_nr(format
));
2221 * This function extracts floating point RGBA values from arbitrary
2222 * image data. srcFormat and srcType are the format and type parameters
2223 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2225 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2226 * implements the "Conversion to floating point", "Conversion to RGB",
2227 * and "Final Expansion to RGBA" operations.
2229 * Args: n - number of pixels
2230 * rgba - output colors
2231 * srcFormat - format of incoming data
2232 * srcType - data type of incoming data
2233 * src - source data pointer
2234 * swapBytes - perform byteswapping of incoming data?
2237 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2238 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2239 GLboolean swapBytes
)
2241 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2243 GLint rDst
, bDst
, gDst
, aDst
;
2244 GLboolean intFormat
;
2245 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2247 ASSERT(srcFormat
== GL_RED
||
2248 srcFormat
== GL_GREEN
||
2249 srcFormat
== GL_BLUE
||
2250 srcFormat
== GL_ALPHA
||
2251 srcFormat
== GL_LUMINANCE
||
2252 srcFormat
== GL_LUMINANCE_ALPHA
||
2253 srcFormat
== GL_INTENSITY
||
2254 srcFormat
== GL_RG
||
2255 srcFormat
== GL_RGB
||
2256 srcFormat
== GL_BGR
||
2257 srcFormat
== GL_RGBA
||
2258 srcFormat
== GL_BGRA
||
2259 srcFormat
== GL_ABGR_EXT
||
2260 srcFormat
== GL_RED_INTEGER_EXT
||
2261 srcFormat
== GL_GREEN_INTEGER_EXT
||
2262 srcFormat
== GL_BLUE_INTEGER_EXT
||
2263 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2264 srcFormat
== GL_RG_INTEGER
||
2265 srcFormat
== GL_RGB_INTEGER_EXT
||
2266 srcFormat
== GL_RGBA_INTEGER_EXT
||
2267 srcFormat
== GL_BGR_INTEGER_EXT
||
2268 srcFormat
== GL_BGRA_INTEGER_EXT
||
2269 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2270 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2272 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2273 srcType
== GL_BYTE
||
2274 srcType
== GL_UNSIGNED_SHORT
||
2275 srcType
== GL_SHORT
||
2276 srcType
== GL_UNSIGNED_INT
||
2277 srcType
== GL_INT
||
2278 srcType
== GL_HALF_FLOAT_ARB
||
2279 srcType
== GL_FLOAT
||
2280 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2281 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2282 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2283 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2284 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2285 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2286 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2287 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2288 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2289 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2290 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2291 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2293 get_component_mapping(srcFormat
,
2294 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2295 &rDst
, &gDst
, &bDst
, &aDst
);
2297 stride
= _mesa_components_in_format(srcFormat
);
2299 intFormat
= _mesa_is_integer_format(srcFormat
);
2301 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2302 if ((SRC_INDEX) < 0) { \
2305 for (i = 0; i < n; i++) { \
2306 rgba[i][DST_INDEX] = DEFAULT_INT; \
2310 for (i = 0; i < n; i++) { \
2311 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2315 else if (swapBytes) { \
2316 const TYPE *s = (const TYPE *) src; \
2318 for (i = 0; i < n; i++) { \
2319 TYPE value = s[SRC_INDEX]; \
2320 if (sizeof(TYPE) == 2) { \
2323 else if (sizeof(TYPE) == 4) { \
2327 rgba[i][DST_INDEX] = (GLfloat) value; \
2329 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2334 const TYPE *s = (const TYPE *) src; \
2337 for (i = 0; i < n; i++) { \
2338 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2343 for (i = 0; i < n; i++) { \
2344 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2351 case GL_UNSIGNED_BYTE
:
2352 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2353 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2354 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2355 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2358 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2359 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2360 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2361 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2363 case GL_UNSIGNED_SHORT
:
2364 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2365 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2366 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2367 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2370 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2371 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2372 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2373 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2375 case GL_UNSIGNED_INT
:
2376 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2377 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2378 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2379 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2382 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2383 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2384 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2385 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2388 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2389 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2390 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2391 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2393 case GL_HALF_FLOAT_ARB
:
2394 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2395 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2396 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2397 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2399 case GL_UNSIGNED_BYTE_3_3_2
:
2401 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2408 for (i
= 0; i
< n
; i
++) {
2409 GLubyte p
= ubsrc
[i
];
2410 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2411 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2412 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2413 rgba
[i
][aDst
] = 1.0F
;
2417 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2419 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2426 for (i
= 0; i
< n
; i
++) {
2427 GLubyte p
= ubsrc
[i
];
2428 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2429 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2430 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2431 rgba
[i
][aDst
] = 1.0F
;
2435 case GL_UNSIGNED_SHORT_5_6_5
:
2442 const GLushort
*ussrc
= (const GLushort
*) src
;
2444 for (i
= 0; i
< n
; i
++) {
2445 GLushort p
= ussrc
[i
];
2447 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2448 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2449 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2450 rgba
[i
][aDst
] = 1.0F
;
2454 const GLushort
*ussrc
= (const GLushort
*) src
;
2456 for (i
= 0; i
< n
; i
++) {
2457 GLushort p
= ussrc
[i
];
2458 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2459 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2460 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2461 rgba
[i
][aDst
] = 1.0F
;
2465 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2472 const GLushort
*ussrc
= (const GLushort
*) src
;
2474 for (i
= 0; i
< n
; i
++) {
2475 GLushort p
= ussrc
[i
];
2477 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2478 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2479 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2480 rgba
[i
][aDst
] = 1.0F
;
2484 const GLushort
*ussrc
= (const GLushort
*) src
;
2486 for (i
= 0; i
< n
; i
++) {
2487 GLushort p
= ussrc
[i
];
2488 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2489 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2490 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2491 rgba
[i
][aDst
] = 1.0F
;
2495 case GL_UNSIGNED_SHORT_4_4_4_4
:
2497 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2500 const GLushort
*ussrc
= (const GLushort
*) src
;
2502 for (i
= 0; i
< n
; i
++) {
2503 GLushort p
= ussrc
[i
];
2505 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2506 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2507 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2508 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2512 const GLushort
*ussrc
= (const GLushort
*) src
;
2514 for (i
= 0; i
< n
; i
++) {
2515 GLushort p
= ussrc
[i
];
2516 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2517 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2518 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2519 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2523 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2525 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2528 const GLushort
*ussrc
= (const GLushort
*) src
;
2530 for (i
= 0; i
< n
; i
++) {
2531 GLushort p
= ussrc
[i
];
2533 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2534 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2535 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2536 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2540 const GLushort
*ussrc
= (const GLushort
*) src
;
2542 for (i
= 0; i
< n
; i
++) {
2543 GLushort p
= ussrc
[i
];
2544 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2545 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2546 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2547 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2551 case GL_UNSIGNED_SHORT_5_5_5_1
:
2553 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2556 const GLushort
*ussrc
= (const GLushort
*) src
;
2558 for (i
= 0; i
< n
; i
++) {
2559 GLushort p
= ussrc
[i
];
2561 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2562 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2563 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2564 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2568 const GLushort
*ussrc
= (const GLushort
*) src
;
2570 for (i
= 0; i
< n
; i
++) {
2571 GLushort p
= ussrc
[i
];
2572 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2573 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2574 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2575 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2579 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2581 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2584 const GLushort
*ussrc
= (const GLushort
*) src
;
2586 for (i
= 0; i
< n
; i
++) {
2587 GLushort p
= ussrc
[i
];
2589 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2590 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2591 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2592 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2596 const GLushort
*ussrc
= (const GLushort
*) src
;
2598 for (i
= 0; i
< n
; i
++) {
2599 GLushort p
= ussrc
[i
];
2600 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2601 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2602 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2603 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2607 case GL_UNSIGNED_INT_8_8_8_8
:
2609 const GLuint
*uisrc
= (const GLuint
*) src
;
2612 for (i
= 0; i
< n
; i
++) {
2613 GLuint p
= uisrc
[i
];
2614 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2615 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2616 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2617 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2621 for (i
= 0; i
< n
; i
++) {
2622 GLuint p
= uisrc
[i
];
2623 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2624 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2625 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2626 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2631 const GLuint
*uisrc
= (const GLuint
*) src
;
2634 for (i
= 0; i
< n
; i
++) {
2635 GLuint p
= uisrc
[i
];
2636 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2637 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2638 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2639 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2643 for (i
= 0; i
< n
; i
++) {
2644 GLuint p
= uisrc
[i
];
2645 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2646 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2647 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2648 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2653 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2655 const GLuint
*uisrc
= (const GLuint
*) src
;
2658 for (i
= 0; i
< n
; i
++) {
2659 GLuint p
= uisrc
[i
];
2660 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2661 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2662 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2663 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2667 for (i
= 0; i
< n
; i
++) {
2668 GLuint p
= uisrc
[i
];
2669 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2670 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2671 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2672 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2677 const GLuint
*uisrc
= (const GLuint
*) src
;
2680 for (i
= 0; i
< n
; i
++) {
2681 GLuint p
= uisrc
[i
];
2682 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2683 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2684 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2685 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2689 for (i
= 0; i
< n
; i
++) {
2690 GLuint p
= uisrc
[i
];
2691 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2692 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2693 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2694 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2700 _mesa_problem(NULL
, "bad srcType in extract float data");
2707 static inline GLuint
2708 clamp_float_to_uint(GLfloat f
)
2710 return f
< 0.0F
? 0 : IROUND(f
);
2714 static inline GLuint
2715 clamp_half_to_uint(GLhalfARB h
)
2717 GLfloat f
= _mesa_half_to_float(h
);
2718 return f
< 0.0F
? 0 : IROUND(f
);
2723 * \sa extract_float_rgba()
2726 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2727 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2728 GLboolean swapBytes
)
2730 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2732 GLint rDst
, bDst
, gDst
, aDst
;
2734 ASSERT(srcFormat
== GL_RED
||
2735 srcFormat
== GL_GREEN
||
2736 srcFormat
== GL_BLUE
||
2737 srcFormat
== GL_ALPHA
||
2738 srcFormat
== GL_LUMINANCE
||
2739 srcFormat
== GL_LUMINANCE_ALPHA
||
2740 srcFormat
== GL_INTENSITY
||
2741 srcFormat
== GL_RG
||
2742 srcFormat
== GL_RGB
||
2743 srcFormat
== GL_BGR
||
2744 srcFormat
== GL_RGBA
||
2745 srcFormat
== GL_BGRA
||
2746 srcFormat
== GL_ABGR_EXT
||
2747 srcFormat
== GL_RED_INTEGER_EXT
||
2748 srcFormat
== GL_RG_INTEGER
||
2749 srcFormat
== GL_GREEN_INTEGER_EXT
||
2750 srcFormat
== GL_BLUE_INTEGER_EXT
||
2751 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2752 srcFormat
== GL_RGB_INTEGER_EXT
||
2753 srcFormat
== GL_RGBA_INTEGER_EXT
||
2754 srcFormat
== GL_BGR_INTEGER_EXT
||
2755 srcFormat
== GL_BGRA_INTEGER_EXT
||
2756 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2757 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2759 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2760 srcType
== GL_BYTE
||
2761 srcType
== GL_UNSIGNED_SHORT
||
2762 srcType
== GL_SHORT
||
2763 srcType
== GL_UNSIGNED_INT
||
2764 srcType
== GL_INT
||
2765 srcType
== GL_HALF_FLOAT_ARB
||
2766 srcType
== GL_FLOAT
||
2767 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2768 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2769 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2770 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2771 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2772 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2773 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2774 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2775 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2776 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2777 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2778 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2780 get_component_mapping(srcFormat
,
2781 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2782 &rDst
, &gDst
, &bDst
, &aDst
);
2784 stride
= _mesa_components_in_format(srcFormat
);
2786 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2787 if ((SRC_INDEX) < 0) { \
2789 for (i = 0; i < n; i++) { \
2790 rgba[i][DST_INDEX] = DEFAULT; \
2793 else if (swapBytes) { \
2794 const TYPE *s = (const TYPE *) src; \
2796 for (i = 0; i < n; i++) { \
2797 TYPE value = s[SRC_INDEX]; \
2798 if (sizeof(TYPE) == 2) { \
2801 else if (sizeof(TYPE) == 4) { \
2804 rgba[i][DST_INDEX] = CONVERSION(value); \
2809 const TYPE *s = (const TYPE *) src; \
2811 for (i = 0; i < n; i++) { \
2812 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2818 case GL_UNSIGNED_BYTE
:
2819 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2820 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2821 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2822 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2825 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
2826 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
2827 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
2828 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
2830 case GL_UNSIGNED_SHORT
:
2831 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2832 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2833 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2834 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2837 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
2838 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
2839 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
2840 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
2842 case GL_UNSIGNED_INT
:
2843 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2844 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2845 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2846 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2849 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
2850 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
2851 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
2852 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
2855 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2856 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2857 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2858 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
2860 case GL_HALF_FLOAT_ARB
:
2861 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2862 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2863 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2864 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
2866 case GL_UNSIGNED_BYTE_3_3_2
:
2868 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2870 for (i
= 0; i
< n
; i
++) {
2871 GLubyte p
= ubsrc
[i
];
2872 rgba
[i
][rDst
] = ((p
>> 5) );
2873 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
2874 rgba
[i
][bDst
] = ((p
) & 0x3);
2879 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2881 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2883 for (i
= 0; i
< n
; i
++) {
2884 GLubyte p
= ubsrc
[i
];
2885 rgba
[i
][rDst
] = ((p
) & 0x7);
2886 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
2887 rgba
[i
][bDst
] = ((p
>> 6) );
2892 case GL_UNSIGNED_SHORT_5_6_5
:
2894 const GLushort
*ussrc
= (const GLushort
*) src
;
2896 for (i
= 0; i
< n
; i
++) {
2897 GLushort p
= ussrc
[i
];
2899 rgba
[i
][rDst
] = ((p
>> 11) );
2900 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
2901 rgba
[i
][bDst
] = ((p
) & 0x1f);
2906 const GLushort
*ussrc
= (const GLushort
*) src
;
2908 for (i
= 0; i
< n
; i
++) {
2909 GLushort p
= ussrc
[i
];
2910 rgba
[i
][rDst
] = ((p
>> 11) );
2911 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
2912 rgba
[i
][bDst
] = ((p
) & 0x1f);
2917 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2919 const GLushort
*ussrc
= (const GLushort
*) src
;
2921 for (i
= 0; i
< n
; i
++) {
2922 GLushort p
= ussrc
[i
];
2924 rgba
[i
][rDst
] = ((p
) & 0x1f);
2925 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
2926 rgba
[i
][bDst
] = ((p
>> 11) );
2931 const GLushort
*ussrc
= (const GLushort
*) src
;
2933 for (i
= 0; i
< n
; i
++) {
2934 GLushort p
= ussrc
[i
];
2935 rgba
[i
][rDst
] = ((p
) & 0x1f);
2936 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
2937 rgba
[i
][bDst
] = ((p
>> 11) );
2942 case GL_UNSIGNED_SHORT_4_4_4_4
:
2944 const GLushort
*ussrc
= (const GLushort
*) src
;
2946 for (i
= 0; i
< n
; i
++) {
2947 GLushort p
= ussrc
[i
];
2949 rgba
[i
][rDst
] = ((p
>> 12) );
2950 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
2951 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
2952 rgba
[i
][aDst
] = ((p
) & 0xf);
2956 const GLushort
*ussrc
= (const GLushort
*) src
;
2958 for (i
= 0; i
< n
; i
++) {
2959 GLushort p
= ussrc
[i
];
2960 rgba
[i
][rDst
] = ((p
>> 12) );
2961 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
2962 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
2963 rgba
[i
][aDst
] = ((p
) & 0xf);
2967 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2969 const GLushort
*ussrc
= (const GLushort
*) src
;
2971 for (i
= 0; i
< n
; i
++) {
2972 GLushort p
= ussrc
[i
];
2974 rgba
[i
][rDst
] = ((p
) & 0xf);
2975 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
2976 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
2977 rgba
[i
][aDst
] = ((p
>> 12) );
2981 const GLushort
*ussrc
= (const GLushort
*) src
;
2983 for (i
= 0; i
< n
; i
++) {
2984 GLushort p
= ussrc
[i
];
2985 rgba
[i
][rDst
] = ((p
) & 0xf);
2986 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
2987 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
2988 rgba
[i
][aDst
] = ((p
>> 12) );
2992 case GL_UNSIGNED_SHORT_5_5_5_1
:
2994 const GLushort
*ussrc
= (const GLushort
*) src
;
2996 for (i
= 0; i
< n
; i
++) {
2997 GLushort p
= ussrc
[i
];
2999 rgba
[i
][rDst
] = ((p
>> 11) );
3000 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3001 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3002 rgba
[i
][aDst
] = ((p
) & 0x1 );
3006 const GLushort
*ussrc
= (const GLushort
*) src
;
3008 for (i
= 0; i
< n
; i
++) {
3009 GLushort p
= ussrc
[i
];
3010 rgba
[i
][rDst
] = ((p
>> 11) );
3011 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3012 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3013 rgba
[i
][aDst
] = ((p
) & 0x1 );
3017 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3019 const GLushort
*ussrc
= (const GLushort
*) src
;
3021 for (i
= 0; i
< n
; i
++) {
3022 GLushort p
= ussrc
[i
];
3024 rgba
[i
][rDst
] = ((p
) & 0x1f);
3025 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3026 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3027 rgba
[i
][aDst
] = ((p
>> 15) );
3031 const GLushort
*ussrc
= (const GLushort
*) src
;
3033 for (i
= 0; i
< n
; i
++) {
3034 GLushort p
= ussrc
[i
];
3035 rgba
[i
][rDst
] = ((p
) & 0x1f);
3036 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3037 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3038 rgba
[i
][aDst
] = ((p
>> 15) );
3042 case GL_UNSIGNED_INT_8_8_8_8
:
3044 const GLuint
*uisrc
= (const GLuint
*) src
;
3046 for (i
= 0; i
< n
; i
++) {
3047 GLuint p
= uisrc
[i
];
3048 rgba
[i
][rDst
] = ((p
) & 0xff);
3049 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3050 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3051 rgba
[i
][aDst
] = ((p
>> 24) );
3055 const GLuint
*uisrc
= (const GLuint
*) src
;
3057 for (i
= 0; i
< n
; i
++) {
3058 GLuint p
= uisrc
[i
];
3059 rgba
[i
][rDst
] = ((p
>> 24) );
3060 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3061 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3062 rgba
[i
][aDst
] = ((p
) & 0xff);
3066 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3068 const GLuint
*uisrc
= (const GLuint
*) src
;
3070 for (i
= 0; i
< n
; i
++) {
3071 GLuint p
= uisrc
[i
];
3072 rgba
[i
][rDst
] = ((p
>> 24) );
3073 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3074 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3075 rgba
[i
][aDst
] = ((p
) & 0xff);
3079 const GLuint
*uisrc
= (const GLuint
*) src
;
3081 for (i
= 0; i
< n
; i
++) {
3082 GLuint p
= uisrc
[i
];
3083 rgba
[i
][rDst
] = ((p
) & 0xff);
3084 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3085 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3086 rgba
[i
][aDst
] = ((p
>> 24) );
3091 _mesa_problem(NULL
, "bad srcType in extract uint data");
3100 * Unpack a row of color image data from a client buffer according to
3101 * the pixel unpacking parameters.
3102 * Return GLubyte values in the specified dest image format.
3103 * This is used by glDrawPixels and glTexImage?D().
3104 * \param ctx - the context
3105 * n - number of pixels in the span
3106 * dstFormat - format of destination color array
3107 * dest - the destination color array
3108 * srcFormat - source image format
3109 * srcType - source image data type
3110 * source - source image pointer
3111 * srcPacking - pixel unpacking parameters
3112 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3114 * XXX perhaps expand this to process whole images someday.
3117 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3118 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3119 GLenum srcFormat
, GLenum srcType
,
3120 const GLvoid
*source
,
3121 const struct gl_pixelstore_attrib
*srcPacking
,
3122 GLbitfield transferOps
)
3124 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3125 ASSERT(dstFormat
== GL_ALPHA
||
3126 dstFormat
== GL_LUMINANCE
||
3127 dstFormat
== GL_LUMINANCE_ALPHA
||
3128 dstFormat
== GL_INTENSITY
||
3129 dstFormat
== GL_RED
||
3130 dstFormat
== GL_RG
||
3131 dstFormat
== GL_RGB
||
3132 dstFormat
== GL_RGBA
);
3134 ASSERT(srcFormat
== GL_RED
||
3135 srcFormat
== GL_GREEN
||
3136 srcFormat
== GL_BLUE
||
3137 srcFormat
== GL_ALPHA
||
3138 srcFormat
== GL_LUMINANCE
||
3139 srcFormat
== GL_LUMINANCE_ALPHA
||
3140 srcFormat
== GL_INTENSITY
||
3141 srcFormat
== GL_RG
||
3142 srcFormat
== GL_RGB
||
3143 srcFormat
== GL_BGR
||
3144 srcFormat
== GL_RGBA
||
3145 srcFormat
== GL_BGRA
||
3146 srcFormat
== GL_ABGR_EXT
||
3147 srcFormat
== GL_COLOR_INDEX
);
3149 ASSERT(srcType
== GL_BITMAP
||
3150 srcType
== GL_UNSIGNED_BYTE
||
3151 srcType
== GL_BYTE
||
3152 srcType
== GL_UNSIGNED_SHORT
||
3153 srcType
== GL_SHORT
||
3154 srcType
== GL_UNSIGNED_INT
||
3155 srcType
== GL_INT
||
3156 srcType
== GL_HALF_FLOAT_ARB
||
3157 srcType
== GL_FLOAT
||
3158 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3159 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3160 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3161 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3162 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3163 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3164 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3165 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3166 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3167 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3168 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3169 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3171 /* EXT_texture_integer specifies no transfer ops on integer
3172 * types in the resolved issues section. Just set them to 0
3173 * for integer surfaces.
3178 /* Try simple cases first */
3179 if (transferOps
== 0) {
3180 if (srcType
== GL_UNSIGNED_BYTE
) {
3181 if (dstFormat
== GL_RGBA
) {
3182 if (srcFormat
== GL_RGBA
) {
3183 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3186 else if (srcFormat
== GL_RGB
) {
3188 const GLubyte
*src
= (const GLubyte
*) source
;
3189 GLubyte
*dst
= dest
;
3190 for (i
= 0; i
< n
; i
++) {
3201 else if (dstFormat
== GL_RGB
) {
3202 if (srcFormat
== GL_RGB
) {
3203 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3206 else if (srcFormat
== GL_RGBA
) {
3208 const GLubyte
*src
= (const GLubyte
*) source
;
3209 GLubyte
*dst
= dest
;
3210 for (i
= 0; i
< n
; i
++) {
3220 else if (dstFormat
== srcFormat
) {
3221 GLint comps
= _mesa_components_in_format(srcFormat
);
3223 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3230 /* general solution begins here */
3232 GLint dstComponents
;
3233 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3234 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3237 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3241 dstComponents
= _mesa_components_in_format( dstFormat
);
3242 /* source & dest image formats should have been error checked by now */
3243 assert(dstComponents
> 0);
3246 * Extract image data and convert to RGBA floats
3248 if (srcFormat
== GL_COLOR_INDEX
) {
3249 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3252 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3257 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3260 /* Convert indexes to RGBA */
3261 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3262 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3264 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3266 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3267 * with color indexes.
3269 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3274 /* non-color index data */
3275 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3276 srcPacking
->SwapBytes
);
3279 /* Need to clamp if returning GLubytes */
3280 transferOps
|= IMAGE_CLAMP_BIT
;
3283 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3286 get_component_indexes(dstFormat
,
3287 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3289 /* Now return the GLubyte data in the requested dstFormat */
3291 GLubyte
*dst
= dest
;
3293 for (i
= 0; i
< n
; i
++) {
3294 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3295 dst
+= dstComponents
;
3300 GLubyte
*dst
= dest
;
3302 for (i
= 0; i
< n
; i
++) {
3303 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3304 dst
+= dstComponents
;
3309 GLubyte
*dst
= dest
;
3311 for (i
= 0; i
< n
; i
++) {
3312 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3313 dst
+= dstComponents
;
3318 GLubyte
*dst
= dest
;
3320 for (i
= 0; i
< n
; i
++) {
3321 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3322 dst
+= dstComponents
;
3327 GLubyte
*dst
= dest
;
3330 assert(dstComponents
== 1);
3331 for (i
= 0; i
< n
; i
++) {
3332 /* Intensity comes from red channel */
3333 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3338 GLubyte
*dst
= dest
;
3341 for (i
= 0; i
< n
; i
++) {
3342 /* Luminance comes from red channel */
3343 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3344 dst
+= dstComponents
;
3354 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3355 * instead of GLubyte.
3358 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3359 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3360 GLenum srcFormat
, GLenum srcType
,
3361 const GLvoid
*source
,
3362 const struct gl_pixelstore_attrib
*srcPacking
,
3363 GLbitfield transferOps
)
3365 ASSERT(dstFormat
== GL_ALPHA
||
3366 dstFormat
== GL_LUMINANCE
||
3367 dstFormat
== GL_LUMINANCE_ALPHA
||
3368 dstFormat
== GL_INTENSITY
||
3369 dstFormat
== GL_RED
||
3370 dstFormat
== GL_RG
||
3371 dstFormat
== GL_RGB
||
3372 dstFormat
== GL_RGBA
);
3374 ASSERT(srcFormat
== GL_RED
||
3375 srcFormat
== GL_GREEN
||
3376 srcFormat
== GL_BLUE
||
3377 srcFormat
== GL_ALPHA
||
3378 srcFormat
== GL_LUMINANCE
||
3379 srcFormat
== GL_LUMINANCE_ALPHA
||
3380 srcFormat
== GL_INTENSITY
||
3381 srcFormat
== GL_RG
||
3382 srcFormat
== GL_RGB
||
3383 srcFormat
== GL_BGR
||
3384 srcFormat
== GL_RGBA
||
3385 srcFormat
== GL_BGRA
||
3386 srcFormat
== GL_ABGR_EXT
||
3387 srcFormat
== GL_RED_INTEGER_EXT
||
3388 srcFormat
== GL_GREEN_INTEGER_EXT
||
3389 srcFormat
== GL_BLUE_INTEGER_EXT
||
3390 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3391 srcFormat
== GL_RG_INTEGER
||
3392 srcFormat
== GL_RGB_INTEGER_EXT
||
3393 srcFormat
== GL_RGBA_INTEGER_EXT
||
3394 srcFormat
== GL_BGR_INTEGER_EXT
||
3395 srcFormat
== GL_BGRA_INTEGER_EXT
||
3396 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3397 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3398 srcFormat
== GL_COLOR_INDEX
);
3400 ASSERT(srcType
== GL_BITMAP
||
3401 srcType
== GL_UNSIGNED_BYTE
||
3402 srcType
== GL_BYTE
||
3403 srcType
== GL_UNSIGNED_SHORT
||
3404 srcType
== GL_SHORT
||
3405 srcType
== GL_UNSIGNED_INT
||
3406 srcType
== GL_INT
||
3407 srcType
== GL_HALF_FLOAT_ARB
||
3408 srcType
== GL_FLOAT
||
3409 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3410 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3411 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3412 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3413 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3414 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3415 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3416 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3417 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3418 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3419 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3420 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3422 /* general solution, no special cases, yet */
3424 GLint dstComponents
;
3425 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3426 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3427 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3430 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3434 dstComponents
= _mesa_components_in_format( dstFormat
);
3435 /* source & dest image formats should have been error checked by now */
3436 assert(dstComponents
> 0);
3438 /* EXT_texture_integer specifies no transfer ops on integer
3439 * types in the resolved issues section. Just set them to 0
3440 * for integer surfaces.
3446 * Extract image data and convert to RGBA floats
3448 if (srcFormat
== GL_COLOR_INDEX
) {
3449 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3452 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3457 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3460 /* Convert indexes to RGBA */
3461 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3462 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3464 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3466 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3467 * with color indexes.
3469 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3474 /* non-color index data */
3475 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3476 srcPacking
->SwapBytes
);
3480 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3483 get_component_indexes(dstFormat
,
3484 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3486 /* Now pack results in the requested dstFormat */
3488 GLfloat
*dst
= dest
;
3490 for (i
= 0; i
< n
; i
++) {
3491 dst
[rDst
] = rgba
[i
][RCOMP
];
3492 dst
+= dstComponents
;
3497 GLfloat
*dst
= dest
;
3499 for (i
= 0; i
< n
; i
++) {
3500 dst
[gDst
] = rgba
[i
][GCOMP
];
3501 dst
+= dstComponents
;
3506 GLfloat
*dst
= dest
;
3508 for (i
= 0; i
< n
; i
++) {
3509 dst
[bDst
] = rgba
[i
][BCOMP
];
3510 dst
+= dstComponents
;
3515 GLfloat
*dst
= dest
;
3517 for (i
= 0; i
< n
; i
++) {
3518 dst
[aDst
] = rgba
[i
][ACOMP
];
3519 dst
+= dstComponents
;
3524 GLfloat
*dst
= dest
;
3527 assert(dstComponents
== 1);
3528 for (i
= 0; i
< n
; i
++) {
3529 /* Intensity comes from red channel */
3530 dst
[i
] = rgba
[i
][RCOMP
];
3535 GLfloat
*dst
= dest
;
3538 for (i
= 0; i
< n
; i
++) {
3539 /* Luminance comes from red channel */
3540 dst
[0] = rgba
[i
][RCOMP
];
3541 dst
+= dstComponents
;
3551 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3552 * instead of GLubyte.
3553 * No pixel transfer ops are applied.
3556 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3557 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3558 GLenum srcFormat
, GLenum srcType
,
3559 const GLvoid
*source
,
3560 const struct gl_pixelstore_attrib
*srcPacking
)
3562 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3565 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3569 ASSERT(dstFormat
== GL_ALPHA
||
3570 dstFormat
== GL_LUMINANCE
||
3571 dstFormat
== GL_LUMINANCE_ALPHA
||
3572 dstFormat
== GL_INTENSITY
||
3573 dstFormat
== GL_RED
||
3574 dstFormat
== GL_RG
||
3575 dstFormat
== GL_RGB
||
3576 dstFormat
== GL_RGBA
);
3578 ASSERT(srcFormat
== GL_RED
||
3579 srcFormat
== GL_GREEN
||
3580 srcFormat
== GL_BLUE
||
3581 srcFormat
== GL_ALPHA
||
3582 srcFormat
== GL_LUMINANCE
||
3583 srcFormat
== GL_LUMINANCE_ALPHA
||
3584 srcFormat
== GL_INTENSITY
||
3585 srcFormat
== GL_RG
||
3586 srcFormat
== GL_RGB
||
3587 srcFormat
== GL_BGR
||
3588 srcFormat
== GL_RGBA
||
3589 srcFormat
== GL_BGRA
||
3590 srcFormat
== GL_ABGR_EXT
||
3591 srcFormat
== GL_RED_INTEGER_EXT
||
3592 srcFormat
== GL_GREEN_INTEGER_EXT
||
3593 srcFormat
== GL_BLUE_INTEGER_EXT
||
3594 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3595 srcFormat
== GL_RG_INTEGER
||
3596 srcFormat
== GL_RGB_INTEGER_EXT
||
3597 srcFormat
== GL_RGBA_INTEGER_EXT
||
3598 srcFormat
== GL_BGR_INTEGER_EXT
||
3599 srcFormat
== GL_BGRA_INTEGER_EXT
||
3600 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3601 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3603 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3604 srcType
== GL_BYTE
||
3605 srcType
== GL_UNSIGNED_SHORT
||
3606 srcType
== GL_SHORT
||
3607 srcType
== GL_UNSIGNED_INT
||
3608 srcType
== GL_INT
||
3609 srcType
== GL_HALF_FLOAT_ARB
||
3610 srcType
== GL_FLOAT
||
3611 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3612 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3613 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3614 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3615 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3616 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3617 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3618 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3619 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3620 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3621 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3622 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3625 /* Extract image data as uint[4] pixels */
3626 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3627 srcPacking
->SwapBytes
);
3629 if (dstFormat
== GL_RGBA
) {
3631 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3635 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3636 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3638 assert(dstComponents
> 0);
3640 get_component_indexes(dstFormat
,
3641 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3643 /* Now pack values in the requested dest format */
3647 for (i
= 0; i
< n
; i
++) {
3648 dst
[rDst
] = rgba
[i
][RCOMP
];
3649 dst
+= dstComponents
;
3656 for (i
= 0; i
< n
; i
++) {
3657 dst
[gDst
] = rgba
[i
][GCOMP
];
3658 dst
+= dstComponents
;
3665 for (i
= 0; i
< n
; i
++) {
3666 dst
[bDst
] = rgba
[i
][BCOMP
];
3667 dst
+= dstComponents
;
3674 for (i
= 0; i
< n
; i
++) {
3675 dst
[aDst
] = rgba
[i
][ACOMP
];
3676 dst
+= dstComponents
;
3684 assert(dstComponents
== 1);
3685 for (i
= 0; i
< n
; i
++) {
3686 /* Intensity comes from red channel */
3687 dst
[i
] = rgba
[i
][RCOMP
];
3695 for (i
= 0; i
< n
; i
++) {
3696 /* Luminance comes from red channel */
3697 dst
[0] = rgba
[i
][RCOMP
];
3698 dst
+= dstComponents
;
3708 * Unpack a row of color index data from a client buffer according to
3709 * the pixel unpacking parameters.
3710 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3712 * Args: ctx - the context
3713 * n - number of pixels
3714 * dstType - destination data type
3715 * dest - destination array
3716 * srcType - source pixel type
3717 * source - source data pointer
3718 * srcPacking - pixel unpacking parameters
3719 * transferOps - the pixel transfer operations to apply
3722 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
3723 GLenum dstType
, GLvoid
*dest
,
3724 GLenum srcType
, const GLvoid
*source
,
3725 const struct gl_pixelstore_attrib
*srcPacking
,
3726 GLbitfield transferOps
)
3728 ASSERT(srcType
== GL_BITMAP
||
3729 srcType
== GL_UNSIGNED_BYTE
||
3730 srcType
== GL_BYTE
||
3731 srcType
== GL_UNSIGNED_SHORT
||
3732 srcType
== GL_SHORT
||
3733 srcType
== GL_UNSIGNED_INT
||
3734 srcType
== GL_INT
||
3735 srcType
== GL_HALF_FLOAT_ARB
||
3736 srcType
== GL_FLOAT
);
3738 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3739 dstType
== GL_UNSIGNED_SHORT
||
3740 dstType
== GL_UNSIGNED_INT
);
3743 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3746 * Try simple cases first
3748 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
3749 && dstType
== GL_UNSIGNED_BYTE
) {
3750 memcpy(dest
, source
, n
* sizeof(GLubyte
));
3752 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
3753 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
3754 memcpy(dest
, source
, n
* sizeof(GLuint
));
3760 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3763 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3767 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
3771 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3773 /* convert to dest type */
3775 case GL_UNSIGNED_BYTE
:
3777 GLubyte
*dst
= (GLubyte
*) dest
;
3779 for (i
= 0; i
< n
; i
++) {
3780 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
3784 case GL_UNSIGNED_SHORT
:
3786 GLuint
*dst
= (GLuint
*) dest
;
3788 for (i
= 0; i
< n
; i
++) {
3789 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
3793 case GL_UNSIGNED_INT
:
3794 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
3797 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
3806 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
3807 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
3808 const struct gl_pixelstore_attrib
*dstPacking
,
3809 GLbitfield transferOps
)
3811 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3814 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
3818 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
3820 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
3821 /* make a copy of input */
3822 memcpy(indexes
, source
, n
* sizeof(GLuint
));
3823 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3828 case GL_UNSIGNED_BYTE
:
3830 GLubyte
*dst
= (GLubyte
*) dest
;
3832 for (i
= 0; i
< n
; i
++) {
3833 *dst
++ = (GLubyte
) source
[i
];
3839 GLbyte
*dst
= (GLbyte
*) dest
;
3841 for (i
= 0; i
< n
; i
++) {
3842 dst
[i
] = (GLbyte
) source
[i
];
3846 case GL_UNSIGNED_SHORT
:
3848 GLushort
*dst
= (GLushort
*) dest
;
3850 for (i
= 0; i
< n
; i
++) {
3851 dst
[i
] = (GLushort
) source
[i
];
3853 if (dstPacking
->SwapBytes
) {
3854 _mesa_swap2( (GLushort
*) dst
, n
);
3860 GLshort
*dst
= (GLshort
*) dest
;
3862 for (i
= 0; i
< n
; i
++) {
3863 dst
[i
] = (GLshort
) source
[i
];
3865 if (dstPacking
->SwapBytes
) {
3866 _mesa_swap2( (GLushort
*) dst
, n
);
3870 case GL_UNSIGNED_INT
:
3872 GLuint
*dst
= (GLuint
*) dest
;
3874 for (i
= 0; i
< n
; i
++) {
3875 dst
[i
] = (GLuint
) source
[i
];
3877 if (dstPacking
->SwapBytes
) {
3878 _mesa_swap4( (GLuint
*) dst
, n
);
3884 GLint
*dst
= (GLint
*) dest
;
3886 for (i
= 0; i
< n
; i
++) {
3887 dst
[i
] = (GLint
) source
[i
];
3889 if (dstPacking
->SwapBytes
) {
3890 _mesa_swap4( (GLuint
*) dst
, n
);
3896 GLfloat
*dst
= (GLfloat
*) dest
;
3898 for (i
= 0; i
< n
; i
++) {
3899 dst
[i
] = (GLfloat
) source
[i
];
3901 if (dstPacking
->SwapBytes
) {
3902 _mesa_swap4( (GLuint
*) dst
, n
);
3906 case GL_HALF_FLOAT_ARB
:
3908 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
3910 for (i
= 0; i
< n
; i
++) {
3911 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
3913 if (dstPacking
->SwapBytes
) {
3914 _mesa_swap2( (GLushort
*) dst
, n
);
3919 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
3927 * Unpack a row of stencil data from a client buffer according to
3928 * the pixel unpacking parameters.
3929 * This is (or will be) used by glDrawPixels
3931 * Args: ctx - the context
3932 * n - number of pixels
3933 * dstType - destination data type
3934 * dest - destination array
3935 * srcType - source pixel type
3936 * source - source data pointer
3937 * srcPacking - pixel unpacking parameters
3938 * transferOps - apply offset/bias/lookup ops?
3941 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
3942 GLenum dstType
, GLvoid
*dest
,
3943 GLenum srcType
, const GLvoid
*source
,
3944 const struct gl_pixelstore_attrib
*srcPacking
,
3945 GLbitfield transferOps
)
3947 ASSERT(srcType
== GL_BITMAP
||
3948 srcType
== GL_UNSIGNED_BYTE
||
3949 srcType
== GL_BYTE
||
3950 srcType
== GL_UNSIGNED_SHORT
||
3951 srcType
== GL_SHORT
||
3952 srcType
== GL_UNSIGNED_INT
||
3953 srcType
== GL_INT
||
3954 srcType
== GL_HALF_FLOAT_ARB
||
3955 srcType
== GL_FLOAT
);
3957 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
3958 dstType
== GL_UNSIGNED_SHORT
||
3959 dstType
== GL_UNSIGNED_INT
);
3961 /* only shift and offset apply to stencil */
3962 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
3965 * Try simple cases first
3967 if (transferOps
== 0 &&
3968 !ctx
->Pixel
.MapStencilFlag
&&
3969 srcType
== GL_UNSIGNED_BYTE
&&
3970 dstType
== GL_UNSIGNED_BYTE
) {
3971 memcpy(dest
, source
, n
* sizeof(GLubyte
));
3973 else if (transferOps
== 0 &&
3974 !ctx
->Pixel
.MapStencilFlag
&&
3975 srcType
== GL_UNSIGNED_INT
&&
3976 dstType
== GL_UNSIGNED_INT
&&
3977 !srcPacking
->SwapBytes
) {
3978 memcpy(dest
, source
, n
* sizeof(GLuint
));
3984 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3987 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
3991 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
3994 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3995 /* shift and offset indexes */
3996 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3999 if (ctx
->Pixel
.MapStencilFlag
) {
4000 /* Apply stencil lookup table */
4001 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4003 for (i
= 0; i
< n
; i
++) {
4004 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4008 /* convert to dest type */
4010 case GL_UNSIGNED_BYTE
:
4012 GLubyte
*dst
= (GLubyte
*) dest
;
4014 for (i
= 0; i
< n
; i
++) {
4015 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4019 case GL_UNSIGNED_SHORT
:
4021 GLuint
*dst
= (GLuint
*) dest
;
4023 for (i
= 0; i
< n
; i
++) {
4024 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4028 case GL_UNSIGNED_INT
:
4029 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4032 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4041 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4042 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4043 const struct gl_pixelstore_attrib
*dstPacking
)
4045 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4048 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4052 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4053 ctx
->Pixel
.MapStencilFlag
) {
4054 /* make a copy of input */
4055 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4056 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4061 case GL_UNSIGNED_BYTE
:
4062 memcpy(dest
, source
, n
);
4066 GLbyte
*dst
= (GLbyte
*) dest
;
4069 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4073 case GL_UNSIGNED_SHORT
:
4075 GLushort
*dst
= (GLushort
*) dest
;
4078 dst
[i
] = (GLushort
) source
[i
];
4080 if (dstPacking
->SwapBytes
) {
4081 _mesa_swap2( (GLushort
*) dst
, n
);
4087 GLshort
*dst
= (GLshort
*) dest
;
4090 dst
[i
] = (GLshort
) source
[i
];
4092 if (dstPacking
->SwapBytes
) {
4093 _mesa_swap2( (GLushort
*) dst
, n
);
4097 case GL_UNSIGNED_INT
:
4099 GLuint
*dst
= (GLuint
*) dest
;
4102 dst
[i
] = (GLuint
) source
[i
];
4104 if (dstPacking
->SwapBytes
) {
4105 _mesa_swap4( (GLuint
*) dst
, n
);
4111 GLint
*dst
= (GLint
*) dest
;
4114 dst
[i
] = (GLint
) source
[i
];
4116 if (dstPacking
->SwapBytes
) {
4117 _mesa_swap4( (GLuint
*) dst
, n
);
4123 GLfloat
*dst
= (GLfloat
*) dest
;
4126 dst
[i
] = (GLfloat
) source
[i
];
4128 if (dstPacking
->SwapBytes
) {
4129 _mesa_swap4( (GLuint
*) dst
, n
);
4133 case GL_HALF_FLOAT_ARB
:
4135 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4138 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4140 if (dstPacking
->SwapBytes
) {
4141 _mesa_swap2( (GLushort
*) dst
, n
);
4146 if (dstPacking
->LsbFirst
) {
4147 GLubyte
*dst
= (GLubyte
*) dest
;
4150 for (i
= 0; i
< n
; i
++) {
4153 *dst
|= ((source
[i
] != 0) << shift
);
4162 GLubyte
*dst
= (GLubyte
*) dest
;
4165 for (i
= 0; i
< n
; i
++) {
4168 *dst
|= ((source
[i
] != 0) << shift
);
4178 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4184 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4187 const GLTYPE *src = (const GLTYPE *)source; \
4188 for (i = 0; i < n; i++) { \
4189 GLTYPE value = src[i]; \
4190 if (srcPacking->SwapBytes) { \
4191 if (sizeof(GLTYPE) == 2) { \
4193 } else if (sizeof(GLTYPE) == 4) { \
4197 depthValues[i] = GLTYPE2FLOAT(value); \
4203 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4204 * or GLfloat values.
4205 * The glPixelTransfer (scale/bias) params will be applied.
4207 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4208 * \param depthMax max value for returned GLushort or GLuint values
4209 * (ignored for GLfloat).
4212 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4213 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4214 GLenum srcType
, const GLvoid
*source
,
4215 const struct gl_pixelstore_attrib
*srcPacking
)
4217 GLfloat
*depthTemp
= NULL
, *depthValues
;
4218 GLboolean needClamp
= GL_FALSE
;
4220 /* Look for special cases first.
4221 * Not only are these faster, they're less prone to numeric conversion
4222 * problems. Otherwise, converting from an int type to a float then
4223 * back to an int type can introduce errors that will show up as
4224 * artifacts in things like depth peeling which uses glCopyTexImage.
4226 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4227 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4228 const GLuint
*src
= (const GLuint
*) source
;
4229 GLushort
*dst
= (GLushort
*) dest
;
4231 for (i
= 0; i
< n
; i
++) {
4232 dst
[i
] = src
[i
] >> 16;
4236 if (srcType
== GL_UNSIGNED_SHORT
4237 && dstType
== GL_UNSIGNED_INT
4238 && depthMax
== 0xffffffff) {
4239 const GLushort
*src
= (const GLushort
*) source
;
4240 GLuint
*dst
= (GLuint
*) dest
;
4242 for (i
= 0; i
< n
; i
++) {
4243 dst
[i
] = src
[i
] | (src
[i
] << 16);
4247 /* XXX may want to add additional cases here someday */
4250 /* general case path follows */
4252 if (dstType
== GL_FLOAT
) {
4253 depthValues
= (GLfloat
*) dest
;
4256 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4258 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4262 depthValues
= depthTemp
;
4265 /* Convert incoming values to GLfloat. Some conversions will require
4270 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4271 needClamp
= GL_TRUE
;
4273 case GL_UNSIGNED_BYTE
:
4274 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4277 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4278 needClamp
= GL_TRUE
;
4280 case GL_UNSIGNED_SHORT
:
4281 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4284 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4285 needClamp
= GL_TRUE
;
4287 case GL_UNSIGNED_INT
:
4288 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4291 DEPTH_VALUES(GLfloat
, 1*);
4292 needClamp
= GL_TRUE
;
4294 case GL_HALF_FLOAT_ARB
:
4297 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4298 for (i
= 0; i
< n
; i
++) {
4299 GLhalfARB value
= src
[i
];
4300 if (srcPacking
->SwapBytes
) {
4303 depthValues
[i
] = _mesa_half_to_float(value
);
4305 needClamp
= GL_TRUE
;
4309 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4314 /* apply depth scale and bias */
4316 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4317 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4318 if (scale
!= 1.0 || bias
!= 0.0) {
4320 for (i
= 0; i
< n
; i
++) {
4321 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4323 needClamp
= GL_TRUE
;
4327 /* clamp to [0, 1] */
4330 for (i
= 0; i
< n
; i
++) {
4331 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4336 * Convert values to dstType
4338 if (dstType
== GL_UNSIGNED_INT
) {
4339 GLuint
*zValues
= (GLuint
*) dest
;
4341 if (depthMax
<= 0xffffff) {
4342 /* no overflow worries */
4343 for (i
= 0; i
< n
; i
++) {
4344 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4348 /* need to use double precision to prevent overflow problems */
4349 for (i
= 0; i
< n
; i
++) {
4350 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4351 if (z
>= (GLdouble
) 0xffffffff)
4352 zValues
[i
] = 0xffffffff;
4354 zValues
[i
] = (GLuint
) z
;
4358 else if (dstType
== GL_UNSIGNED_SHORT
) {
4359 GLushort
*zValues
= (GLushort
*) dest
;
4361 ASSERT(depthMax
<= 0xffff);
4362 for (i
= 0; i
< n
; i
++) {
4363 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4366 else if (dstType
== GL_FLOAT
) {
4367 /* Nothing to do. depthValues is pointing to dest. */
4378 * Pack an array of depth values. The values are floats in [0,1].
4381 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4382 GLenum dstType
, const GLfloat
*depthSpan
,
4383 const struct gl_pixelstore_attrib
*dstPacking
)
4385 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4387 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4391 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4392 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4393 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4394 depthSpan
= depthCopy
;
4398 case GL_UNSIGNED_BYTE
:
4400 GLubyte
*dst
= (GLubyte
*) dest
;
4402 for (i
= 0; i
< n
; i
++) {
4403 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4409 GLbyte
*dst
= (GLbyte
*) dest
;
4411 for (i
= 0; i
< n
; i
++) {
4412 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4416 case GL_UNSIGNED_SHORT
:
4418 GLushort
*dst
= (GLushort
*) dest
;
4420 for (i
= 0; i
< n
; i
++) {
4421 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4423 if (dstPacking
->SwapBytes
) {
4424 _mesa_swap2( (GLushort
*) dst
, n
);
4430 GLshort
*dst
= (GLshort
*) dest
;
4432 for (i
= 0; i
< n
; i
++) {
4433 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4435 if (dstPacking
->SwapBytes
) {
4436 _mesa_swap2( (GLushort
*) dst
, n
);
4440 case GL_UNSIGNED_INT
:
4442 GLuint
*dst
= (GLuint
*) dest
;
4444 for (i
= 0; i
< n
; i
++) {
4445 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4447 if (dstPacking
->SwapBytes
) {
4448 _mesa_swap4( (GLuint
*) dst
, n
);
4454 GLint
*dst
= (GLint
*) dest
;
4456 for (i
= 0; i
< n
; i
++) {
4457 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4459 if (dstPacking
->SwapBytes
) {
4460 _mesa_swap4( (GLuint
*) dst
, n
);
4466 GLfloat
*dst
= (GLfloat
*) dest
;
4468 for (i
= 0; i
< n
; i
++) {
4469 dst
[i
] = depthSpan
[i
];
4471 if (dstPacking
->SwapBytes
) {
4472 _mesa_swap4( (GLuint
*) dst
, n
);
4476 case GL_HALF_FLOAT_ARB
:
4478 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4480 for (i
= 0; i
< n
; i
++) {
4481 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4483 if (dstPacking
->SwapBytes
) {
4484 _mesa_swap2( (GLushort
*) dst
, n
);
4489 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4498 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4499 * Return all image data in a contiguous block. This is used when we
4500 * compile glDrawPixels, glTexImage, etc into a display list. We
4501 * need a copy of the data in a standard format.
4504 _mesa_unpack_image( GLuint dimensions
,
4505 GLsizei width
, GLsizei height
, GLsizei depth
,
4506 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4507 const struct gl_pixelstore_attrib
*unpack
)
4509 GLint bytesPerRow
, compsPerRow
;
4510 GLboolean flipBytes
, swap2
, swap4
;
4513 return NULL
; /* not necessarily an error */
4515 if (width
<= 0 || height
<= 0 || depth
<= 0)
4516 return NULL
; /* generate error later */
4518 if (type
== GL_BITMAP
) {
4519 bytesPerRow
= (width
+ 7) >> 3;
4520 flipBytes
= unpack
->LsbFirst
;
4521 swap2
= swap4
= GL_FALSE
;
4525 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4526 GLint components
= _mesa_components_in_format(format
);
4529 if (_mesa_type_is_packed(type
))
4532 if (bytesPerPixel
<= 0 || components
<= 0)
4533 return NULL
; /* bad format or type. generate error later */
4534 bytesPerRow
= bytesPerPixel
* width
;
4535 bytesPerComp
= bytesPerPixel
/ components
;
4536 flipBytes
= GL_FALSE
;
4537 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4538 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4539 compsPerRow
= components
* width
;
4540 assert(compsPerRow
>= width
);
4545 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4549 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4552 for (img
= 0; img
< depth
; img
++) {
4553 for (row
= 0; row
< height
; row
++) {
4554 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4555 width
, height
, format
, type
, img
, row
, 0);
4557 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4559 flipBytes
= GL_FALSE
;
4560 if (unpack
->LsbFirst
) {
4561 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4562 GLubyte dstMask
= 128;
4563 const GLubyte
*s
= src
;
4566 for (i
= 0; i
< width
; i
++) {
4570 if (srcMask
== 128) {
4575 srcMask
= srcMask
<< 1;
4583 dstMask
= dstMask
>> 1;
4588 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
4589 GLubyte dstMask
= 128;
4590 const GLubyte
*s
= src
;
4593 for (i
= 0; i
< width
; i
++) {
4602 srcMask
= srcMask
>> 1;
4610 dstMask
= dstMask
>> 1;
4616 memcpy(dst
, src
, bytesPerRow
);
4619 /* byte flipping/swapping */
4621 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
4624 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
4627 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
4639 * If we unpack colors from a luminance surface, we'll get pixel colors
4640 * such as (l, l, l, a).
4641 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
4642 * function will compute L=R+G+B before packing. The net effect is we'll
4643 * accidentally store luminance values = 3*l.
4644 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
4646 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
4649 * Finally, we also need to do this when the actual surface format does
4650 * not match the logical surface format. For example, suppose the user
4651 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
4652 * Again, we'll get pixel values like (l,l,l,a).
4655 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
4659 switch (baseFormat
) {
4661 for (i
= 0; i
< n
; i
++) {
4662 rgba
[i
][RCOMP
] = 0.0F
;
4663 rgba
[i
][GCOMP
] = 0.0F
;
4664 rgba
[i
][BCOMP
] = 0.0F
;
4670 for (i
= 0; i
< n
; i
++) {
4671 rgba
[i
][GCOMP
] = 0.0F
;
4672 rgba
[i
][BCOMP
] = 0.0F
;
4673 rgba
[i
][ACOMP
] = 1.0F
;
4676 case GL_LUMINANCE_ALPHA
:
4677 for (i
= 0; i
< n
; i
++) {
4678 rgba
[i
][GCOMP
] = 0.0F
;
4679 rgba
[i
][BCOMP
] = 0.0F
;
4690 * As above, but GLuint components.
4693 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
4697 switch (baseFormat
) {
4699 for (i
= 0; i
< n
; i
++) {
4708 for (i
= 0; i
< n
; i
++) {
4714 case GL_LUMINANCE_ALPHA
:
4715 for (i
= 0; i
< n
; i
++) {