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
:
413 assert(0 && "bad format in get_component_indexes()");
420 * For small integer types, return the min and max possible values.
421 * Used for clamping floats to unscaled integer types.
422 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
425 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
432 case GL_UNSIGNED_BYTE
:
440 case GL_UNSIGNED_SHORT
:
449 /* Customization of integer packing. We always treat src as uint, and can pack dst
450 * as any integer type/format combo.
452 #define SRC_TYPE GLuint
454 #define DST_TYPE GLuint
455 #define SRC_CONVERT(x) (x)
456 #define FN_NAME pack_uint_from_uint_rgba
457 #include "pack_tmp.h"
462 #define DST_TYPE GLushort
463 #define SRC_CONVERT(x) MIN2(x, 0xffff)
464 #define FN_NAME pack_ushort_from_uint_rgba
465 #include "pack_tmp.h"
470 #define DST_TYPE GLshort
471 #define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767)
472 #define FN_NAME pack_short_from_uint_rgba
473 #include "pack_tmp.h"
478 #define DST_TYPE GLubyte
479 #define SRC_CONVERT(x) MIN2(x, 0xff)
480 #define FN_NAME pack_ubyte_from_uint_rgba
481 #include "pack_tmp.h"
486 #define DST_TYPE GLbyte
487 #define SRC_CONVERT(x) CLAMP((int)x, -128, 127)
488 #define FN_NAME pack_byte_from_uint_rgba
489 #include "pack_tmp.h"
495 _mesa_pack_rgba_span_int(struct gl_context
*ctx
, GLuint n
, GLuint rgba
[][4],
496 GLenum dstFormat
, GLenum dstType
,
500 case GL_UNSIGNED_INT
:
501 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
504 /* No conversion necessary. */
505 pack_uint_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
507 case GL_UNSIGNED_SHORT
:
508 pack_ushort_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
511 pack_short_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
513 case GL_UNSIGNED_BYTE
:
514 pack_ubyte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
517 pack_byte_from_uint_rgba(dstAddr
, dstFormat
, rgba
, n
);
527 * Used to pack an array [][4] of RGBA float colors as specified
528 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
529 * Historically, the RGBA values were in [0,1] and rescaled to fit
530 * into GLubytes, etc. But with new integer formats, the RGBA values
531 * may have any value and we don't always rescale when converting to
534 * Note: the rgba values will be modified by this function when any pixel
535 * transfer ops are enabled.
538 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
539 GLenum dstFormat
, GLenum dstType
,
541 const struct gl_pixelstore_attrib
*dstPacking
,
542 GLbitfield transferOps
)
545 const GLint comps
= _mesa_components_in_format(dstFormat
);
546 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
549 if (dstFormat
== GL_LUMINANCE
||
550 dstFormat
== GL_LUMINANCE_ALPHA
||
551 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
552 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
553 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
555 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
563 /* EXT_texture_integer specifies no transfer ops on integer
564 * types in the resolved issues section. Just set them to 0
565 * for integer surfaces.
571 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
575 * Component clamping (besides clamping to [0,1] in
576 * _mesa_apply_rgba_transfer_ops()).
579 /* clamping to dest type's min/max values */
581 if (get_type_min_max(dstType
, &min
, &max
)) {
582 for (i
= 0; i
< n
; i
++) {
583 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
584 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
585 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
586 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
590 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
591 /* compute luminance values */
592 if (transferOps
& IMAGE_CLAMP_BIT
) {
593 for (i
= 0; i
< n
; i
++) {
594 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
595 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
599 for (i
= 0; i
< n
; i
++) {
600 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
606 * Pack/store the pixels. Ugh! Lots of cases!!!
609 case GL_UNSIGNED_BYTE
:
611 GLubyte
*dst
= (GLubyte
*) dstAddr
;
615 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
619 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
623 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
627 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
631 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
633 case GL_LUMINANCE_ALPHA
:
635 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
636 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
641 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
642 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
647 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
648 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
649 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
654 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
655 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
656 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
657 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
662 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
663 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
664 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
669 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
670 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
671 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
672 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
677 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
678 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
679 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
680 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
683 case GL_RED_INTEGER_EXT
:
685 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
688 case GL_GREEN_INTEGER_EXT
:
690 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
693 case GL_BLUE_INTEGER_EXT
:
695 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
698 case GL_ALPHA_INTEGER_EXT
:
700 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
705 dst
[i
*2+0] = (GLubyte
) rgba
[i
][RCOMP
];
706 dst
[i
*2+1] = (GLubyte
) rgba
[i
][GCOMP
];
709 case GL_RGB_INTEGER_EXT
:
711 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
712 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
713 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
716 case GL_RGBA_INTEGER_EXT
:
718 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
719 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
720 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
721 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
724 case GL_BGR_INTEGER_EXT
:
726 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
727 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
728 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
731 case GL_BGRA_INTEGER_EXT
:
733 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
734 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
735 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
736 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
739 case GL_LUMINANCE_INTEGER_EXT
:
741 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
744 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
747 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
749 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
757 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
758 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
762 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
768 GLbyte
*dst
= (GLbyte
*) dstAddr
;
772 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
776 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
780 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
784 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
788 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
790 case GL_LUMINANCE_ALPHA
:
792 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
793 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
798 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
799 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
804 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
805 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
806 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
811 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
812 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
813 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
814 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
819 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
820 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
821 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
826 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
827 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
828 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
829 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
834 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
835 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
836 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
837 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
840 case GL_RED_INTEGER_EXT
:
842 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
845 case GL_GREEN_INTEGER_EXT
:
847 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
850 case GL_BLUE_INTEGER_EXT
:
852 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
855 case GL_ALPHA_INTEGER_EXT
:
857 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
862 dst
[i
*2+0] = (GLbyte
) rgba
[i
][RCOMP
];
863 dst
[i
*2+1] = (GLbyte
) rgba
[i
][GCOMP
];
866 case GL_RGB_INTEGER_EXT
:
868 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
869 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
870 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
873 case GL_RGBA_INTEGER_EXT
:
875 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
876 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
877 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
878 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
881 case GL_BGR_INTEGER_EXT
:
883 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
884 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
885 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
888 case GL_BGRA_INTEGER_EXT
:
890 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
891 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
892 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
893 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
896 case GL_LUMINANCE_INTEGER_EXT
:
898 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
901 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
904 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
906 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
914 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
915 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
919 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
923 case GL_UNSIGNED_SHORT
:
925 GLushort
*dst
= (GLushort
*) dstAddr
;
929 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
933 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
937 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
941 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
945 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
947 case GL_LUMINANCE_ALPHA
:
949 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
950 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
955 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
956 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
961 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
962 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
963 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
968 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
969 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
970 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
971 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
976 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
977 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
978 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
983 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
984 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
985 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
986 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
991 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
992 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
993 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
994 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
997 case GL_RED_INTEGER_EXT
:
999 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
1002 case GL_GREEN_INTEGER_EXT
:
1004 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
1007 case GL_BLUE_INTEGER_EXT
:
1009 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
1012 case GL_ALPHA_INTEGER_EXT
:
1014 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
1019 dst
[i
*2+0] = (GLushort
) rgba
[i
][RCOMP
];
1020 dst
[i
*2+1] = (GLushort
) rgba
[i
][GCOMP
];
1023 case GL_RGB_INTEGER_EXT
:
1025 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
1026 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1027 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
1030 case GL_RGBA_INTEGER_EXT
:
1032 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
1033 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1034 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
1035 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1038 case GL_BGR_INTEGER_EXT
:
1040 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
1041 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
1042 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
1045 case GL_BGRA_INTEGER_EXT
:
1047 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
1048 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
1049 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
1050 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
1053 case GL_LUMINANCE_INTEGER_EXT
:
1055 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
1058 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
1061 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1063 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1071 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1072 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1076 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1082 GLshort
*dst
= (GLshort
*) dstAddr
;
1083 switch (dstFormat
) {
1086 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1090 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1094 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1098 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1102 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1104 case GL_LUMINANCE_ALPHA
:
1106 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1107 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1112 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1113 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1118 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1119 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1120 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1125 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1126 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1127 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1128 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1133 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1134 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1135 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1140 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1141 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1142 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1143 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1148 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1149 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1150 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1151 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1154 case GL_RED_INTEGER_EXT
:
1156 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1159 case GL_GREEN_INTEGER_EXT
:
1161 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1164 case GL_BLUE_INTEGER_EXT
:
1166 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1169 case GL_ALPHA_INTEGER_EXT
:
1171 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1176 dst
[i
*2+0] = (GLshort
) rgba
[i
][RCOMP
];
1177 dst
[i
*2+1] = (GLshort
) rgba
[i
][GCOMP
];
1180 case GL_RGB_INTEGER_EXT
:
1182 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1183 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1184 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1187 case GL_RGBA_INTEGER_EXT
:
1189 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1190 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1191 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1192 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1195 case GL_BGR_INTEGER_EXT
:
1197 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1198 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1199 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1202 case GL_BGRA_INTEGER_EXT
:
1204 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1205 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1206 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1207 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1210 case GL_LUMINANCE_INTEGER_EXT
:
1212 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1215 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1218 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1220 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1228 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1229 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1233 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1237 case GL_UNSIGNED_INT
:
1239 GLuint
*dst
= (GLuint
*) dstAddr
;
1240 switch (dstFormat
) {
1243 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1247 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1251 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1255 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1259 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1261 case GL_LUMINANCE_ALPHA
:
1263 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1264 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1269 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1270 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1275 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1276 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1277 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1282 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1283 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1284 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1285 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1290 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1291 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1292 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1297 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1298 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1299 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1300 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1305 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1306 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1307 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1308 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1311 case GL_RED_INTEGER_EXT
:
1313 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1316 case GL_GREEN_INTEGER_EXT
:
1318 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1321 case GL_BLUE_INTEGER_EXT
:
1323 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1326 case GL_ALPHA_INTEGER_EXT
:
1328 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1333 dst
[i
*2+0] = (GLuint
) rgba
[i
][RCOMP
];
1334 dst
[i
*2+1] = (GLuint
) rgba
[i
][GCOMP
];
1337 case GL_RGB_INTEGER_EXT
:
1339 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1340 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1341 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1344 case GL_RGBA_INTEGER_EXT
:
1346 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1347 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1348 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1349 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1352 case GL_BGR_INTEGER_EXT
:
1354 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1355 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1356 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1359 case GL_BGRA_INTEGER_EXT
:
1361 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1362 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1363 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1364 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1367 case GL_LUMINANCE_INTEGER_EXT
:
1369 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1372 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1375 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1377 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1385 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1386 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1390 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1396 GLint
*dst
= (GLint
*) dstAddr
;
1397 switch (dstFormat
) {
1400 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1404 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1408 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1412 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1416 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1418 case GL_LUMINANCE_ALPHA
:
1420 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1421 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1426 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1427 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1432 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1433 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1434 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1439 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1440 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1441 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1442 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1447 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1448 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1449 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1454 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1455 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1456 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1457 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1462 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1463 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1464 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1465 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1471 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1472 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1475 case GL_RED_INTEGER_EXT
:
1477 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1480 case GL_GREEN_INTEGER_EXT
:
1482 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1485 case GL_BLUE_INTEGER_EXT
:
1487 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1490 case GL_ALPHA_INTEGER_EXT
:
1492 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1497 dst
[i
*2+0] = (GLint
) rgba
[i
][RCOMP
];
1498 dst
[i
*2+1] = (GLint
) rgba
[i
][GCOMP
];
1501 case GL_RGB_INTEGER_EXT
:
1503 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1504 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1505 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1508 case GL_RGBA_INTEGER_EXT
:
1510 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1511 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1512 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1513 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1516 case GL_BGR_INTEGER_EXT
:
1518 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1519 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1520 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1523 case GL_BGRA_INTEGER_EXT
:
1525 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1526 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1527 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1528 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1531 case GL_LUMINANCE_INTEGER_EXT
:
1533 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1536 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1539 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1541 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1547 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1553 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1554 switch (dstFormat
) {
1557 dst
[i
] = rgba
[i
][RCOMP
];
1561 dst
[i
] = rgba
[i
][GCOMP
];
1565 dst
[i
] = rgba
[i
][BCOMP
];
1569 dst
[i
] = rgba
[i
][ACOMP
];
1573 dst
[i
] = luminance
[i
];
1575 case GL_LUMINANCE_ALPHA
:
1577 dst
[i
*2+0] = luminance
[i
];
1578 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1583 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1584 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1589 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1590 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1591 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1596 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1597 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1598 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1599 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1604 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1605 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1606 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1611 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1612 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1613 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1614 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1619 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1620 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1621 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1622 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1628 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1629 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1633 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1637 case GL_HALF_FLOAT_ARB
:
1639 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1640 switch (dstFormat
) {
1643 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1647 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1651 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1655 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1659 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1661 case GL_LUMINANCE_ALPHA
:
1663 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1664 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1669 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1670 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1675 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1676 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1677 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1682 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1683 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1684 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1685 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1690 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1691 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1692 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1697 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1698 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1699 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1700 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1705 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1706 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1707 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1708 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1714 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1715 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1719 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1723 case GL_UNSIGNED_BYTE_3_3_2
:
1724 if (dstFormat
== GL_RGB
) {
1725 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1727 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1728 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1729 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1733 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1734 if (dstFormat
== GL_RGB
) {
1735 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1737 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1738 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1739 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1743 case GL_UNSIGNED_SHORT_5_6_5
:
1744 if (dstFormat
== GL_RGB
) {
1745 GLushort
*dst
= (GLushort
*) dstAddr
;
1747 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1748 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1749 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1753 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1754 if (dstFormat
== GL_RGB
) {
1755 GLushort
*dst
= (GLushort
*) dstAddr
;
1757 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1758 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1759 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1763 case GL_UNSIGNED_SHORT_4_4_4_4
:
1764 if (dstFormat
== GL_RGBA
) {
1765 GLushort
*dst
= (GLushort
*) dstAddr
;
1767 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1768 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1769 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1770 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1773 else if (dstFormat
== GL_BGRA
) {
1774 GLushort
*dst
= (GLushort
*) dstAddr
;
1776 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1777 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1778 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1779 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1782 else if (dstFormat
== GL_ABGR_EXT
) {
1783 GLushort
*dst
= (GLushort
*) dstAddr
;
1785 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1786 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1787 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1788 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1792 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1793 if (dstFormat
== GL_RGBA
) {
1794 GLushort
*dst
= (GLushort
*) dstAddr
;
1796 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1797 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1798 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1799 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1802 else if (dstFormat
== GL_BGRA
) {
1803 GLushort
*dst
= (GLushort
*) dstAddr
;
1805 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1806 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1807 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1808 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1811 else if (dstFormat
== GL_ABGR_EXT
) {
1812 GLushort
*dst
= (GLushort
*) dstAddr
;
1814 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1815 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1816 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1817 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1821 case GL_UNSIGNED_SHORT_5_5_5_1
:
1822 if (dstFormat
== GL_RGBA
) {
1823 GLushort
*dst
= (GLushort
*) dstAddr
;
1825 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1826 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1827 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1828 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1831 else if (dstFormat
== GL_BGRA
) {
1832 GLushort
*dst
= (GLushort
*) dstAddr
;
1834 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1835 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1836 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1837 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1840 else if (dstFormat
== GL_ABGR_EXT
) {
1841 GLushort
*dst
= (GLushort
*) dstAddr
;
1843 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1844 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1845 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1846 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1850 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1851 if (dstFormat
== GL_RGBA
) {
1852 GLushort
*dst
= (GLushort
*) dstAddr
;
1854 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1855 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1856 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1857 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1860 else if (dstFormat
== GL_BGRA
) {
1861 GLushort
*dst
= (GLushort
*) dstAddr
;
1863 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1864 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1865 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1866 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1869 else if (dstFormat
== GL_ABGR_EXT
) {
1870 GLushort
*dst
= (GLushort
*) dstAddr
;
1872 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1873 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1874 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1875 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1879 case GL_UNSIGNED_INT_8_8_8_8
:
1880 if (dstFormat
== GL_RGBA
) {
1881 GLuint
*dst
= (GLuint
*) dstAddr
;
1883 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1884 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1885 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1886 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1889 else if (dstFormat
== GL_BGRA
) {
1890 GLuint
*dst
= (GLuint
*) dstAddr
;
1892 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1893 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1894 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1895 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1898 else if (dstFormat
== GL_ABGR_EXT
) {
1899 GLuint
*dst
= (GLuint
*) dstAddr
;
1901 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1902 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1903 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1904 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1908 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1909 if (dstFormat
== GL_RGBA
) {
1910 GLuint
*dst
= (GLuint
*) dstAddr
;
1912 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1913 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1914 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1915 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1918 else if (dstFormat
== GL_BGRA
) {
1919 GLuint
*dst
= (GLuint
*) dstAddr
;
1921 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1922 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1923 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1924 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1927 else if (dstFormat
== GL_ABGR_EXT
) {
1928 GLuint
*dst
= (GLuint
*) dstAddr
;
1930 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1931 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1932 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1933 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1937 case GL_UNSIGNED_INT_10_10_10_2
:
1938 if (dstFormat
== GL_RGBA
) {
1939 GLuint
*dst
= (GLuint
*) dstAddr
;
1941 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1942 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1943 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1944 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1947 else if (dstFormat
== GL_BGRA
) {
1948 GLuint
*dst
= (GLuint
*) dstAddr
;
1950 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1951 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1952 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1953 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1956 else if (dstFormat
== GL_ABGR_EXT
) {
1957 GLuint
*dst
= (GLuint
*) dstAddr
;
1959 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1960 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1961 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1962 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1966 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1967 if (dstFormat
== GL_RGBA
) {
1968 GLuint
*dst
= (GLuint
*) dstAddr
;
1970 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1971 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1972 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1973 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1976 else if (dstFormat
== GL_BGRA
) {
1977 GLuint
*dst
= (GLuint
*) dstAddr
;
1979 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1980 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1981 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1982 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1985 else if (dstFormat
== GL_ABGR_EXT
) {
1986 GLuint
*dst
= (GLuint
*) dstAddr
;
1988 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1989 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1990 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1991 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1996 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
2001 if (dstPacking
->SwapBytes
) {
2002 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
2003 if (swapSize
== 2) {
2004 if (dstPacking
->SwapBytes
) {
2005 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
2008 else if (swapSize
== 4) {
2009 if (dstPacking
->SwapBytes
) {
2010 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
2020 #define SWAP2BYTE(VALUE) \
2022 GLubyte *bytes = (GLubyte *) &(VALUE); \
2023 GLubyte tmp = bytes[0]; \
2024 bytes[0] = bytes[1]; \
2028 #define SWAP4BYTE(VALUE) \
2030 GLubyte *bytes = (GLubyte *) &(VALUE); \
2031 GLubyte tmp = bytes[0]; \
2032 bytes[0] = bytes[3]; \
2035 bytes[1] = bytes[2]; \
2041 extract_uint_indexes(GLuint n
, GLuint indexes
[],
2042 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2043 const struct gl_pixelstore_attrib
*unpack
)
2045 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
2047 ASSERT(srcType
== GL_BITMAP
||
2048 srcType
== GL_UNSIGNED_BYTE
||
2049 srcType
== GL_BYTE
||
2050 srcType
== GL_UNSIGNED_SHORT
||
2051 srcType
== GL_SHORT
||
2052 srcType
== GL_UNSIGNED_INT
||
2053 srcType
== GL_INT
||
2054 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
2055 srcType
== GL_HALF_FLOAT_ARB
||
2056 srcType
== GL_FLOAT
||
2057 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
2062 GLubyte
*ubsrc
= (GLubyte
*) src
;
2063 if (unpack
->LsbFirst
) {
2064 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
2066 for (i
= 0; i
< n
; i
++) {
2067 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2078 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
2080 for (i
= 0; i
< n
; i
++) {
2081 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2093 case GL_UNSIGNED_BYTE
:
2096 const GLubyte
*s
= (const GLubyte
*) src
;
2097 for (i
= 0; i
< n
; i
++)
2104 const GLbyte
*s
= (const GLbyte
*) src
;
2105 for (i
= 0; i
< n
; i
++)
2109 case GL_UNSIGNED_SHORT
:
2112 const GLushort
*s
= (const GLushort
*) src
;
2113 if (unpack
->SwapBytes
) {
2114 for (i
= 0; i
< n
; i
++) {
2115 GLushort value
= s
[i
];
2121 for (i
= 0; i
< n
; i
++)
2129 const GLshort
*s
= (const GLshort
*) src
;
2130 if (unpack
->SwapBytes
) {
2131 for (i
= 0; i
< n
; i
++) {
2132 GLshort value
= s
[i
];
2138 for (i
= 0; i
< n
; i
++)
2143 case GL_UNSIGNED_INT
:
2146 const GLuint
*s
= (const GLuint
*) src
;
2147 if (unpack
->SwapBytes
) {
2148 for (i
= 0; i
< n
; i
++) {
2149 GLuint value
= s
[i
];
2155 for (i
= 0; i
< n
; i
++)
2163 const GLint
*s
= (const GLint
*) src
;
2164 if (unpack
->SwapBytes
) {
2165 for (i
= 0; i
< n
; i
++) {
2172 for (i
= 0; i
< n
; i
++)
2180 const GLfloat
*s
= (const GLfloat
*) src
;
2181 if (unpack
->SwapBytes
) {
2182 for (i
= 0; i
< n
; i
++) {
2183 GLfloat value
= s
[i
];
2185 indexes
[i
] = (GLuint
) value
;
2189 for (i
= 0; i
< n
; i
++)
2190 indexes
[i
] = (GLuint
) s
[i
];
2194 case GL_HALF_FLOAT_ARB
:
2197 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2198 if (unpack
->SwapBytes
) {
2199 for (i
= 0; i
< n
; i
++) {
2200 GLhalfARB value
= s
[i
];
2202 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2206 for (i
= 0; i
< n
; i
++)
2207 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2211 case GL_UNSIGNED_INT_24_8_EXT
:
2214 const GLuint
*s
= (const GLuint
*) src
;
2215 if (unpack
->SwapBytes
) {
2216 for (i
= 0; i
< n
; i
++) {
2217 GLuint value
= s
[i
];
2219 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2223 for (i
= 0; i
< n
; i
++)
2224 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2228 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
2231 const GLuint
*s
= (const GLuint
*) src
;
2232 if (unpack
->SwapBytes
) {
2233 for (i
= 0; i
< n
; i
++) {
2234 GLuint value
= s
[i
*2+1];
2236 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2240 for (i
= 0; i
< n
; i
++)
2241 indexes
[i
] = s
[i
*2+1] & 0xff; /* lower 8 bits */
2247 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2254 * Return source/dest RGBA indexes for unpacking pixels.
2257 get_component_mapping(GLenum format
,
2269 case GL_RED_INTEGER_EXT
:
2271 *gSrc
= *bSrc
= *aSrc
= -1;
2274 case GL_GREEN_INTEGER_EXT
:
2276 *rSrc
= *bSrc
= *aSrc
= -1;
2279 case GL_BLUE_INTEGER_EXT
:
2281 *rSrc
= *gSrc
= *aSrc
= -1;
2284 case GL_ALPHA_INTEGER_EXT
:
2285 *rSrc
= *gSrc
= *bSrc
= -1;
2289 case GL_LUMINANCE_INTEGER_EXT
:
2290 *rSrc
= *gSrc
= *bSrc
= 0;
2293 case GL_LUMINANCE_ALPHA
:
2294 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2295 *rSrc
= *gSrc
= *bSrc
= 0;
2299 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2313 case GL_RGB_INTEGER
:
2324 case GL_BGR_INTEGER
:
2335 case GL_RGBA_INTEGER
:
2346 case GL_BGRA_INTEGER
:
2374 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2375 _mesa_lookup_enum_by_nr(format
));
2383 * This function extracts floating point RGBA values from arbitrary
2384 * image data. srcFormat and srcType are the format and type parameters
2385 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2387 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2388 * implements the "Conversion to floating point", "Conversion to RGB",
2389 * and "Final Expansion to RGBA" operations.
2391 * Args: n - number of pixels
2392 * rgba - output colors
2393 * srcFormat - format of incoming data
2394 * srcType - data type of incoming data
2395 * src - source data pointer
2396 * swapBytes - perform byteswapping of incoming data?
2399 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2400 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2401 GLboolean swapBytes
)
2403 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2405 GLint rDst
, bDst
, gDst
, aDst
;
2406 GLboolean intFormat
;
2407 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2409 ASSERT(srcFormat
== GL_RED
||
2410 srcFormat
== GL_GREEN
||
2411 srcFormat
== GL_BLUE
||
2412 srcFormat
== GL_ALPHA
||
2413 srcFormat
== GL_LUMINANCE
||
2414 srcFormat
== GL_LUMINANCE_ALPHA
||
2415 srcFormat
== GL_INTENSITY
||
2416 srcFormat
== GL_RG
||
2417 srcFormat
== GL_RGB
||
2418 srcFormat
== GL_BGR
||
2419 srcFormat
== GL_RGBA
||
2420 srcFormat
== GL_BGRA
||
2421 srcFormat
== GL_ABGR_EXT
||
2422 srcFormat
== GL_DU8DV8_ATI
||
2423 srcFormat
== GL_DUDV_ATI
||
2424 srcFormat
== GL_RED_INTEGER_EXT
||
2425 srcFormat
== GL_GREEN_INTEGER_EXT
||
2426 srcFormat
== GL_BLUE_INTEGER_EXT
||
2427 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2428 srcFormat
== GL_RG_INTEGER
||
2429 srcFormat
== GL_RGB_INTEGER_EXT
||
2430 srcFormat
== GL_RGBA_INTEGER_EXT
||
2431 srcFormat
== GL_BGR_INTEGER_EXT
||
2432 srcFormat
== GL_BGRA_INTEGER_EXT
||
2433 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2434 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2436 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2437 srcType
== GL_BYTE
||
2438 srcType
== GL_UNSIGNED_SHORT
||
2439 srcType
== GL_SHORT
||
2440 srcType
== GL_UNSIGNED_INT
||
2441 srcType
== GL_INT
||
2442 srcType
== GL_HALF_FLOAT_ARB
||
2443 srcType
== GL_FLOAT
||
2444 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2445 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2446 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2447 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2448 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2449 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2450 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2451 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2452 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2453 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2454 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2455 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
2456 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
2457 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
2459 get_component_mapping(srcFormat
,
2460 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2461 &rDst
, &gDst
, &bDst
, &aDst
);
2463 stride
= _mesa_components_in_format(srcFormat
);
2465 intFormat
= _mesa_is_integer_format(srcFormat
);
2467 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2468 if ((SRC_INDEX) < 0) { \
2471 for (i = 0; i < n; i++) { \
2472 rgba[i][DST_INDEX] = DEFAULT_INT; \
2476 for (i = 0; i < n; i++) { \
2477 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2481 else if (swapBytes) { \
2482 const TYPE *s = (const TYPE *) src; \
2484 for (i = 0; i < n; i++) { \
2485 TYPE value = s[SRC_INDEX]; \
2486 if (sizeof(TYPE) == 2) { \
2489 else if (sizeof(TYPE) == 4) { \
2493 rgba[i][DST_INDEX] = (GLfloat) value; \
2495 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2500 const TYPE *s = (const TYPE *) src; \
2503 for (i = 0; i < n; i++) { \
2504 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2509 for (i = 0; i < n; i++) { \
2510 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2517 case GL_UNSIGNED_BYTE
:
2518 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2519 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2520 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2521 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2524 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2525 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2526 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOATZ
);
2527 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOATZ
);
2529 case GL_UNSIGNED_SHORT
:
2530 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2531 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2532 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2533 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2536 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2537 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2538 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOATZ
);
2539 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOATZ
);
2541 case GL_UNSIGNED_INT
:
2542 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2543 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2544 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2545 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2548 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2549 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2550 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2551 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2554 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2555 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2556 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2557 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2559 case GL_HALF_FLOAT_ARB
:
2560 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2561 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2562 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2563 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2565 case GL_UNSIGNED_BYTE_3_3_2
:
2567 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2574 for (i
= 0; i
< n
; i
++) {
2575 GLubyte p
= ubsrc
[i
];
2576 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2577 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2578 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2579 rgba
[i
][aDst
] = 1.0F
;
2583 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2585 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2592 for (i
= 0; i
< n
; i
++) {
2593 GLubyte p
= ubsrc
[i
];
2594 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2595 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2596 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2597 rgba
[i
][aDst
] = 1.0F
;
2601 case GL_UNSIGNED_SHORT_5_6_5
:
2608 const GLushort
*ussrc
= (const GLushort
*) src
;
2610 for (i
= 0; i
< n
; i
++) {
2611 GLushort p
= ussrc
[i
];
2613 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2614 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2615 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2616 rgba
[i
][aDst
] = 1.0F
;
2620 const GLushort
*ussrc
= (const GLushort
*) src
;
2622 for (i
= 0; i
< n
; i
++) {
2623 GLushort p
= ussrc
[i
];
2624 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2625 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2626 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2627 rgba
[i
][aDst
] = 1.0F
;
2631 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2638 const GLushort
*ussrc
= (const GLushort
*) src
;
2640 for (i
= 0; i
< n
; i
++) {
2641 GLushort p
= ussrc
[i
];
2643 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2644 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2645 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2646 rgba
[i
][aDst
] = 1.0F
;
2650 const GLushort
*ussrc
= (const GLushort
*) src
;
2652 for (i
= 0; i
< n
; i
++) {
2653 GLushort p
= ussrc
[i
];
2654 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2655 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2656 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2657 rgba
[i
][aDst
] = 1.0F
;
2661 case GL_UNSIGNED_SHORT_4_4_4_4
:
2663 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2666 const GLushort
*ussrc
= (const GLushort
*) src
;
2668 for (i
= 0; i
< n
; i
++) {
2669 GLushort p
= ussrc
[i
];
2671 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2672 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2673 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2674 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2678 const GLushort
*ussrc
= (const GLushort
*) src
;
2680 for (i
= 0; i
< n
; i
++) {
2681 GLushort p
= ussrc
[i
];
2682 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2683 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2684 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2685 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2689 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2691 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2694 const GLushort
*ussrc
= (const GLushort
*) src
;
2696 for (i
= 0; i
< n
; i
++) {
2697 GLushort p
= ussrc
[i
];
2699 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2700 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2701 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2702 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2706 const GLushort
*ussrc
= (const GLushort
*) src
;
2708 for (i
= 0; i
< n
; i
++) {
2709 GLushort p
= ussrc
[i
];
2710 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2711 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2712 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2713 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2717 case GL_UNSIGNED_SHORT_5_5_5_1
:
2719 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2722 const GLushort
*ussrc
= (const GLushort
*) src
;
2724 for (i
= 0; i
< n
; i
++) {
2725 GLushort p
= ussrc
[i
];
2727 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2728 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2729 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2730 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2734 const GLushort
*ussrc
= (const GLushort
*) src
;
2736 for (i
= 0; i
< n
; i
++) {
2737 GLushort p
= ussrc
[i
];
2738 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2739 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2740 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2741 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2745 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2747 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2750 const GLushort
*ussrc
= (const GLushort
*) src
;
2752 for (i
= 0; i
< n
; i
++) {
2753 GLushort p
= ussrc
[i
];
2755 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2756 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2757 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2758 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2762 const GLushort
*ussrc
= (const GLushort
*) src
;
2764 for (i
= 0; i
< n
; i
++) {
2765 GLushort p
= ussrc
[i
];
2766 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2767 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2768 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2769 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2773 case GL_UNSIGNED_INT_8_8_8_8
:
2775 const GLuint
*uisrc
= (const GLuint
*) src
;
2778 for (i
= 0; i
< n
; i
++) {
2779 GLuint p
= uisrc
[i
];
2780 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2781 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2782 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2783 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2787 for (i
= 0; i
< n
; i
++) {
2788 GLuint p
= uisrc
[i
];
2789 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2790 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2791 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2792 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2797 const GLuint
*uisrc
= (const GLuint
*) src
;
2800 for (i
= 0; i
< n
; i
++) {
2801 GLuint p
= uisrc
[i
];
2802 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2803 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2804 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2805 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2809 for (i
= 0; i
< n
; i
++) {
2810 GLuint p
= uisrc
[i
];
2811 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2812 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2813 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2814 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2819 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2821 const GLuint
*uisrc
= (const GLuint
*) src
;
2824 for (i
= 0; i
< n
; i
++) {
2825 GLuint p
= uisrc
[i
];
2826 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2827 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2828 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2829 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2833 for (i
= 0; i
< n
; i
++) {
2834 GLuint p
= uisrc
[i
];
2835 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2836 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2837 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2838 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2843 const GLuint
*uisrc
= (const GLuint
*) src
;
2846 for (i
= 0; i
< n
; i
++) {
2847 GLuint p
= uisrc
[i
];
2848 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2849 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2850 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2851 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2855 for (i
= 0; i
< n
; i
++) {
2856 GLuint p
= uisrc
[i
];
2857 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2858 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2859 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2860 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2865 case GL_UNSIGNED_INT_10_10_10_2
:
2867 rs
= 1.0F
/ 1023.0F
;
2868 gs
= 1.0F
/ 1023.0F
;
2869 bs
= 1.0F
/ 1023.0F
;
2873 const GLuint
*uisrc
= (const GLuint
*) src
;
2875 for (i
= 0; i
< n
; i
++) {
2876 GLuint p
= uisrc
[i
];
2878 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2879 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2880 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2881 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2885 const GLuint
*uisrc
= (const GLuint
*) src
;
2887 for (i
= 0; i
< n
; i
++) {
2888 GLuint p
= uisrc
[i
];
2889 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2890 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2891 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2892 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2896 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2898 rs
= 1.0F
/ 1023.0F
;
2899 gs
= 1.0F
/ 1023.0F
;
2900 bs
= 1.0F
/ 1023.0F
;
2904 const GLuint
*uisrc
= (const GLuint
*) src
;
2906 for (i
= 0; i
< n
; i
++) {
2907 GLuint p
= uisrc
[i
];
2909 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2910 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2911 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2912 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2916 const GLuint
*uisrc
= (const GLuint
*) src
;
2918 for (i
= 0; i
< n
; i
++) {
2919 GLuint p
= uisrc
[i
];
2920 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2921 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2922 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2923 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2928 _mesa_problem(NULL
, "bad srcType in extract float data");
2935 static inline GLuint
2936 clamp_float_to_uint(GLfloat f
)
2938 return f
< 0.0F
? 0 : IROUND(f
);
2942 static inline GLuint
2943 clamp_half_to_uint(GLhalfARB h
)
2945 GLfloat f
= _mesa_half_to_float(h
);
2946 return f
< 0.0F
? 0 : IROUND(f
);
2951 * \sa extract_float_rgba()
2954 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2955 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2956 GLboolean swapBytes
)
2958 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2960 GLint rDst
, bDst
, gDst
, aDst
;
2962 ASSERT(srcFormat
== GL_RED
||
2963 srcFormat
== GL_GREEN
||
2964 srcFormat
== GL_BLUE
||
2965 srcFormat
== GL_ALPHA
||
2966 srcFormat
== GL_LUMINANCE
||
2967 srcFormat
== GL_LUMINANCE_ALPHA
||
2968 srcFormat
== GL_INTENSITY
||
2969 srcFormat
== GL_RG
||
2970 srcFormat
== GL_RGB
||
2971 srcFormat
== GL_BGR
||
2972 srcFormat
== GL_RGBA
||
2973 srcFormat
== GL_BGRA
||
2974 srcFormat
== GL_ABGR_EXT
||
2975 srcFormat
== GL_DU8DV8_ATI
||
2976 srcFormat
== GL_DUDV_ATI
||
2977 srcFormat
== GL_RED_INTEGER_EXT
||
2978 srcFormat
== GL_RG_INTEGER
||
2979 srcFormat
== GL_GREEN_INTEGER_EXT
||
2980 srcFormat
== GL_BLUE_INTEGER_EXT
||
2981 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2982 srcFormat
== GL_RGB_INTEGER_EXT
||
2983 srcFormat
== GL_RGBA_INTEGER_EXT
||
2984 srcFormat
== GL_BGR_INTEGER_EXT
||
2985 srcFormat
== GL_BGRA_INTEGER_EXT
||
2986 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2987 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2989 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2990 srcType
== GL_BYTE
||
2991 srcType
== GL_UNSIGNED_SHORT
||
2992 srcType
== GL_SHORT
||
2993 srcType
== GL_UNSIGNED_INT
||
2994 srcType
== GL_INT
||
2995 srcType
== GL_HALF_FLOAT_ARB
||
2996 srcType
== GL_FLOAT
||
2997 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2998 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2999 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3000 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3001 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3002 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3003 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3004 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3005 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3006 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3007 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3008 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3009 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3010 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3012 get_component_mapping(srcFormat
,
3013 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
3014 &rDst
, &gDst
, &bDst
, &aDst
);
3016 stride
= _mesa_components_in_format(srcFormat
);
3018 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
3019 if ((SRC_INDEX) < 0) { \
3021 for (i = 0; i < n; i++) { \
3022 rgba[i][DST_INDEX] = DEFAULT; \
3025 else if (swapBytes) { \
3026 const TYPE *s = (const TYPE *) src; \
3028 for (i = 0; i < n; i++) { \
3029 TYPE value = s[SRC_INDEX]; \
3030 if (sizeof(TYPE) == 2) { \
3033 else if (sizeof(TYPE) == 4) { \
3036 rgba[i][DST_INDEX] = CONVERSION(value); \
3041 const TYPE *s = (const TYPE *) src; \
3043 for (i = 0; i < n; i++) { \
3044 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
3050 case GL_UNSIGNED_BYTE
:
3051 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
3052 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
3053 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
3054 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
3057 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, (GLuint
));
3058 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, (GLuint
));
3059 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, (GLuint
));
3060 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, (GLuint
));
3062 case GL_UNSIGNED_SHORT
:
3063 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
3064 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
3065 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
3066 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
3069 PROCESS(rSrc
, RCOMP
, 0, GLshort
, (GLuint
));
3070 PROCESS(gSrc
, GCOMP
, 0, GLshort
, (GLuint
));
3071 PROCESS(bSrc
, BCOMP
, 0, GLshort
, (GLuint
));
3072 PROCESS(aSrc
, ACOMP
, 1, GLshort
, (GLuint
));
3074 case GL_UNSIGNED_INT
:
3075 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
3076 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
3077 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
3078 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
3081 PROCESS(rSrc
, RCOMP
, 0, GLint
, (GLuint
));
3082 PROCESS(gSrc
, GCOMP
, 0, GLint
, (GLuint
));
3083 PROCESS(bSrc
, BCOMP
, 0, GLint
, (GLuint
));
3084 PROCESS(aSrc
, ACOMP
, 1, GLint
, (GLuint
));
3087 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3088 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3089 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
3090 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3092 case GL_HALF_FLOAT_ARB
:
3093 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3094 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3095 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3096 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3098 case GL_UNSIGNED_BYTE_3_3_2
:
3100 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3102 for (i
= 0; i
< n
; i
++) {
3103 GLubyte p
= ubsrc
[i
];
3104 rgba
[i
][rDst
] = ((p
>> 5) );
3105 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3106 rgba
[i
][bDst
] = ((p
) & 0x3);
3111 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3113 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3115 for (i
= 0; i
< n
; i
++) {
3116 GLubyte p
= ubsrc
[i
];
3117 rgba
[i
][rDst
] = ((p
) & 0x7);
3118 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3119 rgba
[i
][bDst
] = ((p
>> 6) );
3124 case GL_UNSIGNED_SHORT_5_6_5
:
3126 const GLushort
*ussrc
= (const GLushort
*) src
;
3128 for (i
= 0; i
< n
; i
++) {
3129 GLushort p
= ussrc
[i
];
3131 rgba
[i
][rDst
] = ((p
>> 11) );
3132 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3133 rgba
[i
][bDst
] = ((p
) & 0x1f);
3138 const GLushort
*ussrc
= (const GLushort
*) src
;
3140 for (i
= 0; i
< n
; i
++) {
3141 GLushort p
= ussrc
[i
];
3142 rgba
[i
][rDst
] = ((p
>> 11) );
3143 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3144 rgba
[i
][bDst
] = ((p
) & 0x1f);
3149 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3151 const GLushort
*ussrc
= (const GLushort
*) src
;
3153 for (i
= 0; i
< n
; i
++) {
3154 GLushort p
= ussrc
[i
];
3156 rgba
[i
][rDst
] = ((p
) & 0x1f);
3157 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3158 rgba
[i
][bDst
] = ((p
>> 11) );
3163 const GLushort
*ussrc
= (const GLushort
*) src
;
3165 for (i
= 0; i
< n
; i
++) {
3166 GLushort p
= ussrc
[i
];
3167 rgba
[i
][rDst
] = ((p
) & 0x1f);
3168 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3169 rgba
[i
][bDst
] = ((p
>> 11) );
3174 case GL_UNSIGNED_SHORT_4_4_4_4
:
3176 const GLushort
*ussrc
= (const GLushort
*) src
;
3178 for (i
= 0; i
< n
; i
++) {
3179 GLushort p
= ussrc
[i
];
3181 rgba
[i
][rDst
] = ((p
>> 12) );
3182 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3183 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3184 rgba
[i
][aDst
] = ((p
) & 0xf);
3188 const GLushort
*ussrc
= (const GLushort
*) src
;
3190 for (i
= 0; i
< n
; i
++) {
3191 GLushort p
= ussrc
[i
];
3192 rgba
[i
][rDst
] = ((p
>> 12) );
3193 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3194 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3195 rgba
[i
][aDst
] = ((p
) & 0xf);
3199 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3201 const GLushort
*ussrc
= (const GLushort
*) src
;
3203 for (i
= 0; i
< n
; i
++) {
3204 GLushort p
= ussrc
[i
];
3206 rgba
[i
][rDst
] = ((p
) & 0xf);
3207 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3208 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3209 rgba
[i
][aDst
] = ((p
>> 12) );
3213 const GLushort
*ussrc
= (const GLushort
*) src
;
3215 for (i
= 0; i
< n
; i
++) {
3216 GLushort p
= ussrc
[i
];
3217 rgba
[i
][rDst
] = ((p
) & 0xf);
3218 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3219 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3220 rgba
[i
][aDst
] = ((p
>> 12) );
3224 case GL_UNSIGNED_SHORT_5_5_5_1
:
3226 const GLushort
*ussrc
= (const GLushort
*) src
;
3228 for (i
= 0; i
< n
; i
++) {
3229 GLushort p
= ussrc
[i
];
3231 rgba
[i
][rDst
] = ((p
>> 11) );
3232 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3233 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3234 rgba
[i
][aDst
] = ((p
) & 0x1 );
3238 const GLushort
*ussrc
= (const GLushort
*) src
;
3240 for (i
= 0; i
< n
; i
++) {
3241 GLushort p
= ussrc
[i
];
3242 rgba
[i
][rDst
] = ((p
>> 11) );
3243 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3244 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3245 rgba
[i
][aDst
] = ((p
) & 0x1 );
3249 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3251 const GLushort
*ussrc
= (const GLushort
*) src
;
3253 for (i
= 0; i
< n
; i
++) {
3254 GLushort p
= ussrc
[i
];
3256 rgba
[i
][rDst
] = ((p
) & 0x1f);
3257 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3258 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3259 rgba
[i
][aDst
] = ((p
>> 15) );
3263 const GLushort
*ussrc
= (const GLushort
*) src
;
3265 for (i
= 0; i
< n
; i
++) {
3266 GLushort p
= ussrc
[i
];
3267 rgba
[i
][rDst
] = ((p
) & 0x1f);
3268 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3269 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3270 rgba
[i
][aDst
] = ((p
>> 15) );
3274 case GL_UNSIGNED_INT_8_8_8_8
:
3276 const GLuint
*uisrc
= (const GLuint
*) src
;
3278 for (i
= 0; i
< n
; i
++) {
3279 GLuint p
= uisrc
[i
];
3280 rgba
[i
][rDst
] = ((p
) & 0xff);
3281 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3282 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3283 rgba
[i
][aDst
] = ((p
>> 24) );
3287 const GLuint
*uisrc
= (const GLuint
*) src
;
3289 for (i
= 0; i
< n
; i
++) {
3290 GLuint p
= uisrc
[i
];
3291 rgba
[i
][rDst
] = ((p
>> 24) );
3292 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3293 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3294 rgba
[i
][aDst
] = ((p
) & 0xff);
3298 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3300 const GLuint
*uisrc
= (const GLuint
*) src
;
3302 for (i
= 0; i
< n
; i
++) {
3303 GLuint p
= uisrc
[i
];
3304 rgba
[i
][rDst
] = ((p
>> 24) );
3305 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3306 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3307 rgba
[i
][aDst
] = ((p
) & 0xff);
3311 const GLuint
*uisrc
= (const GLuint
*) src
;
3313 for (i
= 0; i
< n
; i
++) {
3314 GLuint p
= uisrc
[i
];
3315 rgba
[i
][rDst
] = ((p
) & 0xff);
3316 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3317 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3318 rgba
[i
][aDst
] = ((p
>> 24) );
3322 case GL_UNSIGNED_INT_10_10_10_2
:
3324 const GLuint
*uisrc
= (const GLuint
*) src
;
3326 for (i
= 0; i
< n
; i
++) {
3327 GLuint p
= uisrc
[i
];
3329 rgba
[i
][rDst
] = ((p
>> 22) );
3330 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3331 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3332 rgba
[i
][aDst
] = ((p
) & 0x3 );
3336 const GLuint
*uisrc
= (const GLuint
*) src
;
3338 for (i
= 0; i
< n
; i
++) {
3339 GLuint p
= uisrc
[i
];
3340 rgba
[i
][rDst
] = ((p
>> 22) );
3341 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3342 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3343 rgba
[i
][aDst
] = ((p
) & 0x3 );
3347 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3349 const GLuint
*uisrc
= (const GLuint
*) src
;
3351 for (i
= 0; i
< n
; i
++) {
3352 GLuint p
= uisrc
[i
];
3354 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3355 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3356 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3357 rgba
[i
][aDst
] = ((p
>> 30) );
3361 const GLuint
*uisrc
= (const GLuint
*) src
;
3363 for (i
= 0; i
< n
; i
++) {
3364 GLuint p
= uisrc
[i
];
3365 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3366 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3367 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3368 rgba
[i
][aDst
] = ((p
>> 30) );
3373 _mesa_problem(NULL
, "bad srcType in extract uint data");
3382 * Unpack a row of color image data from a client buffer according to
3383 * the pixel unpacking parameters.
3384 * Return GLubyte values in the specified dest image format.
3385 * This is used by glDrawPixels and glTexImage?D().
3386 * \param ctx - the context
3387 * n - number of pixels in the span
3388 * dstFormat - format of destination color array
3389 * dest - the destination color array
3390 * srcFormat - source image format
3391 * srcType - source image data type
3392 * source - source image pointer
3393 * srcPacking - pixel unpacking parameters
3394 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3396 * XXX perhaps expand this to process whole images someday.
3399 _mesa_unpack_color_span_ubyte(struct gl_context
*ctx
,
3400 GLuint n
, GLenum dstFormat
, GLubyte dest
[],
3401 GLenum srcFormat
, GLenum srcType
,
3402 const GLvoid
*source
,
3403 const struct gl_pixelstore_attrib
*srcPacking
,
3404 GLbitfield transferOps
)
3406 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3407 ASSERT(dstFormat
== GL_ALPHA
||
3408 dstFormat
== GL_LUMINANCE
||
3409 dstFormat
== GL_LUMINANCE_ALPHA
||
3410 dstFormat
== GL_INTENSITY
||
3411 dstFormat
== GL_RED
||
3412 dstFormat
== GL_RG
||
3413 dstFormat
== GL_RGB
||
3414 dstFormat
== GL_RGBA
);
3416 ASSERT(srcFormat
== GL_RED
||
3417 srcFormat
== GL_GREEN
||
3418 srcFormat
== GL_BLUE
||
3419 srcFormat
== GL_ALPHA
||
3420 srcFormat
== GL_LUMINANCE
||
3421 srcFormat
== GL_LUMINANCE_ALPHA
||
3422 srcFormat
== GL_INTENSITY
||
3423 srcFormat
== GL_RG
||
3424 srcFormat
== GL_RGB
||
3425 srcFormat
== GL_BGR
||
3426 srcFormat
== GL_RGBA
||
3427 srcFormat
== GL_BGRA
||
3428 srcFormat
== GL_ABGR_EXT
||
3429 srcFormat
== GL_COLOR_INDEX
);
3431 ASSERT(srcType
== GL_BITMAP
||
3432 srcType
== GL_UNSIGNED_BYTE
||
3433 srcType
== GL_BYTE
||
3434 srcType
== GL_UNSIGNED_SHORT
||
3435 srcType
== GL_SHORT
||
3436 srcType
== GL_UNSIGNED_INT
||
3437 srcType
== GL_INT
||
3438 srcType
== GL_HALF_FLOAT_ARB
||
3439 srcType
== GL_FLOAT
||
3440 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3441 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3442 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3443 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3444 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3445 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3446 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3447 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3448 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3449 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3450 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3451 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3452 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3453 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3455 /* EXT_texture_integer specifies no transfer ops on integer
3456 * types in the resolved issues section. Just set them to 0
3457 * for integer surfaces.
3462 /* Try simple cases first */
3463 if (transferOps
== 0) {
3464 if (srcType
== GL_UNSIGNED_BYTE
) {
3465 if (dstFormat
== GL_RGBA
) {
3466 if (srcFormat
== GL_RGBA
) {
3467 memcpy( dest
, source
, n
* 4 * sizeof(GLubyte
) );
3470 else if (srcFormat
== GL_RGB
) {
3472 const GLubyte
*src
= (const GLubyte
*) source
;
3473 GLubyte
*dst
= dest
;
3474 for (i
= 0; i
< n
; i
++) {
3485 else if (dstFormat
== GL_RGB
) {
3486 if (srcFormat
== GL_RGB
) {
3487 memcpy( dest
, source
, n
* 3 * sizeof(GLubyte
) );
3490 else if (srcFormat
== GL_RGBA
) {
3492 const GLubyte
*src
= (const GLubyte
*) source
;
3493 GLubyte
*dst
= dest
;
3494 for (i
= 0; i
< n
; i
++) {
3504 else if (dstFormat
== srcFormat
) {
3505 GLint comps
= _mesa_components_in_format(srcFormat
);
3507 memcpy( dest
, source
, n
* comps
* sizeof(GLubyte
) );
3514 /* general solution begins here */
3516 GLint dstComponents
;
3517 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3518 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3521 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3525 dstComponents
= _mesa_components_in_format( dstFormat
);
3526 /* source & dest image formats should have been error checked by now */
3527 assert(dstComponents
> 0);
3530 * Extract image data and convert to RGBA floats
3532 if (srcFormat
== GL_COLOR_INDEX
) {
3533 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3536 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3541 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3544 /* Convert indexes to RGBA */
3545 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3546 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3548 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3550 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3551 * with color indexes.
3553 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3558 /* non-color index data */
3559 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3560 srcPacking
->SwapBytes
);
3563 /* Need to clamp if returning GLubytes */
3564 transferOps
|= IMAGE_CLAMP_BIT
;
3567 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3570 get_component_indexes(dstFormat
,
3571 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3573 /* Now return the GLubyte data in the requested dstFormat */
3575 GLubyte
*dst
= dest
;
3577 for (i
= 0; i
< n
; i
++) {
3578 CLAMPED_FLOAT_TO_UBYTE(dst
[rDst
], rgba
[i
][RCOMP
]);
3579 dst
+= dstComponents
;
3584 GLubyte
*dst
= dest
;
3586 for (i
= 0; i
< n
; i
++) {
3587 CLAMPED_FLOAT_TO_UBYTE(dst
[gDst
], rgba
[i
][GCOMP
]);
3588 dst
+= dstComponents
;
3593 GLubyte
*dst
= dest
;
3595 for (i
= 0; i
< n
; i
++) {
3596 CLAMPED_FLOAT_TO_UBYTE(dst
[bDst
], rgba
[i
][BCOMP
]);
3597 dst
+= dstComponents
;
3602 GLubyte
*dst
= dest
;
3604 for (i
= 0; i
< n
; i
++) {
3605 CLAMPED_FLOAT_TO_UBYTE(dst
[aDst
], rgba
[i
][ACOMP
]);
3606 dst
+= dstComponents
;
3611 GLubyte
*dst
= dest
;
3614 assert(dstComponents
== 1);
3615 for (i
= 0; i
< n
; i
++) {
3616 /* Intensity comes from red channel */
3617 CLAMPED_FLOAT_TO_UBYTE(dst
[i
], rgba
[i
][RCOMP
]);
3622 GLubyte
*dst
= dest
;
3625 for (i
= 0; i
< n
; i
++) {
3626 /* Luminance comes from red channel */
3627 CLAMPED_FLOAT_TO_UBYTE(dst
[0], rgba
[i
][RCOMP
]);
3628 dst
+= dstComponents
;
3638 * Same as _mesa_unpack_color_span_ubyte(), but return GLfloat data
3639 * instead of GLubyte.
3642 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3643 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3644 GLenum srcFormat
, GLenum srcType
,
3645 const GLvoid
*source
,
3646 const struct gl_pixelstore_attrib
*srcPacking
,
3647 GLbitfield transferOps
)
3649 ASSERT(dstFormat
== GL_ALPHA
||
3650 dstFormat
== GL_LUMINANCE
||
3651 dstFormat
== GL_LUMINANCE_ALPHA
||
3652 dstFormat
== GL_INTENSITY
||
3653 dstFormat
== GL_RED
||
3654 dstFormat
== GL_RG
||
3655 dstFormat
== GL_RGB
||
3656 dstFormat
== GL_RGBA
);
3658 ASSERT(srcFormat
== GL_RED
||
3659 srcFormat
== GL_GREEN
||
3660 srcFormat
== GL_BLUE
||
3661 srcFormat
== GL_ALPHA
||
3662 srcFormat
== GL_LUMINANCE
||
3663 srcFormat
== GL_LUMINANCE_ALPHA
||
3664 srcFormat
== GL_INTENSITY
||
3665 srcFormat
== GL_RG
||
3666 srcFormat
== GL_RGB
||
3667 srcFormat
== GL_BGR
||
3668 srcFormat
== GL_RGBA
||
3669 srcFormat
== GL_BGRA
||
3670 srcFormat
== GL_ABGR_EXT
||
3671 srcFormat
== GL_RED_INTEGER_EXT
||
3672 srcFormat
== GL_GREEN_INTEGER_EXT
||
3673 srcFormat
== GL_BLUE_INTEGER_EXT
||
3674 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3675 srcFormat
== GL_RG_INTEGER
||
3676 srcFormat
== GL_RGB_INTEGER_EXT
||
3677 srcFormat
== GL_RGBA_INTEGER_EXT
||
3678 srcFormat
== GL_BGR_INTEGER_EXT
||
3679 srcFormat
== GL_BGRA_INTEGER_EXT
||
3680 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3681 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3682 srcFormat
== GL_COLOR_INDEX
);
3684 ASSERT(srcType
== GL_BITMAP
||
3685 srcType
== GL_UNSIGNED_BYTE
||
3686 srcType
== GL_BYTE
||
3687 srcType
== GL_UNSIGNED_SHORT
||
3688 srcType
== GL_SHORT
||
3689 srcType
== GL_UNSIGNED_INT
||
3690 srcType
== GL_INT
||
3691 srcType
== GL_HALF_FLOAT_ARB
||
3692 srcType
== GL_FLOAT
||
3693 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3694 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3695 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3696 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3697 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3698 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3699 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3700 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3701 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3702 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3703 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3704 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3705 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3706 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3708 /* general solution, no special cases, yet */
3710 GLint dstComponents
;
3711 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3712 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3713 GLboolean intFormat
= _mesa_is_integer_format(srcFormat
);
3716 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3720 dstComponents
= _mesa_components_in_format( dstFormat
);
3721 /* source & dest image formats should have been error checked by now */
3722 assert(dstComponents
> 0);
3724 /* EXT_texture_integer specifies no transfer ops on integer
3725 * types in the resolved issues section. Just set them to 0
3726 * for integer surfaces.
3732 * Extract image data and convert to RGBA floats
3734 if (srcFormat
== GL_COLOR_INDEX
) {
3735 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3738 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3743 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3746 /* Convert indexes to RGBA */
3747 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3748 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3750 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3752 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3753 * with color indexes.
3755 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3760 /* non-color index data */
3761 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3762 srcPacking
->SwapBytes
);
3766 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3769 get_component_indexes(dstFormat
,
3770 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3772 /* Now pack results in the requested dstFormat */
3774 GLfloat
*dst
= dest
;
3776 for (i
= 0; i
< n
; i
++) {
3777 dst
[rDst
] = rgba
[i
][RCOMP
];
3778 dst
+= dstComponents
;
3783 GLfloat
*dst
= dest
;
3785 for (i
= 0; i
< n
; i
++) {
3786 dst
[gDst
] = rgba
[i
][GCOMP
];
3787 dst
+= dstComponents
;
3792 GLfloat
*dst
= dest
;
3794 for (i
= 0; i
< n
; i
++) {
3795 dst
[bDst
] = rgba
[i
][BCOMP
];
3796 dst
+= dstComponents
;
3801 GLfloat
*dst
= dest
;
3803 for (i
= 0; i
< n
; i
++) {
3804 dst
[aDst
] = rgba
[i
][ACOMP
];
3805 dst
+= dstComponents
;
3810 GLfloat
*dst
= dest
;
3813 assert(dstComponents
== 1);
3814 for (i
= 0; i
< n
; i
++) {
3815 /* Intensity comes from red channel */
3816 dst
[i
] = rgba
[i
][RCOMP
];
3821 GLfloat
*dst
= dest
;
3824 for (i
= 0; i
< n
; i
++) {
3825 /* Luminance comes from red channel */
3826 dst
[0] = rgba
[i
][RCOMP
];
3827 dst
+= dstComponents
;
3837 * Same as _mesa_unpack_color_span_ubyte(), but return GLuint data
3838 * instead of GLubyte.
3839 * No pixel transfer ops are applied.
3842 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3843 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3844 GLenum srcFormat
, GLenum srcType
,
3845 const GLvoid
*source
,
3846 const struct gl_pixelstore_attrib
*srcPacking
)
3848 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3851 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3855 ASSERT(dstFormat
== GL_ALPHA
||
3856 dstFormat
== GL_LUMINANCE
||
3857 dstFormat
== GL_LUMINANCE_ALPHA
||
3858 dstFormat
== GL_INTENSITY
||
3859 dstFormat
== GL_RED
||
3860 dstFormat
== GL_RG
||
3861 dstFormat
== GL_RGB
||
3862 dstFormat
== GL_RGBA
);
3864 ASSERT(srcFormat
== GL_RED
||
3865 srcFormat
== GL_GREEN
||
3866 srcFormat
== GL_BLUE
||
3867 srcFormat
== GL_ALPHA
||
3868 srcFormat
== GL_LUMINANCE
||
3869 srcFormat
== GL_LUMINANCE_ALPHA
||
3870 srcFormat
== GL_INTENSITY
||
3871 srcFormat
== GL_RG
||
3872 srcFormat
== GL_RGB
||
3873 srcFormat
== GL_BGR
||
3874 srcFormat
== GL_RGBA
||
3875 srcFormat
== GL_BGRA
||
3876 srcFormat
== GL_ABGR_EXT
||
3877 srcFormat
== GL_RED_INTEGER_EXT
||
3878 srcFormat
== GL_GREEN_INTEGER_EXT
||
3879 srcFormat
== GL_BLUE_INTEGER_EXT
||
3880 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3881 srcFormat
== GL_RG_INTEGER
||
3882 srcFormat
== GL_RGB_INTEGER_EXT
||
3883 srcFormat
== GL_RGBA_INTEGER_EXT
||
3884 srcFormat
== GL_BGR_INTEGER_EXT
||
3885 srcFormat
== GL_BGRA_INTEGER_EXT
||
3886 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3887 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3889 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3890 srcType
== GL_BYTE
||
3891 srcType
== GL_UNSIGNED_SHORT
||
3892 srcType
== GL_SHORT
||
3893 srcType
== GL_UNSIGNED_INT
||
3894 srcType
== GL_INT
||
3895 srcType
== GL_HALF_FLOAT_ARB
||
3896 srcType
== GL_FLOAT
||
3897 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3898 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3899 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3900 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3901 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3902 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3903 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3904 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3905 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3906 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3907 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3908 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
||
3909 srcType
== GL_UNSIGNED_INT_5_9_9_9_REV
||
3910 srcType
== GL_UNSIGNED_INT_10F_11F_11F_REV
);
3913 /* Extract image data as uint[4] pixels */
3914 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3915 srcPacking
->SwapBytes
);
3917 if (dstFormat
== GL_RGBA
) {
3919 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3923 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3924 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3926 assert(dstComponents
> 0);
3928 get_component_indexes(dstFormat
,
3929 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3931 /* Now pack values in the requested dest format */
3935 for (i
= 0; i
< n
; i
++) {
3936 dst
[rDst
] = rgba
[i
][RCOMP
];
3937 dst
+= dstComponents
;
3944 for (i
= 0; i
< n
; i
++) {
3945 dst
[gDst
] = rgba
[i
][GCOMP
];
3946 dst
+= dstComponents
;
3953 for (i
= 0; i
< n
; i
++) {
3954 dst
[bDst
] = rgba
[i
][BCOMP
];
3955 dst
+= dstComponents
;
3962 for (i
= 0; i
< n
; i
++) {
3963 dst
[aDst
] = rgba
[i
][ACOMP
];
3964 dst
+= dstComponents
;
3972 assert(dstComponents
== 1);
3973 for (i
= 0; i
< n
; i
++) {
3974 /* Intensity comes from red channel */
3975 dst
[i
] = rgba
[i
][RCOMP
];
3983 for (i
= 0; i
< n
; i
++) {
3984 /* Luminance comes from red channel */
3985 dst
[0] = rgba
[i
][RCOMP
];
3986 dst
+= dstComponents
;
3997 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3998 * directly return GLbyte data, no transfer ops apply.
4001 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
4002 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
4003 GLenum srcFormat
, GLenum srcType
,
4004 const GLvoid
*source
,
4005 const struct gl_pixelstore_attrib
*srcPacking
,
4006 GLbitfield transferOps
)
4008 ASSERT(dstFormat
== GL_DUDV_ATI
);
4009 ASSERT(srcFormat
== GL_DUDV_ATI
||
4010 srcFormat
== GL_DU8DV8_ATI
);
4012 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
4013 srcType
== GL_BYTE
||
4014 srcType
== GL_UNSIGNED_SHORT
||
4015 srcType
== GL_SHORT
||
4016 srcType
== GL_UNSIGNED_INT
||
4017 srcType
== GL_INT
||
4018 srcType
== GL_HALF_FLOAT_ARB
||
4019 srcType
== GL_FLOAT
);
4021 /* general solution */
4023 GLint dstComponents
;
4026 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4029 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4033 dstComponents
= _mesa_components_in_format( dstFormat
);
4034 /* source & dest image formats should have been error checked by now */
4035 assert(dstComponents
> 0);
4038 * Extract image data and convert to RGBA floats
4040 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4041 srcPacking
->SwapBytes
);
4044 /* Now determine which color channels we need to produce.
4045 * And determine the dest index (offset) within each color tuple.
4048 /* Now pack results in the requested dstFormat */
4049 for (i
= 0; i
< n
; i
++) {
4050 /* not sure - need clamp[-1,1] here? */
4051 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4052 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4053 dst
+= dstComponents
;
4061 * Unpack a row of color index data from a client buffer according to
4062 * the pixel unpacking parameters.
4063 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4065 * Args: ctx - the context
4066 * n - number of pixels
4067 * dstType - destination data type
4068 * dest - destination array
4069 * srcType - source pixel type
4070 * source - source data pointer
4071 * srcPacking - pixel unpacking parameters
4072 * transferOps - the pixel transfer operations to apply
4075 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4076 GLenum dstType
, GLvoid
*dest
,
4077 GLenum srcType
, const GLvoid
*source
,
4078 const struct gl_pixelstore_attrib
*srcPacking
,
4079 GLbitfield transferOps
)
4081 ASSERT(srcType
== GL_BITMAP
||
4082 srcType
== GL_UNSIGNED_BYTE
||
4083 srcType
== GL_BYTE
||
4084 srcType
== GL_UNSIGNED_SHORT
||
4085 srcType
== GL_SHORT
||
4086 srcType
== GL_UNSIGNED_INT
||
4087 srcType
== GL_INT
||
4088 srcType
== GL_HALF_FLOAT_ARB
||
4089 srcType
== GL_FLOAT
);
4091 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4092 dstType
== GL_UNSIGNED_SHORT
||
4093 dstType
== GL_UNSIGNED_INT
);
4096 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4099 * Try simple cases first
4101 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4102 && dstType
== GL_UNSIGNED_BYTE
) {
4103 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4105 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4106 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4107 memcpy(dest
, source
, n
* sizeof(GLuint
));
4113 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4116 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4120 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4124 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4126 /* convert to dest type */
4128 case GL_UNSIGNED_BYTE
:
4130 GLubyte
*dst
= (GLubyte
*) dest
;
4132 for (i
= 0; i
< n
; i
++) {
4133 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4137 case GL_UNSIGNED_SHORT
:
4139 GLuint
*dst
= (GLuint
*) dest
;
4141 for (i
= 0; i
< n
; i
++) {
4142 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4146 case GL_UNSIGNED_INT
:
4147 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4150 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4159 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4160 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4161 const struct gl_pixelstore_attrib
*dstPacking
,
4162 GLbitfield transferOps
)
4164 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4167 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4171 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4173 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4174 /* make a copy of input */
4175 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4176 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4181 case GL_UNSIGNED_BYTE
:
4183 GLubyte
*dst
= (GLubyte
*) dest
;
4185 for (i
= 0; i
< n
; i
++) {
4186 *dst
++ = (GLubyte
) source
[i
];
4192 GLbyte
*dst
= (GLbyte
*) dest
;
4194 for (i
= 0; i
< n
; i
++) {
4195 dst
[i
] = (GLbyte
) source
[i
];
4199 case GL_UNSIGNED_SHORT
:
4201 GLushort
*dst
= (GLushort
*) dest
;
4203 for (i
= 0; i
< n
; i
++) {
4204 dst
[i
] = (GLushort
) source
[i
];
4206 if (dstPacking
->SwapBytes
) {
4207 _mesa_swap2( (GLushort
*) dst
, n
);
4213 GLshort
*dst
= (GLshort
*) dest
;
4215 for (i
= 0; i
< n
; i
++) {
4216 dst
[i
] = (GLshort
) source
[i
];
4218 if (dstPacking
->SwapBytes
) {
4219 _mesa_swap2( (GLushort
*) dst
, n
);
4223 case GL_UNSIGNED_INT
:
4225 GLuint
*dst
= (GLuint
*) dest
;
4227 for (i
= 0; i
< n
; i
++) {
4228 dst
[i
] = (GLuint
) source
[i
];
4230 if (dstPacking
->SwapBytes
) {
4231 _mesa_swap4( (GLuint
*) dst
, n
);
4237 GLint
*dst
= (GLint
*) dest
;
4239 for (i
= 0; i
< n
; i
++) {
4240 dst
[i
] = (GLint
) source
[i
];
4242 if (dstPacking
->SwapBytes
) {
4243 _mesa_swap4( (GLuint
*) dst
, n
);
4249 GLfloat
*dst
= (GLfloat
*) dest
;
4251 for (i
= 0; i
< n
; i
++) {
4252 dst
[i
] = (GLfloat
) source
[i
];
4254 if (dstPacking
->SwapBytes
) {
4255 _mesa_swap4( (GLuint
*) dst
, n
);
4259 case GL_HALF_FLOAT_ARB
:
4261 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4263 for (i
= 0; i
< n
; i
++) {
4264 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4266 if (dstPacking
->SwapBytes
) {
4267 _mesa_swap2( (GLushort
*) dst
, n
);
4272 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4280 * Unpack a row of stencil data from a client buffer according to
4281 * the pixel unpacking parameters.
4282 * This is (or will be) used by glDrawPixels
4284 * Args: ctx - the context
4285 * n - number of pixels
4286 * dstType - destination data type
4287 * dest - destination array
4288 * srcType - source pixel type
4289 * source - source data pointer
4290 * srcPacking - pixel unpacking parameters
4291 * transferOps - apply offset/bias/lookup ops?
4294 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4295 GLenum dstType
, GLvoid
*dest
,
4296 GLenum srcType
, const GLvoid
*source
,
4297 const struct gl_pixelstore_attrib
*srcPacking
,
4298 GLbitfield transferOps
)
4300 ASSERT(srcType
== GL_BITMAP
||
4301 srcType
== GL_UNSIGNED_BYTE
||
4302 srcType
== GL_BYTE
||
4303 srcType
== GL_UNSIGNED_SHORT
||
4304 srcType
== GL_SHORT
||
4305 srcType
== GL_UNSIGNED_INT
||
4306 srcType
== GL_INT
||
4307 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4308 srcType
== GL_HALF_FLOAT_ARB
||
4309 srcType
== GL_FLOAT
||
4310 srcType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4312 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4313 dstType
== GL_UNSIGNED_SHORT
||
4314 dstType
== GL_UNSIGNED_INT
||
4315 dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
);
4317 /* only shift and offset apply to stencil */
4318 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4321 * Try simple cases first
4323 if (transferOps
== 0 &&
4324 !ctx
->Pixel
.MapStencilFlag
&&
4325 srcType
== GL_UNSIGNED_BYTE
&&
4326 dstType
== GL_UNSIGNED_BYTE
) {
4327 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4329 else if (transferOps
== 0 &&
4330 !ctx
->Pixel
.MapStencilFlag
&&
4331 srcType
== GL_UNSIGNED_INT
&&
4332 dstType
== GL_UNSIGNED_INT
&&
4333 !srcPacking
->SwapBytes
) {
4334 memcpy(dest
, source
, n
* sizeof(GLuint
));
4340 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4343 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4347 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4350 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4351 /* shift and offset indexes */
4352 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4355 if (ctx
->Pixel
.MapStencilFlag
) {
4356 /* Apply stencil lookup table */
4357 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4359 for (i
= 0; i
< n
; i
++) {
4360 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4364 /* convert to dest type */
4366 case GL_UNSIGNED_BYTE
:
4368 GLubyte
*dst
= (GLubyte
*) dest
;
4370 for (i
= 0; i
< n
; i
++) {
4371 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4375 case GL_UNSIGNED_SHORT
:
4377 GLuint
*dst
= (GLuint
*) dest
;
4379 for (i
= 0; i
< n
; i
++) {
4380 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4384 case GL_UNSIGNED_INT
:
4385 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4387 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4389 GLuint
*dst
= (GLuint
*) dest
;
4391 for (i
= 0; i
< n
; i
++) {
4392 dst
[i
*2+1] = indexes
[i
] & 0xff; /* lower 8 bits */
4397 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4406 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4407 GLenum dstType
, GLvoid
*dest
, const GLubyte
*source
,
4408 const struct gl_pixelstore_attrib
*dstPacking
)
4410 GLubyte
*stencil
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4413 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4417 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4418 ctx
->Pixel
.MapStencilFlag
) {
4419 /* make a copy of input */
4420 memcpy(stencil
, source
, n
* sizeof(GLubyte
));
4421 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4426 case GL_UNSIGNED_BYTE
:
4427 memcpy(dest
, source
, n
);
4431 GLbyte
*dst
= (GLbyte
*) dest
;
4434 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4438 case GL_UNSIGNED_SHORT
:
4440 GLushort
*dst
= (GLushort
*) dest
;
4443 dst
[i
] = (GLushort
) source
[i
];
4445 if (dstPacking
->SwapBytes
) {
4446 _mesa_swap2( (GLushort
*) dst
, n
);
4452 GLshort
*dst
= (GLshort
*) dest
;
4455 dst
[i
] = (GLshort
) source
[i
];
4457 if (dstPacking
->SwapBytes
) {
4458 _mesa_swap2( (GLushort
*) dst
, n
);
4462 case GL_UNSIGNED_INT
:
4464 GLuint
*dst
= (GLuint
*) dest
;
4467 dst
[i
] = (GLuint
) source
[i
];
4469 if (dstPacking
->SwapBytes
) {
4470 _mesa_swap4( (GLuint
*) dst
, n
);
4476 GLint
*dst
= (GLint
*) dest
;
4479 dst
[i
] = (GLint
) source
[i
];
4481 if (dstPacking
->SwapBytes
) {
4482 _mesa_swap4( (GLuint
*) dst
, n
);
4488 GLfloat
*dst
= (GLfloat
*) dest
;
4491 dst
[i
] = (GLfloat
) source
[i
];
4493 if (dstPacking
->SwapBytes
) {
4494 _mesa_swap4( (GLuint
*) dst
, n
);
4498 case GL_HALF_FLOAT_ARB
:
4500 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4503 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4505 if (dstPacking
->SwapBytes
) {
4506 _mesa_swap2( (GLushort
*) dst
, n
);
4511 if (dstPacking
->LsbFirst
) {
4512 GLubyte
*dst
= (GLubyte
*) dest
;
4515 for (i
= 0; i
< n
; i
++) {
4518 *dst
|= ((source
[i
] != 0) << shift
);
4527 GLubyte
*dst
= (GLubyte
*) dest
;
4530 for (i
= 0; i
< n
; i
++) {
4533 *dst
|= ((source
[i
] != 0) << shift
);
4543 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4549 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4552 const GLTYPE *src = (const GLTYPE *)source; \
4553 for (i = 0; i < n; i++) { \
4554 GLTYPE value = src[i]; \
4555 if (srcPacking->SwapBytes) { \
4556 if (sizeof(GLTYPE) == 2) { \
4558 } else if (sizeof(GLTYPE) == 4) { \
4562 depthValues[i] = GLTYPE2FLOAT(value); \
4568 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4569 * or GLfloat values.
4570 * The glPixelTransfer (scale/bias) params will be applied.
4572 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4573 * \param depthMax max value for returned GLushort or GLuint values
4574 * (ignored for GLfloat).
4577 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4578 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4579 GLenum srcType
, const GLvoid
*source
,
4580 const struct gl_pixelstore_attrib
*srcPacking
)
4582 GLfloat
*depthTemp
= NULL
, *depthValues
;
4583 GLboolean needClamp
= GL_FALSE
;
4585 /* Look for special cases first.
4586 * Not only are these faster, they're less prone to numeric conversion
4587 * problems. Otherwise, converting from an int type to a float then
4588 * back to an int type can introduce errors that will show up as
4589 * artifacts in things like depth peeling which uses glCopyTexImage.
4591 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4592 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4593 const GLuint
*src
= (const GLuint
*) source
;
4594 GLushort
*dst
= (GLushort
*) dest
;
4596 for (i
= 0; i
< n
; i
++) {
4597 dst
[i
] = src
[i
] >> 16;
4601 if (srcType
== GL_UNSIGNED_SHORT
4602 && dstType
== GL_UNSIGNED_INT
4603 && depthMax
== 0xffffffff) {
4604 const GLushort
*src
= (const GLushort
*) source
;
4605 GLuint
*dst
= (GLuint
*) dest
;
4607 for (i
= 0; i
< n
; i
++) {
4608 dst
[i
] = src
[i
] | (src
[i
] << 16);
4612 if (srcType
== GL_UNSIGNED_INT_24_8
4613 && dstType
== GL_UNSIGNED_INT
4614 && depthMax
== 0xffffff) {
4615 const GLuint
*src
= (const GLuint
*) source
;
4616 GLuint
*dst
= (GLuint
*) dest
;
4618 for (i
= 0; i
< n
; i
++) {
4619 dst
[i
] = src
[i
] >> 8;
4623 /* XXX may want to add additional cases here someday */
4626 /* general case path follows */
4628 if (dstType
== GL_FLOAT
) {
4629 depthValues
= (GLfloat
*) dest
;
4632 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4634 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4638 depthValues
= depthTemp
;
4641 /* Convert incoming values to GLfloat. Some conversions will require
4646 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOATZ
);
4647 needClamp
= GL_TRUE
;
4649 case GL_UNSIGNED_BYTE
:
4650 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4653 DEPTH_VALUES(GLshort
, SHORT_TO_FLOATZ
);
4654 needClamp
= GL_TRUE
;
4656 case GL_UNSIGNED_SHORT
:
4657 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4660 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4661 needClamp
= GL_TRUE
;
4663 case GL_UNSIGNED_INT
:
4664 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4666 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4667 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4668 depthMax
== 0xffffff &&
4669 ctx
->Pixel
.DepthScale
== 1.0 &&
4670 ctx
->Pixel
.DepthBias
== 0.0) {
4671 const GLuint
*src
= (const GLuint
*) source
;
4672 GLuint
*zValues
= (GLuint
*) dest
;
4674 for (i
= 0; i
< n
; i
++) {
4675 GLuint value
= src
[i
];
4676 if (srcPacking
->SwapBytes
) {
4679 zValues
[i
] = value
& 0xffffff00;
4685 const GLuint
*src
= (const GLuint
*) source
;
4686 const GLfloat scale
= 1.0f
/ 0xffffff;
4688 for (i
= 0; i
< n
; i
++) {
4689 GLuint value
= src
[i
];
4690 if (srcPacking
->SwapBytes
) {
4693 depthValues
[i
] = (value
>> 8) * scale
;
4697 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4700 const GLfloat
*src
= (const GLfloat
*)source
;
4701 for (i
= 0; i
< n
; i
++) {
4702 GLfloat value
= src
[i
* 2];
4703 if (srcPacking
->SwapBytes
) {
4706 depthValues
[i
] = value
;
4708 needClamp
= GL_TRUE
;
4712 DEPTH_VALUES(GLfloat
, 1*);
4713 needClamp
= GL_TRUE
;
4715 case GL_HALF_FLOAT_ARB
:
4718 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4719 for (i
= 0; i
< n
; i
++) {
4720 GLhalfARB value
= src
[i
];
4721 if (srcPacking
->SwapBytes
) {
4724 depthValues
[i
] = _mesa_half_to_float(value
);
4726 needClamp
= GL_TRUE
;
4730 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4735 /* apply depth scale and bias */
4737 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4738 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4739 if (scale
!= 1.0 || bias
!= 0.0) {
4741 for (i
= 0; i
< n
; i
++) {
4742 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4744 needClamp
= GL_TRUE
;
4748 /* clamp to [0, 1] */
4751 for (i
= 0; i
< n
; i
++) {
4752 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4757 * Convert values to dstType
4759 if (dstType
== GL_UNSIGNED_INT
) {
4760 GLuint
*zValues
= (GLuint
*) dest
;
4762 if (depthMax
<= 0xffffff) {
4763 /* no overflow worries */
4764 for (i
= 0; i
< n
; i
++) {
4765 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4769 /* need to use double precision to prevent overflow problems */
4770 for (i
= 0; i
< n
; i
++) {
4771 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4772 if (z
>= (GLdouble
) 0xffffffff)
4773 zValues
[i
] = 0xffffffff;
4775 zValues
[i
] = (GLuint
) z
;
4779 else if (dstType
== GL_UNSIGNED_SHORT
) {
4780 GLushort
*zValues
= (GLushort
*) dest
;
4782 ASSERT(depthMax
<= 0xffff);
4783 for (i
= 0; i
< n
; i
++) {
4784 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4787 else if (dstType
== GL_FLOAT
) {
4788 /* Nothing to do. depthValues is pointing to dest. */
4790 else if (dstType
== GL_FLOAT_32_UNSIGNED_INT_24_8_REV
) {
4791 GLfloat
*zValues
= (GLfloat
*) dest
;
4793 for (i
= 0; i
< n
; i
++) {
4794 zValues
[i
*2] = depthValues
[i
];
4806 * Pack an array of depth values. The values are floats in [0,1].
4809 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4810 GLenum dstType
, const GLfloat
*depthSpan
,
4811 const struct gl_pixelstore_attrib
*dstPacking
)
4813 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4815 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4819 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4820 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4821 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4822 depthSpan
= depthCopy
;
4826 case GL_UNSIGNED_BYTE
:
4828 GLubyte
*dst
= (GLubyte
*) dest
;
4830 for (i
= 0; i
< n
; i
++) {
4831 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4837 GLbyte
*dst
= (GLbyte
*) dest
;
4839 for (i
= 0; i
< n
; i
++) {
4840 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4844 case GL_UNSIGNED_SHORT
:
4846 GLushort
*dst
= (GLushort
*) dest
;
4848 for (i
= 0; i
< n
; i
++) {
4849 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4851 if (dstPacking
->SwapBytes
) {
4852 _mesa_swap2( (GLushort
*) dst
, n
);
4858 GLshort
*dst
= (GLshort
*) dest
;
4860 for (i
= 0; i
< n
; i
++) {
4861 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4863 if (dstPacking
->SwapBytes
) {
4864 _mesa_swap2( (GLushort
*) dst
, n
);
4868 case GL_UNSIGNED_INT
:
4870 GLuint
*dst
= (GLuint
*) dest
;
4872 for (i
= 0; i
< n
; i
++) {
4873 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4875 if (dstPacking
->SwapBytes
) {
4876 _mesa_swap4( (GLuint
*) dst
, n
);
4882 GLint
*dst
= (GLint
*) dest
;
4884 for (i
= 0; i
< n
; i
++) {
4885 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4887 if (dstPacking
->SwapBytes
) {
4888 _mesa_swap4( (GLuint
*) dst
, n
);
4894 GLfloat
*dst
= (GLfloat
*) dest
;
4896 for (i
= 0; i
< n
; i
++) {
4897 dst
[i
] = depthSpan
[i
];
4899 if (dstPacking
->SwapBytes
) {
4900 _mesa_swap4( (GLuint
*) dst
, n
);
4904 case GL_HALF_FLOAT_ARB
:
4906 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4908 for (i
= 0; i
< n
; i
++) {
4909 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4911 if (dstPacking
->SwapBytes
) {
4912 _mesa_swap2( (GLushort
*) dst
, n
);
4917 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4926 * Pack depth and stencil values as GL_DEPTH_STENCIL (GL_UNSIGNED_INT_24_8 etc)
4929 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
,GLuint n
,
4930 GLenum dstType
, GLuint
*dest
,
4931 const GLfloat
*depthVals
,
4932 const GLubyte
*stencilVals
,
4933 const struct gl_pixelstore_attrib
*dstPacking
)
4935 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4936 GLubyte
*stencilCopy
= (GLubyte
*) malloc(n
* sizeof(GLubyte
));
4939 if (!depthCopy
|| !stencilCopy
) {
4940 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4946 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4947 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4948 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4949 depthVals
= depthCopy
;
4952 if (ctx
->Pixel
.IndexShift
||
4953 ctx
->Pixel
.IndexOffset
||
4954 ctx
->Pixel
.MapStencilFlag
) {
4955 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLubyte
));
4956 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4957 stencilVals
= stencilCopy
;
4961 case GL_UNSIGNED_INT_24_8
:
4962 for (i
= 0; i
< n
; i
++) {
4963 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4964 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4967 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV
:
4968 for (i
= 0; i
< n
; i
++) {
4969 ((GLfloat
*)dest
)[i
*2] = depthVals
[i
];
4970 dest
[i
*2+1] = stencilVals
[i
] & 0xff;
4975 if (dstPacking
->SwapBytes
) {
4976 _mesa_swap4(dest
, n
);
4987 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4988 * Return all image data in a contiguous block. This is used when we
4989 * compile glDrawPixels, glTexImage, etc into a display list. We
4990 * need a copy of the data in a standard format.
4993 _mesa_unpack_image( GLuint dimensions
,
4994 GLsizei width
, GLsizei height
, GLsizei depth
,
4995 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4996 const struct gl_pixelstore_attrib
*unpack
)
4998 GLint bytesPerRow
, compsPerRow
;
4999 GLboolean flipBytes
, swap2
, swap4
;
5002 return NULL
; /* not necessarily an error */
5004 if (width
<= 0 || height
<= 0 || depth
<= 0)
5005 return NULL
; /* generate error later */
5007 if (type
== GL_BITMAP
) {
5008 bytesPerRow
= (width
+ 7) >> 3;
5009 flipBytes
= unpack
->LsbFirst
;
5010 swap2
= swap4
= GL_FALSE
;
5014 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
5015 GLint components
= _mesa_components_in_format(format
);
5018 if (_mesa_type_is_packed(type
))
5021 if (bytesPerPixel
<= 0 || components
<= 0)
5022 return NULL
; /* bad format or type. generate error later */
5023 bytesPerRow
= bytesPerPixel
* width
;
5024 bytesPerComp
= bytesPerPixel
/ components
;
5025 flipBytes
= GL_FALSE
;
5026 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
5027 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
5028 compsPerRow
= components
* width
;
5029 assert(compsPerRow
>= width
);
5034 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
5038 return NULL
; /* generate GL_OUT_OF_MEMORY later */
5041 for (img
= 0; img
< depth
; img
++) {
5042 for (row
= 0; row
< height
; row
++) {
5043 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
5044 width
, height
, format
, type
, img
, row
, 0);
5046 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
5048 flipBytes
= GL_FALSE
;
5049 if (unpack
->LsbFirst
) {
5050 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
5051 GLubyte dstMask
= 128;
5052 const GLubyte
*s
= src
;
5055 for (i
= 0; i
< width
; i
++) {
5059 if (srcMask
== 128) {
5064 srcMask
= srcMask
<< 1;
5072 dstMask
= dstMask
>> 1;
5077 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5078 GLubyte dstMask
= 128;
5079 const GLubyte
*s
= src
;
5082 for (i
= 0; i
< width
; i
++) {
5091 srcMask
= srcMask
>> 1;
5099 dstMask
= dstMask
>> 1;
5105 memcpy(dst
, src
, bytesPerRow
);
5108 /* byte flipping/swapping */
5110 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5113 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5116 _mesa_swap4((GLuint
*) dst
, compsPerRow
);
5128 * If we unpack colors from a luminance surface, we'll get pixel colors
5129 * such as (l, l, l, a).
5130 * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that
5131 * function will compute L=R+G+B before packing. The net effect is we'll
5132 * accidentally store luminance values = 3*l.
5133 * This function compensates for that by converting (aka rebasing) (l,l,l,a)
5135 * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA
5138 * Finally, we also need to do this when the actual surface format does
5139 * not match the logical surface format. For example, suppose the user
5140 * requests a GL_LUMINANCE texture but the driver stores it as RGBA.
5141 * Again, we'll get pixel values like (l,l,l,a).
5144 _mesa_rebase_rgba_float(GLuint n
, GLfloat rgba
[][4], GLenum baseFormat
)
5148 switch (baseFormat
) {
5150 for (i
= 0; i
< n
; i
++) {
5151 rgba
[i
][RCOMP
] = 0.0F
;
5152 rgba
[i
][GCOMP
] = 0.0F
;
5153 rgba
[i
][BCOMP
] = 0.0F
;
5159 for (i
= 0; i
< n
; i
++) {
5160 rgba
[i
][GCOMP
] = 0.0F
;
5161 rgba
[i
][BCOMP
] = 0.0F
;
5162 rgba
[i
][ACOMP
] = 1.0F
;
5165 case GL_LUMINANCE_ALPHA
:
5166 for (i
= 0; i
< n
; i
++) {
5167 rgba
[i
][GCOMP
] = 0.0F
;
5168 rgba
[i
][BCOMP
] = 0.0F
;
5179 * As above, but GLuint components.
5182 _mesa_rebase_rgba_uint(GLuint n
, GLuint rgba
[][4], GLenum baseFormat
)
5186 switch (baseFormat
) {
5188 for (i
= 0; i
< n
; i
++) {
5197 for (i
= 0; i
< n
; i
++) {
5203 case GL_LUMINANCE_ALPHA
:
5204 for (i
= 0; i
< n
; i
++) {