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.
38 #include "pixeltransfer.h"
44 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
45 * we later convert the float to a packed integer value (such as for
46 * GL_RGB5_A1) because we'll wind up with a non-zero value.
48 * We redefine the macros here so zero is handled correctly.
51 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
54 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
58 /** Compute ceiling of integer quotient of A divided by B. */
59 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
63 * Flip the 8 bits in each byte of the given array.
66 * \param n number of bytes.
68 * \todo try this trick to flip bytes someday:
70 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
71 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
72 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
76 flip_bytes( GLubyte
*p
, GLuint n
)
79 for (i
= 0; i
< n
; i
++) {
80 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
81 a
= ((b
& 0x01) << 7) |
96 * Unpack a 32x32 pixel polygon stipple from user memory using the
97 * current pixel unpack settings.
100 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
101 const struct gl_pixelstore_attrib
*unpacking
)
103 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
105 /* Convert pattern from GLubytes to GLuints and handle big/little
110 for (i
= 0; i
< 32; i
++) {
111 dest
[i
] = (p
[0] << 24)
123 * Pack polygon stipple into user memory given current pixel packing
127 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
128 const struct gl_pixelstore_attrib
*packing
)
130 /* Convert pattern from GLuints to GLubytes to handle big/little
131 * endian differences.
135 for (i
= 0; i
< 32; i
++) {
136 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
137 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
138 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
139 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
142 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
147 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
148 * order with row alignment = 1 byte.
151 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
152 const struct gl_pixelstore_attrib
*packing
)
154 GLint bytes
, row
, width_in_bytes
;
155 GLubyte
*buffer
, *dst
;
160 /* Alloc dest storage */
161 bytes
= ((width
+ 7) / 8 * height
);
162 buffer
= (GLubyte
*) malloc( bytes
);
166 width_in_bytes
= CEILING( width
, 8 );
168 for (row
= 0; row
< height
; row
++) {
169 const GLubyte
*src
= (const GLubyte
*)
170 _mesa_image_address2d(packing
, pixels
, width
, height
,
171 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
177 if ((packing
->SkipPixels
& 7) == 0) {
178 memcpy( dst
, src
, width_in_bytes
);
179 if (packing
->LsbFirst
) {
180 flip_bytes( dst
, width_in_bytes
);
184 /* handling SkipPixels is a bit tricky (no pun intended!) */
186 if (packing
->LsbFirst
) {
187 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
188 GLubyte dstMask
= 128;
189 const GLubyte
*s
= src
;
192 for (i
= 0; i
< width
; i
++) {
196 if (srcMask
== 128) {
201 srcMask
= srcMask
<< 1;
209 dstMask
= dstMask
>> 1;
214 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
215 GLubyte dstMask
= 128;
216 const GLubyte
*s
= src
;
219 for (i
= 0; i
< width
; i
++) {
228 srcMask
= srcMask
>> 1;
236 dstMask
= dstMask
>> 1;
241 dst
+= width_in_bytes
;
252 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
253 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
255 GLint row
, width_in_bytes
;
261 width_in_bytes
= CEILING( width
, 8 );
263 for (row
= 0; row
< height
; row
++) {
264 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
265 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
269 if ((packing
->SkipPixels
& 7) == 0) {
270 memcpy( dst
, src
, width_in_bytes
);
271 if (packing
->LsbFirst
) {
272 flip_bytes( dst
, width_in_bytes
);
276 /* handling SkipPixels is a bit tricky (no pun intended!) */
278 if (packing
->LsbFirst
) {
279 GLubyte srcMask
= 128;
280 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
281 const GLubyte
*s
= src
;
284 for (i
= 0; i
< width
; i
++) {
293 srcMask
= srcMask
>> 1;
295 if (dstMask
== 128) {
301 dstMask
= dstMask
<< 1;
306 GLubyte srcMask
= 128;
307 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
308 const GLubyte
*s
= src
;
311 for (i
= 0; i
< width
; i
++) {
320 srcMask
= srcMask
>> 1;
328 dstMask
= dstMask
>> 1;
333 src
+= width_in_bytes
;
339 * Get indexes of color components for a basic color format, such as
340 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
344 get_component_indexes(GLenum format
,
349 GLint
*luminanceIndex
,
350 GLint
*intensityIndex
)
356 *luminanceIndex
= -1;
357 *intensityIndex
= -1;
361 case GL_LUMINANCE_INTEGER_EXT
:
364 case GL_LUMINANCE_ALPHA
:
365 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
373 case GL_RED_INTEGER_EXT
:
377 case GL_GREEN_INTEGER_EXT
:
381 case GL_BLUE_INTEGER_EXT
:
385 case GL_ALPHA_INTEGER_EXT
:
394 case GL_RGB_INTEGER_EXT
:
400 case GL_BGR_INTEGER_EXT
:
406 case GL_RGBA_INTEGER_EXT
:
413 case GL_BGRA_INTEGER
:
431 assert(0 && "bad format in get_component_indexes()");
438 * For small integer types, return the min and max possible values.
439 * Used for clamping floats to unscaled integer types.
440 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
443 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
450 case GL_UNSIGNED_BYTE
:
458 case GL_UNSIGNED_SHORT
:
470 * Used to pack an array [][4] of RGBA float colors as specified
471 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
472 * Historically, the RGBA values were in [0,1] and rescaled to fit
473 * into GLubytes, etc. But with new integer formats, the RGBA values
474 * may have any value and we don't always rescale when converting to
477 * Note: the rgba values will be modified by this function when any pixel
478 * transfer ops are enabled.
481 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
482 GLenum dstFormat
, GLenum dstType
,
484 const struct gl_pixelstore_attrib
*dstPacking
,
485 GLbitfield transferOps
)
488 const GLint comps
= _mesa_components_in_format(dstFormat
);
489 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
492 if (dstFormat
== GL_LUMINANCE
||
493 dstFormat
== GL_LUMINANCE_ALPHA
||
494 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
495 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
496 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
498 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
507 * This test should probably go away. Have the caller set/clear the
508 * IMAGE_CLAMP_BIT as needed.
510 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
512 /* need to clamp to [0, 1] */
513 transferOps
|= IMAGE_CLAMP_BIT
;
518 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
522 * Component clamping (besides clamping to [0,1] in
523 * _mesa_apply_rgba_transfer_ops()).
526 /* clamping to dest type's min/max values */
528 if (get_type_min_max(dstType
, &min
, &max
)) {
529 for (i
= 0; i
< n
; i
++) {
530 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
531 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
532 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
533 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
537 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
538 /* compute luminance values */
539 if (transferOps
& IMAGE_CLAMP_BIT
) {
540 for (i
= 0; i
< n
; i
++) {
541 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
542 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
546 for (i
= 0; i
< n
; i
++) {
547 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
553 * Pack/store the pixels. Ugh! Lots of cases!!!
556 case GL_UNSIGNED_BYTE
:
558 GLubyte
*dst
= (GLubyte
*) dstAddr
;
562 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
566 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
570 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
574 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
578 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
580 case GL_LUMINANCE_ALPHA
:
582 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
583 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
588 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
589 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
594 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
595 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
596 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
601 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
602 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
603 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
604 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
609 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
610 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
611 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
616 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
617 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
618 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
619 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
624 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
625 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
626 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
627 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
630 case GL_RED_INTEGER_EXT
:
632 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
635 case GL_GREEN_INTEGER_EXT
:
637 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
640 case GL_BLUE_INTEGER_EXT
:
642 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
645 case GL_ALPHA_INTEGER_EXT
:
647 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
650 case GL_RGB_INTEGER_EXT
:
652 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
653 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
654 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
657 case GL_RGBA_INTEGER_EXT
:
659 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
660 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
661 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
662 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
665 case GL_BGR_INTEGER_EXT
:
667 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
668 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
669 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
672 case GL_BGRA_INTEGER_EXT
:
674 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
675 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
676 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
677 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
680 case GL_LUMINANCE_INTEGER_EXT
:
682 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
685 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
688 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
690 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
698 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
699 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
703 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
709 GLbyte
*dst
= (GLbyte
*) dstAddr
;
713 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
717 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
721 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
725 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
729 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
731 case GL_LUMINANCE_ALPHA
:
733 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
734 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
739 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
740 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
745 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
746 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
747 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
752 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
753 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
754 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
755 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
760 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
761 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
762 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
767 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
768 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
769 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
770 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
775 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
776 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
777 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
778 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
781 case GL_RED_INTEGER_EXT
:
783 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
786 case GL_GREEN_INTEGER_EXT
:
788 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
791 case GL_BLUE_INTEGER_EXT
:
793 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
796 case GL_ALPHA_INTEGER_EXT
:
798 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
801 case GL_RGB_INTEGER_EXT
:
803 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
804 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
805 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
808 case GL_RGBA_INTEGER_EXT
:
810 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
811 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
812 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
813 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
816 case GL_BGR_INTEGER_EXT
:
818 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
819 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
820 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
823 case GL_BGRA_INTEGER_EXT
:
825 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
826 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
827 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
828 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
831 case GL_LUMINANCE_INTEGER_EXT
:
833 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
836 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
839 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
841 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
849 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
850 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
854 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
858 case GL_UNSIGNED_SHORT
:
860 GLushort
*dst
= (GLushort
*) dstAddr
;
864 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
868 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
872 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
876 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
880 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
882 case GL_LUMINANCE_ALPHA
:
884 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
885 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
890 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
891 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
896 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
897 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
898 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
903 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
904 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
905 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
906 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
911 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
912 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
913 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
920 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
921 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
926 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
927 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
928 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
929 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
932 case GL_RED_INTEGER_EXT
:
934 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
937 case GL_GREEN_INTEGER_EXT
:
939 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
942 case GL_BLUE_INTEGER_EXT
:
944 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
947 case GL_ALPHA_INTEGER_EXT
:
949 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
952 case GL_RGB_INTEGER_EXT
:
954 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
955 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
956 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
959 case GL_RGBA_INTEGER_EXT
:
961 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
962 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
963 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
964 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
967 case GL_BGR_INTEGER_EXT
:
969 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
970 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
971 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
974 case GL_BGRA_INTEGER_EXT
:
976 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
977 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
978 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
979 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
982 case GL_LUMINANCE_INTEGER_EXT
:
984 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
987 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
990 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
992 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1000 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1001 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1005 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1011 GLshort
*dst
= (GLshort
*) dstAddr
;
1012 switch (dstFormat
) {
1015 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1019 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1023 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1027 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1031 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1033 case GL_LUMINANCE_ALPHA
:
1035 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1036 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1041 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1042 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1047 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1048 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1049 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1054 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1055 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1056 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1057 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1062 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1063 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1064 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1069 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1070 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1071 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1072 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1077 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1078 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1079 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1080 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1083 case GL_RED_INTEGER_EXT
:
1085 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1088 case GL_GREEN_INTEGER_EXT
:
1090 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1093 case GL_BLUE_INTEGER_EXT
:
1095 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1098 case GL_ALPHA_INTEGER_EXT
:
1100 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1103 case GL_RGB_INTEGER_EXT
:
1105 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1106 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1107 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1110 case GL_RGBA_INTEGER_EXT
:
1112 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1113 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1114 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1115 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1118 case GL_BGR_INTEGER_EXT
:
1120 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1121 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1122 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1125 case GL_BGRA_INTEGER_EXT
:
1127 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1128 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1129 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1130 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1133 case GL_LUMINANCE_INTEGER_EXT
:
1135 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1138 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1141 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1143 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1151 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1152 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1156 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1160 case GL_UNSIGNED_INT
:
1162 GLuint
*dst
= (GLuint
*) dstAddr
;
1163 switch (dstFormat
) {
1166 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1170 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1174 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1178 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1182 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1184 case GL_LUMINANCE_ALPHA
:
1186 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1187 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1192 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1193 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1198 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1199 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1200 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1205 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1206 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1207 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1208 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1213 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1214 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1215 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1220 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1221 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1222 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1223 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1228 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1229 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1230 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1231 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1234 case GL_RED_INTEGER_EXT
:
1236 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1239 case GL_GREEN_INTEGER_EXT
:
1241 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1244 case GL_BLUE_INTEGER_EXT
:
1246 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1249 case GL_ALPHA_INTEGER_EXT
:
1251 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1254 case GL_RGB_INTEGER_EXT
:
1256 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1257 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1258 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1261 case GL_RGBA_INTEGER_EXT
:
1263 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1264 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1265 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1266 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1269 case GL_BGR_INTEGER_EXT
:
1271 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1272 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1273 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1276 case GL_BGRA_INTEGER_EXT
:
1278 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1279 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1280 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1281 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1284 case GL_LUMINANCE_INTEGER_EXT
:
1286 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1289 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1292 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1294 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1302 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1303 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1307 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1313 GLint
*dst
= (GLint
*) dstAddr
;
1314 switch (dstFormat
) {
1317 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1321 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1325 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1329 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1333 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1335 case GL_LUMINANCE_ALPHA
:
1337 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1338 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1343 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1344 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1349 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1350 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1351 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1356 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1357 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1358 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1359 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1364 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1365 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1366 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1371 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1372 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1373 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1374 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1379 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1380 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1381 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1382 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1388 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1389 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1392 case GL_RED_INTEGER_EXT
:
1394 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1397 case GL_GREEN_INTEGER_EXT
:
1399 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1402 case GL_BLUE_INTEGER_EXT
:
1404 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1407 case GL_ALPHA_INTEGER_EXT
:
1409 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1412 case GL_RGB_INTEGER_EXT
:
1414 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1415 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1416 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1419 case GL_RGBA_INTEGER_EXT
:
1421 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1422 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1423 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1424 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1427 case GL_BGR_INTEGER_EXT
:
1429 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1430 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1431 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1434 case GL_BGRA_INTEGER_EXT
:
1436 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1437 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1438 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1439 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1442 case GL_LUMINANCE_INTEGER_EXT
:
1444 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1447 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1450 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1452 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1458 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1464 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1465 switch (dstFormat
) {
1468 dst
[i
] = rgba
[i
][RCOMP
];
1472 dst
[i
] = rgba
[i
][GCOMP
];
1476 dst
[i
] = rgba
[i
][BCOMP
];
1480 dst
[i
] = rgba
[i
][ACOMP
];
1484 dst
[i
] = luminance
[i
];
1486 case GL_LUMINANCE_ALPHA
:
1488 dst
[i
*2+0] = luminance
[i
];
1489 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1494 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1495 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1500 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1501 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1502 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1507 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1508 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1509 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1510 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1515 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1516 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1517 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1522 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1523 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1524 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1525 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1530 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1531 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1532 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1533 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1539 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1540 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1544 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1548 case GL_HALF_FLOAT_ARB
:
1550 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1551 switch (dstFormat
) {
1554 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1558 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1562 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1566 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1570 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1572 case GL_LUMINANCE_ALPHA
:
1574 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1575 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1580 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1581 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1586 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1587 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1588 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1593 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1594 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1595 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1596 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1601 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1602 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1603 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1608 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1609 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1610 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1611 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1616 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1617 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1618 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1619 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1625 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1626 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1630 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1634 case GL_UNSIGNED_BYTE_3_3_2
:
1635 if (dstFormat
== GL_RGB
) {
1636 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1638 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1639 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1640 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1644 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1645 if (dstFormat
== GL_RGB
) {
1646 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1648 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1649 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1650 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1654 case GL_UNSIGNED_SHORT_5_6_5
:
1655 if (dstFormat
== GL_RGB
) {
1656 GLushort
*dst
= (GLushort
*) dstAddr
;
1658 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1659 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1660 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1664 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1665 if (dstFormat
== GL_RGB
) {
1666 GLushort
*dst
= (GLushort
*) dstAddr
;
1668 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1669 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1670 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1674 case GL_UNSIGNED_SHORT_4_4_4_4
:
1675 if (dstFormat
== GL_RGBA
) {
1676 GLushort
*dst
= (GLushort
*) dstAddr
;
1678 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1679 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1680 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1681 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1684 else if (dstFormat
== GL_BGRA
) {
1685 GLushort
*dst
= (GLushort
*) dstAddr
;
1687 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1688 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1689 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1690 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1693 else if (dstFormat
== GL_ABGR_EXT
) {
1694 GLushort
*dst
= (GLushort
*) dstAddr
;
1696 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1697 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1698 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1699 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1703 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1704 if (dstFormat
== GL_RGBA
) {
1705 GLushort
*dst
= (GLushort
*) dstAddr
;
1707 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1708 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1709 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1710 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1713 else if (dstFormat
== GL_BGRA
) {
1714 GLushort
*dst
= (GLushort
*) dstAddr
;
1716 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1717 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1718 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1719 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1722 else if (dstFormat
== GL_ABGR_EXT
) {
1723 GLushort
*dst
= (GLushort
*) dstAddr
;
1725 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1726 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1727 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1728 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1732 case GL_UNSIGNED_SHORT_5_5_5_1
:
1733 if (dstFormat
== GL_RGBA
) {
1734 GLushort
*dst
= (GLushort
*) dstAddr
;
1736 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1737 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1738 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1739 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1742 else if (dstFormat
== GL_BGRA
) {
1743 GLushort
*dst
= (GLushort
*) dstAddr
;
1745 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1746 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1747 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1748 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1751 else if (dstFormat
== GL_ABGR_EXT
) {
1752 GLushort
*dst
= (GLushort
*) dstAddr
;
1754 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1755 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1756 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1757 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1761 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1762 if (dstFormat
== GL_RGBA
) {
1763 GLushort
*dst
= (GLushort
*) dstAddr
;
1765 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1766 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1767 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1768 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1771 else if (dstFormat
== GL_BGRA
) {
1772 GLushort
*dst
= (GLushort
*) dstAddr
;
1774 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1775 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1776 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1777 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1780 else if (dstFormat
== GL_ABGR_EXT
) {
1781 GLushort
*dst
= (GLushort
*) dstAddr
;
1783 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1784 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1785 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1786 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1790 case GL_UNSIGNED_INT_8_8_8_8
:
1791 if (dstFormat
== GL_RGBA
) {
1792 GLuint
*dst
= (GLuint
*) dstAddr
;
1794 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1795 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1796 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1797 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1800 else if (dstFormat
== GL_BGRA
) {
1801 GLuint
*dst
= (GLuint
*) dstAddr
;
1803 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1804 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1805 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1806 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1809 else if (dstFormat
== GL_ABGR_EXT
) {
1810 GLuint
*dst
= (GLuint
*) dstAddr
;
1812 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1813 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1814 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1815 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1819 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1820 if (dstFormat
== GL_RGBA
) {
1821 GLuint
*dst
= (GLuint
*) dstAddr
;
1823 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1824 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1825 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1826 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1829 else if (dstFormat
== GL_BGRA
) {
1830 GLuint
*dst
= (GLuint
*) dstAddr
;
1832 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1833 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1834 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1835 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1838 else if (dstFormat
== GL_ABGR_EXT
) {
1839 GLuint
*dst
= (GLuint
*) dstAddr
;
1841 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1842 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1843 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1844 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1848 case GL_UNSIGNED_INT_10_10_10_2
:
1849 if (dstFormat
== GL_RGBA
) {
1850 GLuint
*dst
= (GLuint
*) dstAddr
;
1852 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1853 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1854 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1855 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1858 else if (dstFormat
== GL_BGRA
) {
1859 GLuint
*dst
= (GLuint
*) dstAddr
;
1861 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1862 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1863 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1864 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1867 else if (dstFormat
== GL_ABGR_EXT
) {
1868 GLuint
*dst
= (GLuint
*) dstAddr
;
1870 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1871 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1872 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1873 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1877 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1878 if (dstFormat
== GL_RGBA
) {
1879 GLuint
*dst
= (GLuint
*) dstAddr
;
1881 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1882 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1883 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1884 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1887 else if (dstFormat
== GL_BGRA
) {
1888 GLuint
*dst
= (GLuint
*) dstAddr
;
1890 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1891 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1892 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1893 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1896 else if (dstFormat
== GL_ABGR_EXT
) {
1897 GLuint
*dst
= (GLuint
*) dstAddr
;
1899 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1900 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1901 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1902 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1907 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1911 if (dstPacking
->SwapBytes
) {
1912 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1913 if (swapSize
== 2) {
1914 if (dstPacking
->SwapBytes
) {
1915 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1918 else if (swapSize
== 4) {
1919 if (dstPacking
->SwapBytes
) {
1920 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1930 #define SWAP2BYTE(VALUE) \
1932 GLubyte *bytes = (GLubyte *) &(VALUE); \
1933 GLubyte tmp = bytes[0]; \
1934 bytes[0] = bytes[1]; \
1938 #define SWAP4BYTE(VALUE) \
1940 GLubyte *bytes = (GLubyte *) &(VALUE); \
1941 GLubyte tmp = bytes[0]; \
1942 bytes[0] = bytes[3]; \
1945 bytes[1] = bytes[2]; \
1951 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1952 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1953 const struct gl_pixelstore_attrib
*unpack
)
1955 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1957 ASSERT(srcType
== GL_BITMAP
||
1958 srcType
== GL_UNSIGNED_BYTE
||
1959 srcType
== GL_BYTE
||
1960 srcType
== GL_UNSIGNED_SHORT
||
1961 srcType
== GL_SHORT
||
1962 srcType
== GL_UNSIGNED_INT
||
1963 srcType
== GL_INT
||
1964 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1965 srcType
== GL_HALF_FLOAT_ARB
||
1966 srcType
== GL_FLOAT
);
1971 GLubyte
*ubsrc
= (GLubyte
*) src
;
1972 if (unpack
->LsbFirst
) {
1973 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1975 for (i
= 0; i
< n
; i
++) {
1976 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1987 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1989 for (i
= 0; i
< n
; i
++) {
1990 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2002 case GL_UNSIGNED_BYTE
:
2005 const GLubyte
*s
= (const GLubyte
*) src
;
2006 for (i
= 0; i
< n
; i
++)
2013 const GLbyte
*s
= (const GLbyte
*) src
;
2014 for (i
= 0; i
< n
; i
++)
2018 case GL_UNSIGNED_SHORT
:
2021 const GLushort
*s
= (const GLushort
*) src
;
2022 if (unpack
->SwapBytes
) {
2023 for (i
= 0; i
< n
; i
++) {
2024 GLushort value
= s
[i
];
2030 for (i
= 0; i
< n
; i
++)
2038 const GLshort
*s
= (const GLshort
*) src
;
2039 if (unpack
->SwapBytes
) {
2040 for (i
= 0; i
< n
; i
++) {
2041 GLshort value
= s
[i
];
2047 for (i
= 0; i
< n
; i
++)
2052 case GL_UNSIGNED_INT
:
2055 const GLuint
*s
= (const GLuint
*) src
;
2056 if (unpack
->SwapBytes
) {
2057 for (i
= 0; i
< n
; i
++) {
2058 GLuint value
= s
[i
];
2064 for (i
= 0; i
< n
; i
++)
2072 const GLint
*s
= (const GLint
*) src
;
2073 if (unpack
->SwapBytes
) {
2074 for (i
= 0; i
< n
; i
++) {
2081 for (i
= 0; i
< n
; i
++)
2089 const GLfloat
*s
= (const GLfloat
*) src
;
2090 if (unpack
->SwapBytes
) {
2091 for (i
= 0; i
< n
; i
++) {
2092 GLfloat value
= s
[i
];
2094 indexes
[i
] = (GLuint
) value
;
2098 for (i
= 0; i
< n
; i
++)
2099 indexes
[i
] = (GLuint
) s
[i
];
2103 case GL_HALF_FLOAT_ARB
:
2106 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2107 if (unpack
->SwapBytes
) {
2108 for (i
= 0; i
< n
; i
++) {
2109 GLhalfARB value
= s
[i
];
2111 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2115 for (i
= 0; i
< n
; i
++)
2116 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2120 case GL_UNSIGNED_INT_24_8_EXT
:
2123 const GLuint
*s
= (const GLuint
*) src
;
2124 if (unpack
->SwapBytes
) {
2125 for (i
= 0; i
< n
; i
++) {
2126 GLuint value
= s
[i
];
2128 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2132 for (i
= 0; i
< n
; i
++)
2133 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2139 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2146 * Return source/dest RGBA indexes for unpacking pixels.
2149 get_component_mapping(GLenum format
,
2161 case GL_RED_INTEGER_EXT
:
2163 *gSrc
= *bSrc
= *aSrc
= -1;
2166 case GL_GREEN_INTEGER_EXT
:
2168 *rSrc
= *bSrc
= *aSrc
= -1;
2171 case GL_BLUE_INTEGER_EXT
:
2173 *rSrc
= *gSrc
= *aSrc
= -1;
2176 case GL_ALPHA_INTEGER_EXT
:
2177 *rSrc
= *gSrc
= *bSrc
= -1;
2181 case GL_LUMINANCE_INTEGER_EXT
:
2182 *rSrc
= *gSrc
= *bSrc
= 0;
2185 case GL_LUMINANCE_ALPHA
:
2186 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2187 *rSrc
= *gSrc
= *bSrc
= 0;
2191 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2205 case GL_RGB_INTEGER
:
2226 case GL_RGBA_INTEGER
:
2264 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2265 _mesa_lookup_enum_by_nr(format
));
2273 * This function extracts floating point RGBA values from arbitrary
2274 * image data. srcFormat and srcType are the format and type parameters
2275 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2277 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2278 * implements the "Conversion to floating point", "Conversion to RGB",
2279 * and "Final Expansion to RGBA" operations.
2281 * Args: n - number of pixels
2282 * rgba - output colors
2283 * srcFormat - format of incoming data
2284 * srcType - data type of incoming data
2285 * src - source data pointer
2286 * swapBytes - perform byteswapping of incoming data?
2289 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2290 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2291 GLboolean swapBytes
)
2293 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2295 GLint rDst
, bDst
, gDst
, aDst
;
2296 GLboolean intFormat
;
2297 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2299 ASSERT(srcFormat
== GL_RED
||
2300 srcFormat
== GL_GREEN
||
2301 srcFormat
== GL_BLUE
||
2302 srcFormat
== GL_ALPHA
||
2303 srcFormat
== GL_LUMINANCE
||
2304 srcFormat
== GL_LUMINANCE_ALPHA
||
2305 srcFormat
== GL_INTENSITY
||
2306 srcFormat
== GL_RG
||
2307 srcFormat
== GL_RGB
||
2308 srcFormat
== GL_BGR
||
2309 srcFormat
== GL_RGBA
||
2310 srcFormat
== GL_BGRA
||
2311 srcFormat
== GL_ABGR_EXT
||
2312 srcFormat
== GL_DU8DV8_ATI
||
2313 srcFormat
== GL_DUDV_ATI
||
2314 srcFormat
== GL_RED_INTEGER_EXT
||
2315 srcFormat
== GL_GREEN_INTEGER_EXT
||
2316 srcFormat
== GL_BLUE_INTEGER_EXT
||
2317 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2318 srcFormat
== GL_RGB_INTEGER_EXT
||
2319 srcFormat
== GL_RGBA_INTEGER_EXT
||
2320 srcFormat
== GL_BGR_INTEGER_EXT
||
2321 srcFormat
== GL_BGRA_INTEGER_EXT
||
2322 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2323 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2325 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2326 srcType
== GL_BYTE
||
2327 srcType
== GL_UNSIGNED_SHORT
||
2328 srcType
== GL_SHORT
||
2329 srcType
== GL_UNSIGNED_INT
||
2330 srcType
== GL_INT
||
2331 srcType
== GL_HALF_FLOAT_ARB
||
2332 srcType
== GL_FLOAT
||
2333 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2334 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2335 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2336 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2337 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2338 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2339 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2340 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2341 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2342 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2343 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2344 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2346 get_component_mapping(srcFormat
,
2347 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2348 &rDst
, &gDst
, &bDst
, &aDst
);
2350 stride
= _mesa_components_in_format(srcFormat
);
2352 intFormat
= _mesa_is_integer_format(srcFormat
);
2354 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2355 if ((SRC_INDEX) < 0) { \
2358 for (i = 0; i < n; i++) { \
2359 rgba[i][DST_INDEX] = DEFAULT_INT; \
2363 for (i = 0; i < n; i++) { \
2364 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2368 else if (swapBytes) { \
2369 const TYPE *s = (const TYPE *) src; \
2371 for (i = 0; i < n; i++) { \
2372 TYPE value = s[SRC_INDEX]; \
2373 if (sizeof(TYPE) == 2) { \
2376 else if (sizeof(TYPE) == 4) { \
2380 rgba[i][DST_INDEX] = (GLfloat) value; \
2382 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2387 const TYPE *s = (const TYPE *) src; \
2390 for (i = 0; i < n; i++) { \
2391 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2396 for (i = 0; i < n; i++) { \
2397 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2404 case GL_UNSIGNED_BYTE
:
2405 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2406 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2407 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2408 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2411 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2412 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2413 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2414 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2416 case GL_UNSIGNED_SHORT
:
2417 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2418 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2419 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2420 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2423 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2424 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2425 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2426 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2428 case GL_UNSIGNED_INT
:
2429 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2430 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2431 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2432 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2435 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2436 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2437 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2438 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2441 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2442 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2443 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2444 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2446 case GL_HALF_FLOAT_ARB
:
2447 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2448 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2449 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2450 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2452 case GL_UNSIGNED_BYTE_3_3_2
:
2454 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2461 for (i
= 0; i
< n
; i
++) {
2462 GLubyte p
= ubsrc
[i
];
2463 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2464 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2465 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2466 rgba
[i
][aDst
] = 1.0F
;
2470 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2472 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2479 for (i
= 0; i
< n
; i
++) {
2480 GLubyte p
= ubsrc
[i
];
2481 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2482 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2483 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2484 rgba
[i
][aDst
] = 1.0F
;
2488 case GL_UNSIGNED_SHORT_5_6_5
:
2495 const GLushort
*ussrc
= (const GLushort
*) src
;
2497 for (i
= 0; i
< n
; i
++) {
2498 GLushort p
= ussrc
[i
];
2500 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2501 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2502 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2503 rgba
[i
][aDst
] = 1.0F
;
2507 const GLushort
*ussrc
= (const GLushort
*) src
;
2509 for (i
= 0; i
< n
; i
++) {
2510 GLushort p
= ussrc
[i
];
2511 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2512 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2513 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2514 rgba
[i
][aDst
] = 1.0F
;
2518 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2525 const GLushort
*ussrc
= (const GLushort
*) src
;
2527 for (i
= 0; i
< n
; i
++) {
2528 GLushort p
= ussrc
[i
];
2530 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2531 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2532 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2533 rgba
[i
][aDst
] = 1.0F
;
2537 const GLushort
*ussrc
= (const GLushort
*) src
;
2539 for (i
= 0; i
< n
; i
++) {
2540 GLushort p
= ussrc
[i
];
2541 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2542 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2543 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2544 rgba
[i
][aDst
] = 1.0F
;
2548 case GL_UNSIGNED_SHORT_4_4_4_4
:
2550 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2553 const GLushort
*ussrc
= (const GLushort
*) src
;
2555 for (i
= 0; i
< n
; i
++) {
2556 GLushort p
= ussrc
[i
];
2558 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2559 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2560 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2561 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2565 const GLushort
*ussrc
= (const GLushort
*) src
;
2567 for (i
= 0; i
< n
; i
++) {
2568 GLushort p
= ussrc
[i
];
2569 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2570 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2571 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2572 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2576 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2578 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2581 const GLushort
*ussrc
= (const GLushort
*) src
;
2583 for (i
= 0; i
< n
; i
++) {
2584 GLushort p
= ussrc
[i
];
2586 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2587 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2588 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2589 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2593 const GLushort
*ussrc
= (const GLushort
*) src
;
2595 for (i
= 0; i
< n
; i
++) {
2596 GLushort p
= ussrc
[i
];
2597 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2598 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2599 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2600 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2604 case GL_UNSIGNED_SHORT_5_5_5_1
:
2606 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2609 const GLushort
*ussrc
= (const GLushort
*) src
;
2611 for (i
= 0; i
< n
; i
++) {
2612 GLushort p
= ussrc
[i
];
2614 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2615 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2616 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2617 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2621 const GLushort
*ussrc
= (const GLushort
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLushort p
= ussrc
[i
];
2625 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2626 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2627 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2628 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2632 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2634 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2637 const GLushort
*ussrc
= (const GLushort
*) src
;
2639 for (i
= 0; i
< n
; i
++) {
2640 GLushort p
= ussrc
[i
];
2642 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2643 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2644 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2645 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2649 const GLushort
*ussrc
= (const GLushort
*) src
;
2651 for (i
= 0; i
< n
; i
++) {
2652 GLushort p
= ussrc
[i
];
2653 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2654 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2655 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2656 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2660 case GL_UNSIGNED_INT_8_8_8_8
:
2662 const GLuint
*uisrc
= (const GLuint
*) src
;
2665 for (i
= 0; i
< n
; i
++) {
2666 GLuint p
= uisrc
[i
];
2667 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2668 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2669 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2670 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2674 for (i
= 0; i
< n
; i
++) {
2675 GLuint p
= uisrc
[i
];
2676 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2677 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2678 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2679 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2684 const GLuint
*uisrc
= (const GLuint
*) src
;
2687 for (i
= 0; i
< n
; i
++) {
2688 GLuint p
= uisrc
[i
];
2689 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2690 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2691 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2692 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2696 for (i
= 0; i
< n
; i
++) {
2697 GLuint p
= uisrc
[i
];
2698 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2699 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2700 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2701 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2706 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2708 const GLuint
*uisrc
= (const GLuint
*) src
;
2711 for (i
= 0; i
< n
; i
++) {
2712 GLuint p
= uisrc
[i
];
2713 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2714 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2715 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2716 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2720 for (i
= 0; i
< n
; i
++) {
2721 GLuint p
= uisrc
[i
];
2722 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2723 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2724 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2725 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2730 const GLuint
*uisrc
= (const GLuint
*) src
;
2733 for (i
= 0; i
< n
; i
++) {
2734 GLuint p
= uisrc
[i
];
2735 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2736 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2737 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2738 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2742 for (i
= 0; i
< n
; i
++) {
2743 GLuint p
= uisrc
[i
];
2744 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2745 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2746 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2747 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2752 case GL_UNSIGNED_INT_10_10_10_2
:
2754 rs
= 1.0F
/ 1023.0F
;
2755 gs
= 1.0F
/ 1023.0F
;
2756 bs
= 1.0F
/ 1023.0F
;
2760 const GLuint
*uisrc
= (const GLuint
*) src
;
2762 for (i
= 0; i
< n
; i
++) {
2763 GLuint p
= uisrc
[i
];
2765 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2766 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2767 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2768 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2772 const GLuint
*uisrc
= (const GLuint
*) src
;
2774 for (i
= 0; i
< n
; i
++) {
2775 GLuint p
= uisrc
[i
];
2776 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2777 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2778 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2779 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2783 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2785 rs
= 1.0F
/ 1023.0F
;
2786 gs
= 1.0F
/ 1023.0F
;
2787 bs
= 1.0F
/ 1023.0F
;
2791 const GLuint
*uisrc
= (const GLuint
*) src
;
2793 for (i
= 0; i
< n
; i
++) {
2794 GLuint p
= uisrc
[i
];
2796 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2797 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2798 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2799 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2803 const GLuint
*uisrc
= (const GLuint
*) src
;
2805 for (i
= 0; i
< n
; i
++) {
2806 GLuint p
= uisrc
[i
];
2807 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2808 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2809 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2810 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2815 _mesa_problem(NULL
, "bad srcType in extract float data");
2822 static INLINE GLuint
2823 clamp_byte_to_uint(GLbyte b
)
2825 return b
< 0 ? 0 : b
;
2829 static INLINE GLuint
2830 clamp_short_to_uint(GLshort s
)
2832 return s
< 0 ? 0 : s
;
2836 static INLINE GLuint
2837 clamp_int_to_uint(GLint i
)
2839 return i
< 0 ? 0 : i
;
2843 static INLINE GLuint
2844 clamp_float_to_uint(GLfloat f
)
2846 return f
< 0.0F
? 0 : IROUND(f
);
2850 static INLINE GLuint
2851 clamp_half_to_uint(GLhalfARB h
)
2853 GLfloat f
= _mesa_half_to_float(h
);
2854 return f
< 0.0F
? 0 : IROUND(f
);
2859 * \sa extract_float_rgba()
2862 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2863 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2864 GLboolean swapBytes
)
2866 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2868 GLint rDst
, bDst
, gDst
, aDst
;
2869 GLboolean intFormat
;
2871 ASSERT(srcFormat
== GL_RED
||
2872 srcFormat
== GL_GREEN
||
2873 srcFormat
== GL_BLUE
||
2874 srcFormat
== GL_ALPHA
||
2875 srcFormat
== GL_LUMINANCE
||
2876 srcFormat
== GL_LUMINANCE_ALPHA
||
2877 srcFormat
== GL_INTENSITY
||
2878 srcFormat
== GL_RG
||
2879 srcFormat
== GL_RGB
||
2880 srcFormat
== GL_BGR
||
2881 srcFormat
== GL_RGBA
||
2882 srcFormat
== GL_BGRA
||
2883 srcFormat
== GL_ABGR_EXT
||
2884 srcFormat
== GL_DU8DV8_ATI
||
2885 srcFormat
== GL_DUDV_ATI
||
2886 srcFormat
== GL_RED_INTEGER_EXT
||
2887 srcFormat
== GL_GREEN_INTEGER_EXT
||
2888 srcFormat
== GL_BLUE_INTEGER_EXT
||
2889 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2890 srcFormat
== GL_RGB_INTEGER_EXT
||
2891 srcFormat
== GL_RGBA_INTEGER_EXT
||
2892 srcFormat
== GL_BGR_INTEGER_EXT
||
2893 srcFormat
== GL_BGRA_INTEGER_EXT
||
2894 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2895 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2897 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2898 srcType
== GL_BYTE
||
2899 srcType
== GL_UNSIGNED_SHORT
||
2900 srcType
== GL_SHORT
||
2901 srcType
== GL_UNSIGNED_INT
||
2902 srcType
== GL_INT
||
2903 srcType
== GL_HALF_FLOAT_ARB
||
2904 srcType
== GL_FLOAT
||
2905 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2906 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2907 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2908 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2909 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2910 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2911 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2912 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2913 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2914 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2915 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2916 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2918 get_component_mapping(srcFormat
,
2919 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2920 &rDst
, &gDst
, &bDst
, &aDst
);
2922 stride
= _mesa_components_in_format(srcFormat
);
2924 intFormat
= _mesa_is_integer_format(srcFormat
);
2926 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2927 if ((SRC_INDEX) < 0) { \
2929 for (i = 0; i < n; i++) { \
2930 rgba[i][DST_INDEX] = DEFAULT; \
2933 else if (swapBytes) { \
2934 const TYPE *s = (const TYPE *) src; \
2936 for (i = 0; i < n; i++) { \
2937 TYPE value = s[SRC_INDEX]; \
2938 if (sizeof(TYPE) == 2) { \
2941 else if (sizeof(TYPE) == 4) { \
2944 rgba[i][DST_INDEX] = CONVERSION(value); \
2949 const TYPE *s = (const TYPE *) src; \
2951 for (i = 0; i < n; i++) { \
2952 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2958 case GL_UNSIGNED_BYTE
:
2959 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2960 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2961 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2962 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2965 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2966 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2967 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2968 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2970 case GL_UNSIGNED_SHORT
:
2971 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2972 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2973 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2974 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2977 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2978 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2979 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2980 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2982 case GL_UNSIGNED_INT
:
2983 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2984 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2985 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2986 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2989 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2990 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2991 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2992 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2995 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2996 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2997 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2998 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3000 case GL_HALF_FLOAT_ARB
:
3001 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3002 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3003 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3004 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3006 case GL_UNSIGNED_BYTE_3_3_2
:
3008 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3010 for (i
= 0; i
< n
; i
++) {
3011 GLubyte p
= ubsrc
[i
];
3012 rgba
[i
][rDst
] = ((p
>> 5) );
3013 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3014 rgba
[i
][bDst
] = ((p
) & 0x3);
3019 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3021 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3023 for (i
= 0; i
< n
; i
++) {
3024 GLubyte p
= ubsrc
[i
];
3025 rgba
[i
][rDst
] = ((p
) & 0x7);
3026 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3027 rgba
[i
][bDst
] = ((p
>> 6) );
3032 case GL_UNSIGNED_SHORT_5_6_5
:
3034 const GLushort
*ussrc
= (const GLushort
*) src
;
3036 for (i
= 0; i
< n
; i
++) {
3037 GLushort p
= ussrc
[i
];
3039 rgba
[i
][rDst
] = ((p
>> 11) );
3040 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3041 rgba
[i
][bDst
] = ((p
) & 0x1f);
3046 const GLushort
*ussrc
= (const GLushort
*) src
;
3048 for (i
= 0; i
< n
; i
++) {
3049 GLushort p
= ussrc
[i
];
3050 rgba
[i
][rDst
] = ((p
>> 11) );
3051 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3052 rgba
[i
][bDst
] = ((p
) & 0x1f);
3057 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3059 const GLushort
*ussrc
= (const GLushort
*) src
;
3061 for (i
= 0; i
< n
; i
++) {
3062 GLushort p
= ussrc
[i
];
3064 rgba
[i
][rDst
] = ((p
) & 0x1f);
3065 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3066 rgba
[i
][bDst
] = ((p
>> 11) );
3071 const GLushort
*ussrc
= (const GLushort
*) src
;
3073 for (i
= 0; i
< n
; i
++) {
3074 GLushort p
= ussrc
[i
];
3075 rgba
[i
][rDst
] = ((p
) & 0x1f);
3076 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3077 rgba
[i
][bDst
] = ((p
>> 11) );
3082 case GL_UNSIGNED_SHORT_4_4_4_4
:
3084 const GLushort
*ussrc
= (const GLushort
*) src
;
3086 for (i
= 0; i
< n
; i
++) {
3087 GLushort p
= ussrc
[i
];
3089 rgba
[i
][rDst
] = ((p
>> 12) );
3090 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3091 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3092 rgba
[i
][aDst
] = ((p
) & 0xf);
3096 const GLushort
*ussrc
= (const GLushort
*) src
;
3098 for (i
= 0; i
< n
; i
++) {
3099 GLushort p
= ussrc
[i
];
3100 rgba
[i
][rDst
] = ((p
>> 12) );
3101 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3102 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3103 rgba
[i
][aDst
] = ((p
) & 0xf);
3107 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3109 const GLushort
*ussrc
= (const GLushort
*) src
;
3111 for (i
= 0; i
< n
; i
++) {
3112 GLushort p
= ussrc
[i
];
3114 rgba
[i
][rDst
] = ((p
) & 0xf);
3115 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3116 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3117 rgba
[i
][aDst
] = ((p
>> 12) );
3121 const GLushort
*ussrc
= (const GLushort
*) src
;
3123 for (i
= 0; i
< n
; i
++) {
3124 GLushort p
= ussrc
[i
];
3125 rgba
[i
][rDst
] = ((p
) & 0xf);
3126 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3127 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3128 rgba
[i
][aDst
] = ((p
>> 12) );
3132 case GL_UNSIGNED_SHORT_5_5_5_1
:
3134 const GLushort
*ussrc
= (const GLushort
*) src
;
3136 for (i
= 0; i
< n
; i
++) {
3137 GLushort p
= ussrc
[i
];
3139 rgba
[i
][rDst
] = ((p
>> 11) );
3140 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3141 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3142 rgba
[i
][aDst
] = ((p
) & 0x1 );
3146 const GLushort
*ussrc
= (const GLushort
*) src
;
3148 for (i
= 0; i
< n
; i
++) {
3149 GLushort p
= ussrc
[i
];
3150 rgba
[i
][rDst
] = ((p
>> 11) );
3151 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3152 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3153 rgba
[i
][aDst
] = ((p
) & 0x1 );
3157 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3159 const GLushort
*ussrc
= (const GLushort
*) src
;
3161 for (i
= 0; i
< n
; i
++) {
3162 GLushort p
= ussrc
[i
];
3164 rgba
[i
][rDst
] = ((p
) & 0x1f);
3165 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3166 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3167 rgba
[i
][aDst
] = ((p
>> 15) );
3171 const GLushort
*ussrc
= (const GLushort
*) src
;
3173 for (i
= 0; i
< n
; i
++) {
3174 GLushort p
= ussrc
[i
];
3175 rgba
[i
][rDst
] = ((p
) & 0x1f);
3176 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3177 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3178 rgba
[i
][aDst
] = ((p
>> 15) );
3182 case GL_UNSIGNED_INT_8_8_8_8
:
3184 const GLuint
*uisrc
= (const GLuint
*) src
;
3186 for (i
= 0; i
< n
; i
++) {
3187 GLuint p
= uisrc
[i
];
3188 rgba
[i
][rDst
] = ((p
) & 0xff);
3189 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3190 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3191 rgba
[i
][aDst
] = ((p
>> 24) );
3195 const GLuint
*uisrc
= (const GLuint
*) src
;
3197 for (i
= 0; i
< n
; i
++) {
3198 GLuint p
= uisrc
[i
];
3199 rgba
[i
][rDst
] = ((p
>> 24) );
3200 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3201 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3202 rgba
[i
][aDst
] = ((p
) & 0xff);
3206 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3208 const GLuint
*uisrc
= (const GLuint
*) src
;
3210 for (i
= 0; i
< n
; i
++) {
3211 GLuint p
= uisrc
[i
];
3212 rgba
[i
][rDst
] = ((p
>> 24) );
3213 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3214 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3215 rgba
[i
][aDst
] = ((p
) & 0xff);
3219 const GLuint
*uisrc
= (const GLuint
*) src
;
3221 for (i
= 0; i
< n
; i
++) {
3222 GLuint p
= uisrc
[i
];
3223 rgba
[i
][rDst
] = ((p
) & 0xff);
3224 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3225 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3226 rgba
[i
][aDst
] = ((p
>> 24) );
3230 case GL_UNSIGNED_INT_10_10_10_2
:
3232 const GLuint
*uisrc
= (const GLuint
*) src
;
3234 for (i
= 0; i
< n
; i
++) {
3235 GLuint p
= uisrc
[i
];
3237 rgba
[i
][rDst
] = ((p
>> 22) );
3238 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3239 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3240 rgba
[i
][aDst
] = ((p
) & 0x3 );
3244 const GLuint
*uisrc
= (const GLuint
*) src
;
3246 for (i
= 0; i
< n
; i
++) {
3247 GLuint p
= uisrc
[i
];
3248 rgba
[i
][rDst
] = ((p
>> 22) );
3249 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3250 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3251 rgba
[i
][aDst
] = ((p
) & 0x3 );
3255 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3257 const GLuint
*uisrc
= (const GLuint
*) src
;
3259 for (i
= 0; i
< n
; i
++) {
3260 GLuint p
= uisrc
[i
];
3262 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3263 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3264 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3265 rgba
[i
][aDst
] = ((p
>> 30) );
3269 const GLuint
*uisrc
= (const GLuint
*) src
;
3271 for (i
= 0; i
< n
; i
++) {
3272 GLuint p
= uisrc
[i
];
3273 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3274 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3275 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3276 rgba
[i
][aDst
] = ((p
>> 30) );
3281 _mesa_problem(NULL
, "bad srcType in extract uint data");
3290 * Unpack a row of color image data from a client buffer according to
3291 * the pixel unpacking parameters.
3292 * Return GLchan values in the specified dest image format.
3293 * This is used by glDrawPixels and glTexImage?D().
3294 * \param ctx - the context
3295 * n - number of pixels in the span
3296 * dstFormat - format of destination color array
3297 * dest - the destination color array
3298 * srcFormat - source image format
3299 * srcType - source image data type
3300 * source - source image pointer
3301 * srcPacking - pixel unpacking parameters
3302 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3304 * XXX perhaps expand this to process whole images someday.
3307 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3308 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3309 GLenum srcFormat
, GLenum srcType
,
3310 const GLvoid
*source
,
3311 const struct gl_pixelstore_attrib
*srcPacking
,
3312 GLbitfield transferOps
)
3314 ASSERT(dstFormat
== GL_ALPHA
||
3315 dstFormat
== GL_LUMINANCE
||
3316 dstFormat
== GL_LUMINANCE_ALPHA
||
3317 dstFormat
== GL_INTENSITY
||
3318 dstFormat
== GL_RED
||
3319 dstFormat
== GL_RG
||
3320 dstFormat
== GL_RGB
||
3321 dstFormat
== GL_RGBA
||
3322 dstFormat
== GL_COLOR_INDEX
);
3324 ASSERT(srcFormat
== GL_RED
||
3325 srcFormat
== GL_GREEN
||
3326 srcFormat
== GL_BLUE
||
3327 srcFormat
== GL_ALPHA
||
3328 srcFormat
== GL_LUMINANCE
||
3329 srcFormat
== GL_LUMINANCE_ALPHA
||
3330 srcFormat
== GL_INTENSITY
||
3331 srcFormat
== GL_RG
||
3332 srcFormat
== GL_RGB
||
3333 srcFormat
== GL_BGR
||
3334 srcFormat
== GL_RGBA
||
3335 srcFormat
== GL_BGRA
||
3336 srcFormat
== GL_ABGR_EXT
||
3337 srcFormat
== GL_COLOR_INDEX
);
3339 ASSERT(srcType
== GL_BITMAP
||
3340 srcType
== GL_UNSIGNED_BYTE
||
3341 srcType
== GL_BYTE
||
3342 srcType
== GL_UNSIGNED_SHORT
||
3343 srcType
== GL_SHORT
||
3344 srcType
== GL_UNSIGNED_INT
||
3345 srcType
== GL_INT
||
3346 srcType
== GL_HALF_FLOAT_ARB
||
3347 srcType
== GL_FLOAT
||
3348 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3349 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3350 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3351 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3352 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3353 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3354 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3355 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3356 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3357 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3358 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3359 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3361 /* Try simple cases first */
3362 if (transferOps
== 0) {
3363 if (srcType
== CHAN_TYPE
) {
3364 if (dstFormat
== GL_RGBA
) {
3365 if (srcFormat
== GL_RGBA
) {
3366 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3369 else if (srcFormat
== GL_RGB
) {
3371 const GLchan
*src
= (const GLchan
*) source
;
3373 for (i
= 0; i
< n
; i
++) {
3384 else if (dstFormat
== GL_RGB
) {
3385 if (srcFormat
== GL_RGB
) {
3386 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3389 else if (srcFormat
== GL_RGBA
) {
3391 const GLchan
*src
= (const GLchan
*) source
;
3393 for (i
= 0; i
< n
; i
++) {
3403 else if (dstFormat
== srcFormat
) {
3404 GLint comps
= _mesa_components_in_format(srcFormat
);
3406 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3411 * Common situation, loading 8bit RGBA/RGB source images
3412 * into 16/32 bit destination. (OSMesa16/32)
3414 else if (srcType
== GL_UNSIGNED_BYTE
) {
3415 if (dstFormat
== GL_RGBA
) {
3416 if (srcFormat
== GL_RGB
) {
3418 const GLubyte
*src
= (const GLubyte
*) source
;
3420 for (i
= 0; i
< n
; i
++) {
3421 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3422 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3423 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3430 else if (srcFormat
== GL_RGBA
) {
3432 const GLubyte
*src
= (const GLubyte
*) source
;
3434 for (i
= 0; i
< n
; i
++) {
3435 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3436 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3437 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3438 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3445 else if (dstFormat
== GL_RGB
) {
3446 if (srcFormat
== GL_RGB
) {
3448 const GLubyte
*src
= (const GLubyte
*) source
;
3450 for (i
= 0; i
< n
; i
++) {
3451 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3452 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3453 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3459 else if (srcFormat
== GL_RGBA
) {
3461 const GLubyte
*src
= (const GLubyte
*) source
;
3463 for (i
= 0; i
< n
; i
++) {
3464 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3465 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3466 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3477 /* general solution begins here */
3479 GLint dstComponents
;
3480 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3481 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3484 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3488 dstComponents
= _mesa_components_in_format( dstFormat
);
3489 /* source & dest image formats should have been error checked by now */
3490 assert(dstComponents
> 0);
3493 * Extract image data and convert to RGBA floats
3495 if (srcFormat
== GL_COLOR_INDEX
) {
3496 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3499 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3503 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3506 if (dstFormat
== GL_COLOR_INDEX
) {
3508 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3509 /* convert to GLchan and return */
3510 for (i
= 0; i
< n
; i
++) {
3511 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3518 /* Convert indexes to RGBA */
3519 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3520 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3522 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3525 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3526 * with color indexes.
3528 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3533 /* non-color index data */
3534 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3535 srcPacking
->SwapBytes
);
3538 /* Need to clamp if returning GLubytes or GLushorts */
3539 #if CHAN_TYPE != GL_FLOAT
3540 transferOps
|= IMAGE_CLAMP_BIT
;
3544 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3547 get_component_indexes(dstFormat
,
3548 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3550 /* Now return the GLchan data in the requested dstFormat */
3554 for (i
= 0; i
< n
; i
++) {
3555 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3556 dst
+= dstComponents
;
3563 for (i
= 0; i
< n
; i
++) {
3564 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3565 dst
+= dstComponents
;
3572 for (i
= 0; i
< n
; i
++) {
3573 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3574 dst
+= dstComponents
;
3581 for (i
= 0; i
< n
; i
++) {
3582 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3583 dst
+= dstComponents
;
3591 assert(dstComponents
== 1);
3592 for (i
= 0; i
< n
; i
++) {
3593 /* Intensity comes from red channel */
3594 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3602 for (i
= 0; i
< n
; i
++) {
3603 /* Luminance comes from red channel */
3604 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3605 dst
+= dstComponents
;
3615 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3616 * instead of GLchan.
3619 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3620 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3621 GLenum srcFormat
, GLenum srcType
,
3622 const GLvoid
*source
,
3623 const struct gl_pixelstore_attrib
*srcPacking
,
3624 GLbitfield transferOps
)
3626 ASSERT(dstFormat
== GL_ALPHA
||
3627 dstFormat
== GL_LUMINANCE
||
3628 dstFormat
== GL_LUMINANCE_ALPHA
||
3629 dstFormat
== GL_INTENSITY
||
3630 dstFormat
== GL_RED
||
3631 dstFormat
== GL_RG
||
3632 dstFormat
== GL_RGB
||
3633 dstFormat
== GL_RGBA
||
3634 dstFormat
== GL_COLOR_INDEX
);
3636 ASSERT(srcFormat
== GL_RED
||
3637 srcFormat
== GL_GREEN
||
3638 srcFormat
== GL_BLUE
||
3639 srcFormat
== GL_ALPHA
||
3640 srcFormat
== GL_LUMINANCE
||
3641 srcFormat
== GL_LUMINANCE_ALPHA
||
3642 srcFormat
== GL_INTENSITY
||
3643 srcFormat
== GL_RG
||
3644 srcFormat
== GL_RGB
||
3645 srcFormat
== GL_BGR
||
3646 srcFormat
== GL_RGBA
||
3647 srcFormat
== GL_BGRA
||
3648 srcFormat
== GL_ABGR_EXT
||
3649 srcFormat
== GL_RED_INTEGER_EXT
||
3650 srcFormat
== GL_GREEN_INTEGER_EXT
||
3651 srcFormat
== GL_BLUE_INTEGER_EXT
||
3652 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3653 srcFormat
== GL_RGB_INTEGER_EXT
||
3654 srcFormat
== GL_RGBA_INTEGER_EXT
||
3655 srcFormat
== GL_BGR_INTEGER_EXT
||
3656 srcFormat
== GL_BGRA_INTEGER_EXT
||
3657 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3658 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3659 srcFormat
== GL_COLOR_INDEX
);
3661 ASSERT(srcType
== GL_BITMAP
||
3662 srcType
== GL_UNSIGNED_BYTE
||
3663 srcType
== GL_BYTE
||
3664 srcType
== GL_UNSIGNED_SHORT
||
3665 srcType
== GL_SHORT
||
3666 srcType
== GL_UNSIGNED_INT
||
3667 srcType
== GL_INT
||
3668 srcType
== GL_HALF_FLOAT_ARB
||
3669 srcType
== GL_FLOAT
||
3670 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3671 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3672 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3673 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3674 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3675 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3676 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3677 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3678 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3679 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3680 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3681 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3683 /* general solution, no special cases, yet */
3685 GLint dstComponents
;
3686 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3687 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3690 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3694 dstComponents
= _mesa_components_in_format( dstFormat
);
3695 /* source & dest image formats should have been error checked by now */
3696 assert(dstComponents
> 0);
3699 * Extract image data and convert to RGBA floats
3701 if (srcFormat
== GL_COLOR_INDEX
) {
3702 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3705 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3710 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3713 if (dstFormat
== GL_COLOR_INDEX
) {
3715 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3716 /* convert to GLchan and return */
3717 for (i
= 0; i
< n
; i
++) {
3718 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3725 /* Convert indexes to RGBA */
3726 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3727 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3729 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3732 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3733 * with color indexes.
3735 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3740 /* non-color index data */
3741 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3742 srcPacking
->SwapBytes
);
3746 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3749 get_component_indexes(dstFormat
,
3750 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3752 /* Now pack results in the requested dstFormat */
3754 GLfloat
*dst
= dest
;
3756 for (i
= 0; i
< n
; i
++) {
3757 dst
[rDst
] = rgba
[i
][RCOMP
];
3758 dst
+= dstComponents
;
3763 GLfloat
*dst
= dest
;
3765 for (i
= 0; i
< n
; i
++) {
3766 dst
[gDst
] = rgba
[i
][GCOMP
];
3767 dst
+= dstComponents
;
3772 GLfloat
*dst
= dest
;
3774 for (i
= 0; i
< n
; i
++) {
3775 dst
[bDst
] = rgba
[i
][BCOMP
];
3776 dst
+= dstComponents
;
3781 GLfloat
*dst
= dest
;
3783 for (i
= 0; i
< n
; i
++) {
3784 dst
[aDst
] = rgba
[i
][ACOMP
];
3785 dst
+= dstComponents
;
3790 GLfloat
*dst
= dest
;
3793 assert(dstComponents
== 1);
3794 for (i
= 0; i
< n
; i
++) {
3795 /* Intensity comes from red channel */
3796 dst
[i
] = rgba
[i
][RCOMP
];
3801 GLfloat
*dst
= dest
;
3804 for (i
= 0; i
< n
; i
++) {
3805 /* Luminance comes from red channel */
3806 dst
[0] = rgba
[i
][RCOMP
];
3807 dst
+= dstComponents
;
3817 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3818 * instead of GLchan.
3819 * No pixel transfer ops are applied.
3822 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3823 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3824 GLenum srcFormat
, GLenum srcType
,
3825 const GLvoid
*source
,
3826 const struct gl_pixelstore_attrib
*srcPacking
)
3828 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3831 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3835 ASSERT(dstFormat
== GL_ALPHA
||
3836 dstFormat
== GL_LUMINANCE
||
3837 dstFormat
== GL_LUMINANCE_ALPHA
||
3838 dstFormat
== GL_INTENSITY
||
3839 dstFormat
== GL_RED
||
3840 dstFormat
== GL_RG
||
3841 dstFormat
== GL_RGB
||
3842 dstFormat
== GL_RGBA
);
3844 ASSERT(srcFormat
== GL_RED
||
3845 srcFormat
== GL_GREEN
||
3846 srcFormat
== GL_BLUE
||
3847 srcFormat
== GL_ALPHA
||
3848 srcFormat
== GL_LUMINANCE
||
3849 srcFormat
== GL_LUMINANCE_ALPHA
||
3850 srcFormat
== GL_INTENSITY
||
3851 srcFormat
== GL_RG
||
3852 srcFormat
== GL_RGB
||
3853 srcFormat
== GL_BGR
||
3854 srcFormat
== GL_RGBA
||
3855 srcFormat
== GL_BGRA
||
3856 srcFormat
== GL_ABGR_EXT
||
3857 srcFormat
== GL_RED_INTEGER_EXT
||
3858 srcFormat
== GL_GREEN_INTEGER_EXT
||
3859 srcFormat
== GL_BLUE_INTEGER_EXT
||
3860 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3861 srcFormat
== GL_RGB_INTEGER_EXT
||
3862 srcFormat
== GL_RGBA_INTEGER_EXT
||
3863 srcFormat
== GL_BGR_INTEGER_EXT
||
3864 srcFormat
== GL_BGRA_INTEGER_EXT
||
3865 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3866 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3868 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3869 srcType
== GL_BYTE
||
3870 srcType
== GL_UNSIGNED_SHORT
||
3871 srcType
== GL_SHORT
||
3872 srcType
== GL_UNSIGNED_INT
||
3873 srcType
== GL_INT
||
3874 srcType
== GL_HALF_FLOAT_ARB
||
3875 srcType
== GL_FLOAT
||
3876 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3877 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3878 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3879 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3880 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3881 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3882 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3883 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3884 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3885 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3886 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3887 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3890 /* Extract image data as uint[4] pixels */
3891 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3892 srcPacking
->SwapBytes
);
3894 if (dstFormat
== GL_RGBA
) {
3896 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3900 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3901 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3903 assert(dstComponents
> 0);
3905 get_component_indexes(dstFormat
,
3906 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3908 /* Now pack values in the requested dest format */
3912 for (i
= 0; i
< n
; i
++) {
3913 dst
[rDst
] = rgba
[i
][RCOMP
];
3914 dst
+= dstComponents
;
3921 for (i
= 0; i
< n
; i
++) {
3922 dst
[gDst
] = rgba
[i
][GCOMP
];
3923 dst
+= dstComponents
;
3930 for (i
= 0; i
< n
; i
++) {
3931 dst
[bDst
] = rgba
[i
][BCOMP
];
3932 dst
+= dstComponents
;
3939 for (i
= 0; i
< n
; i
++) {
3940 dst
[aDst
] = rgba
[i
][ACOMP
];
3941 dst
+= dstComponents
;
3949 assert(dstComponents
== 1);
3950 for (i
= 0; i
< n
; i
++) {
3951 /* Intensity comes from red channel */
3952 dst
[i
] = rgba
[i
][RCOMP
];
3960 for (i
= 0; i
< n
; i
++) {
3961 /* Luminance comes from red channel */
3962 dst
[0] = rgba
[i
][RCOMP
];
3963 dst
+= dstComponents
;
3974 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3975 * directly return GLbyte data, no transfer ops apply.
3978 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3979 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3980 GLenum srcFormat
, GLenum srcType
,
3981 const GLvoid
*source
,
3982 const struct gl_pixelstore_attrib
*srcPacking
,
3983 GLbitfield transferOps
)
3985 ASSERT(dstFormat
== GL_DUDV_ATI
);
3986 ASSERT(srcFormat
== GL_DUDV_ATI
);
3988 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3989 srcType
== GL_BYTE
||
3990 srcType
== GL_UNSIGNED_SHORT
||
3991 srcType
== GL_SHORT
||
3992 srcType
== GL_UNSIGNED_INT
||
3993 srcType
== GL_INT
||
3994 srcType
== GL_HALF_FLOAT_ARB
||
3995 srcType
== GL_FLOAT
);
3997 /* general solution */
3999 GLint dstComponents
;
4002 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4005 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4009 dstComponents
= _mesa_components_in_format( dstFormat
);
4010 /* source & dest image formats should have been error checked by now */
4011 assert(dstComponents
> 0);
4014 * Extract image data and convert to RGBA floats
4016 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4017 srcPacking
->SwapBytes
);
4020 /* Now determine which color channels we need to produce.
4021 * And determine the dest index (offset) within each color tuple.
4024 /* Now pack results in the requested dstFormat */
4025 for (i
= 0; i
< n
; i
++) {
4026 /* not sure - need clamp[-1,1] here? */
4027 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4028 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4029 dst
+= dstComponents
;
4037 * Unpack a row of color index data from a client buffer according to
4038 * the pixel unpacking parameters.
4039 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4041 * Args: ctx - the context
4042 * n - number of pixels
4043 * dstType - destination data type
4044 * dest - destination array
4045 * srcType - source pixel type
4046 * source - source data pointer
4047 * srcPacking - pixel unpacking parameters
4048 * transferOps - the pixel transfer operations to apply
4051 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4052 GLenum dstType
, GLvoid
*dest
,
4053 GLenum srcType
, const GLvoid
*source
,
4054 const struct gl_pixelstore_attrib
*srcPacking
,
4055 GLbitfield transferOps
)
4057 ASSERT(srcType
== GL_BITMAP
||
4058 srcType
== GL_UNSIGNED_BYTE
||
4059 srcType
== GL_BYTE
||
4060 srcType
== GL_UNSIGNED_SHORT
||
4061 srcType
== GL_SHORT
||
4062 srcType
== GL_UNSIGNED_INT
||
4063 srcType
== GL_INT
||
4064 srcType
== GL_HALF_FLOAT_ARB
||
4065 srcType
== GL_FLOAT
);
4067 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4068 dstType
== GL_UNSIGNED_SHORT
||
4069 dstType
== GL_UNSIGNED_INT
);
4072 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4075 * Try simple cases first
4077 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4078 && dstType
== GL_UNSIGNED_BYTE
) {
4079 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4081 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4082 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4083 memcpy(dest
, source
, n
* sizeof(GLuint
));
4089 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4092 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4096 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4100 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4102 /* convert to dest type */
4104 case GL_UNSIGNED_BYTE
:
4106 GLubyte
*dst
= (GLubyte
*) dest
;
4108 for (i
= 0; i
< n
; i
++) {
4109 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4113 case GL_UNSIGNED_SHORT
:
4115 GLuint
*dst
= (GLuint
*) dest
;
4117 for (i
= 0; i
< n
; i
++) {
4118 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4122 case GL_UNSIGNED_INT
:
4123 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4126 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4135 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4136 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4137 const struct gl_pixelstore_attrib
*dstPacking
,
4138 GLbitfield transferOps
)
4140 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4143 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4147 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4149 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4150 /* make a copy of input */
4151 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4152 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4157 case GL_UNSIGNED_BYTE
:
4159 GLubyte
*dst
= (GLubyte
*) dest
;
4161 for (i
= 0; i
< n
; i
++) {
4162 *dst
++ = (GLubyte
) source
[i
];
4168 GLbyte
*dst
= (GLbyte
*) dest
;
4170 for (i
= 0; i
< n
; i
++) {
4171 dst
[i
] = (GLbyte
) source
[i
];
4175 case GL_UNSIGNED_SHORT
:
4177 GLushort
*dst
= (GLushort
*) dest
;
4179 for (i
= 0; i
< n
; i
++) {
4180 dst
[i
] = (GLushort
) source
[i
];
4182 if (dstPacking
->SwapBytes
) {
4183 _mesa_swap2( (GLushort
*) dst
, n
);
4189 GLshort
*dst
= (GLshort
*) dest
;
4191 for (i
= 0; i
< n
; i
++) {
4192 dst
[i
] = (GLshort
) source
[i
];
4194 if (dstPacking
->SwapBytes
) {
4195 _mesa_swap2( (GLushort
*) dst
, n
);
4199 case GL_UNSIGNED_INT
:
4201 GLuint
*dst
= (GLuint
*) dest
;
4203 for (i
= 0; i
< n
; i
++) {
4204 dst
[i
] = (GLuint
) source
[i
];
4206 if (dstPacking
->SwapBytes
) {
4207 _mesa_swap4( (GLuint
*) dst
, n
);
4213 GLint
*dst
= (GLint
*) dest
;
4215 for (i
= 0; i
< n
; i
++) {
4216 dst
[i
] = (GLint
) source
[i
];
4218 if (dstPacking
->SwapBytes
) {
4219 _mesa_swap4( (GLuint
*) dst
, n
);
4225 GLfloat
*dst
= (GLfloat
*) dest
;
4227 for (i
= 0; i
< n
; i
++) {
4228 dst
[i
] = (GLfloat
) source
[i
];
4230 if (dstPacking
->SwapBytes
) {
4231 _mesa_swap4( (GLuint
*) dst
, n
);
4235 case GL_HALF_FLOAT_ARB
:
4237 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4239 for (i
= 0; i
< n
; i
++) {
4240 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4242 if (dstPacking
->SwapBytes
) {
4243 _mesa_swap2( (GLushort
*) dst
, n
);
4248 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4256 * Unpack a row of stencil data from a client buffer according to
4257 * the pixel unpacking parameters.
4258 * This is (or will be) used by glDrawPixels
4260 * Args: ctx - the context
4261 * n - number of pixels
4262 * dstType - destination data type
4263 * dest - destination array
4264 * srcType - source pixel type
4265 * source - source data pointer
4266 * srcPacking - pixel unpacking parameters
4267 * transferOps - apply offset/bias/lookup ops?
4270 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4271 GLenum dstType
, GLvoid
*dest
,
4272 GLenum srcType
, const GLvoid
*source
,
4273 const struct gl_pixelstore_attrib
*srcPacking
,
4274 GLbitfield transferOps
)
4276 ASSERT(srcType
== GL_BITMAP
||
4277 srcType
== GL_UNSIGNED_BYTE
||
4278 srcType
== GL_BYTE
||
4279 srcType
== GL_UNSIGNED_SHORT
||
4280 srcType
== GL_SHORT
||
4281 srcType
== GL_UNSIGNED_INT
||
4282 srcType
== GL_INT
||
4283 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4284 srcType
== GL_HALF_FLOAT_ARB
||
4285 srcType
== GL_FLOAT
);
4287 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4288 dstType
== GL_UNSIGNED_SHORT
||
4289 dstType
== GL_UNSIGNED_INT
);
4291 /* only shift and offset apply to stencil */
4292 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4295 * Try simple cases first
4297 if (transferOps
== 0 &&
4298 !ctx
->Pixel
.MapStencilFlag
&&
4299 srcType
== GL_UNSIGNED_BYTE
&&
4300 dstType
== GL_UNSIGNED_BYTE
) {
4301 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4303 else if (transferOps
== 0 &&
4304 !ctx
->Pixel
.MapStencilFlag
&&
4305 srcType
== GL_UNSIGNED_INT
&&
4306 dstType
== GL_UNSIGNED_INT
&&
4307 !srcPacking
->SwapBytes
) {
4308 memcpy(dest
, source
, n
* sizeof(GLuint
));
4314 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4317 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4321 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4324 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4325 /* shift and offset indexes */
4326 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4329 if (ctx
->Pixel
.MapStencilFlag
) {
4330 /* Apply stencil lookup table */
4331 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4333 for (i
= 0; i
< n
; i
++) {
4334 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4338 /* convert to dest type */
4340 case GL_UNSIGNED_BYTE
:
4342 GLubyte
*dst
= (GLubyte
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4349 case GL_UNSIGNED_SHORT
:
4351 GLuint
*dst
= (GLuint
*) dest
;
4353 for (i
= 0; i
< n
; i
++) {
4354 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4358 case GL_UNSIGNED_INT
:
4359 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4362 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4371 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4372 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4373 const struct gl_pixelstore_attrib
*dstPacking
)
4375 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4378 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4382 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4383 ctx
->Pixel
.MapStencilFlag
) {
4384 /* make a copy of input */
4385 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4386 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4391 case GL_UNSIGNED_BYTE
:
4392 if (sizeof(GLstencil
) == 1) {
4393 memcpy( dest
, source
, n
);
4396 GLubyte
*dst
= (GLubyte
*) dest
;
4399 dst
[i
] = (GLubyte
) source
[i
];
4405 GLbyte
*dst
= (GLbyte
*) dest
;
4408 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4412 case GL_UNSIGNED_SHORT
:
4414 GLushort
*dst
= (GLushort
*) dest
;
4417 dst
[i
] = (GLushort
) source
[i
];
4419 if (dstPacking
->SwapBytes
) {
4420 _mesa_swap2( (GLushort
*) dst
, n
);
4426 GLshort
*dst
= (GLshort
*) dest
;
4429 dst
[i
] = (GLshort
) source
[i
];
4431 if (dstPacking
->SwapBytes
) {
4432 _mesa_swap2( (GLushort
*) dst
, n
);
4436 case GL_UNSIGNED_INT
:
4438 GLuint
*dst
= (GLuint
*) dest
;
4441 dst
[i
] = (GLuint
) source
[i
];
4443 if (dstPacking
->SwapBytes
) {
4444 _mesa_swap4( (GLuint
*) dst
, n
);
4450 GLint
*dst
= (GLint
*) dest
;
4453 dst
[i
] = (GLint
) source
[i
];
4455 if (dstPacking
->SwapBytes
) {
4456 _mesa_swap4( (GLuint
*) dst
, n
);
4462 GLfloat
*dst
= (GLfloat
*) dest
;
4465 dst
[i
] = (GLfloat
) source
[i
];
4467 if (dstPacking
->SwapBytes
) {
4468 _mesa_swap4( (GLuint
*) dst
, n
);
4472 case GL_HALF_FLOAT_ARB
:
4474 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4477 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4479 if (dstPacking
->SwapBytes
) {
4480 _mesa_swap2( (GLushort
*) dst
, n
);
4485 if (dstPacking
->LsbFirst
) {
4486 GLubyte
*dst
= (GLubyte
*) dest
;
4489 for (i
= 0; i
< n
; i
++) {
4492 *dst
|= ((source
[i
] != 0) << shift
);
4501 GLubyte
*dst
= (GLubyte
*) dest
;
4504 for (i
= 0; i
< n
; i
++) {
4507 *dst
|= ((source
[i
] != 0) << shift
);
4517 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4523 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4526 const GLTYPE *src = (const GLTYPE *)source; \
4527 for (i = 0; i < n; i++) { \
4528 GLTYPE value = src[i]; \
4529 if (srcPacking->SwapBytes) { \
4530 if (sizeof(GLTYPE) == 2) { \
4532 } else if (sizeof(GLTYPE) == 4) { \
4536 depthValues[i] = GLTYPE2FLOAT(value); \
4542 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4543 * or GLfloat values.
4544 * The glPixelTransfer (scale/bias) params will be applied.
4546 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4547 * \param depthMax max value for returned GLushort or GLuint values
4548 * (ignored for GLfloat).
4551 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4552 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4553 GLenum srcType
, const GLvoid
*source
,
4554 const struct gl_pixelstore_attrib
*srcPacking
)
4556 GLfloat
*depthTemp
, *depthValues
;
4557 GLboolean needClamp
= GL_FALSE
;
4559 /* Look for special cases first.
4560 * Not only are these faster, they're less prone to numeric conversion
4561 * problems. Otherwise, converting from an int type to a float then
4562 * back to an int type can introduce errors that will show up as
4563 * artifacts in things like depth peeling which uses glCopyTexImage.
4565 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4566 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4567 const GLuint
*src
= (const GLuint
*) source
;
4568 GLushort
*dst
= (GLushort
*) dest
;
4570 for (i
= 0; i
< n
; i
++) {
4571 dst
[i
] = src
[i
] >> 16;
4575 if (srcType
== GL_UNSIGNED_SHORT
4576 && dstType
== GL_UNSIGNED_INT
4577 && depthMax
== 0xffffffff) {
4578 const GLushort
*src
= (const GLushort
*) source
;
4579 GLuint
*dst
= (GLuint
*) dest
;
4581 for (i
= 0; i
< n
; i
++) {
4582 dst
[i
] = src
[i
] | (src
[i
] << 16);
4586 if (srcType
== GL_UNSIGNED_INT_24_8
4587 && dstType
== GL_UNSIGNED_INT
4588 && depthMax
== 0xffffff) {
4589 const GLuint
*src
= (const GLuint
*) source
;
4590 GLuint
*dst
= (GLuint
*) dest
;
4592 for (i
= 0; i
< n
; i
++) {
4593 dst
[i
] = src
[i
] >> 8;
4597 /* XXX may want to add additional cases here someday */
4600 /* general case path follows */
4602 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4604 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4608 if (dstType
== GL_FLOAT
) {
4609 depthValues
= (GLfloat
*) dest
;
4612 depthValues
= depthTemp
;
4615 /* Convert incoming values to GLfloat. Some conversions will require
4620 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4621 needClamp
= GL_TRUE
;
4623 case GL_UNSIGNED_BYTE
:
4624 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4627 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4628 needClamp
= GL_TRUE
;
4630 case GL_UNSIGNED_SHORT
:
4631 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4634 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4635 needClamp
= GL_TRUE
;
4637 case GL_UNSIGNED_INT
:
4638 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4640 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4641 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4642 depthMax
== 0xffffff &&
4643 ctx
->Pixel
.DepthScale
== 1.0 &&
4644 ctx
->Pixel
.DepthBias
== 0.0) {
4645 const GLuint
*src
= (const GLuint
*) source
;
4646 GLuint
*zValues
= (GLuint
*) dest
;
4648 for (i
= 0; i
< n
; i
++) {
4649 GLuint value
= src
[i
];
4650 if (srcPacking
->SwapBytes
) {
4653 zValues
[i
] = value
& 0xffffff00;
4658 const GLuint
*src
= (const GLuint
*) source
;
4659 const GLfloat scale
= 1.0f
/ 0xffffff;
4661 for (i
= 0; i
< n
; i
++) {
4662 GLuint value
= src
[i
];
4663 if (srcPacking
->SwapBytes
) {
4666 depthValues
[i
] = (value
>> 8) * scale
;
4671 DEPTH_VALUES(GLfloat
, 1*);
4672 needClamp
= GL_TRUE
;
4674 case GL_HALF_FLOAT_ARB
:
4677 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4678 for (i
= 0; i
< n
; i
++) {
4679 GLhalfARB value
= src
[i
];
4680 if (srcPacking
->SwapBytes
) {
4683 depthValues
[i
] = _mesa_half_to_float(value
);
4685 needClamp
= GL_TRUE
;
4689 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4694 /* apply depth scale and bias */
4696 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4697 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4698 if (scale
!= 1.0 || bias
!= 0.0) {
4700 for (i
= 0; i
< n
; i
++) {
4701 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4703 needClamp
= GL_TRUE
;
4707 /* clamp to [0, 1] */
4710 for (i
= 0; i
< n
; i
++) {
4711 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4716 * Convert values to dstType
4718 if (dstType
== GL_UNSIGNED_INT
) {
4719 GLuint
*zValues
= (GLuint
*) dest
;
4721 if (depthMax
<= 0xffffff) {
4722 /* no overflow worries */
4723 for (i
= 0; i
< n
; i
++) {
4724 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4728 /* need to use double precision to prevent overflow problems */
4729 for (i
= 0; i
< n
; i
++) {
4730 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4731 if (z
>= (GLdouble
) 0xffffffff)
4732 zValues
[i
] = 0xffffffff;
4734 zValues
[i
] = (GLuint
) z
;
4738 else if (dstType
== GL_UNSIGNED_SHORT
) {
4739 GLushort
*zValues
= (GLushort
*) dest
;
4741 ASSERT(depthMax
<= 0xffff);
4742 for (i
= 0; i
< n
; i
++) {
4743 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4747 ASSERT(dstType
== GL_FLOAT
);
4748 /*ASSERT(depthMax == 1.0F);*/
4756 * Pack an array of depth values. The values are floats in [0,1].
4759 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4760 GLenum dstType
, const GLfloat
*depthSpan
,
4761 const struct gl_pixelstore_attrib
*dstPacking
)
4763 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4765 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4769 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4770 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4771 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4772 depthSpan
= depthCopy
;
4776 case GL_UNSIGNED_BYTE
:
4778 GLubyte
*dst
= (GLubyte
*) dest
;
4780 for (i
= 0; i
< n
; i
++) {
4781 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4787 GLbyte
*dst
= (GLbyte
*) dest
;
4789 for (i
= 0; i
< n
; i
++) {
4790 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4794 case GL_UNSIGNED_SHORT
:
4796 GLushort
*dst
= (GLushort
*) dest
;
4798 for (i
= 0; i
< n
; i
++) {
4799 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4801 if (dstPacking
->SwapBytes
) {
4802 _mesa_swap2( (GLushort
*) dst
, n
);
4808 GLshort
*dst
= (GLshort
*) dest
;
4810 for (i
= 0; i
< n
; i
++) {
4811 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4813 if (dstPacking
->SwapBytes
) {
4814 _mesa_swap2( (GLushort
*) dst
, n
);
4818 case GL_UNSIGNED_INT
:
4820 GLuint
*dst
= (GLuint
*) dest
;
4822 for (i
= 0; i
< n
; i
++) {
4823 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4825 if (dstPacking
->SwapBytes
) {
4826 _mesa_swap4( (GLuint
*) dst
, n
);
4832 GLint
*dst
= (GLint
*) dest
;
4834 for (i
= 0; i
< n
; i
++) {
4835 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4837 if (dstPacking
->SwapBytes
) {
4838 _mesa_swap4( (GLuint
*) dst
, n
);
4844 GLfloat
*dst
= (GLfloat
*) dest
;
4846 for (i
= 0; i
< n
; i
++) {
4847 dst
[i
] = depthSpan
[i
];
4849 if (dstPacking
->SwapBytes
) {
4850 _mesa_swap4( (GLuint
*) dst
, n
);
4854 case GL_HALF_FLOAT_ARB
:
4856 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4858 for (i
= 0; i
< n
; i
++) {
4859 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4861 if (dstPacking
->SwapBytes
) {
4862 _mesa_swap2( (GLushort
*) dst
, n
);
4867 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4876 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4879 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4880 const GLfloat
*depthVals
,
4881 const GLstencil
*stencilVals
,
4882 const struct gl_pixelstore_attrib
*dstPacking
)
4884 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4885 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4888 if (!depthCopy
|| !stencilCopy
) {
4889 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4895 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4896 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4897 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4898 depthVals
= depthCopy
;
4901 if (ctx
->Pixel
.IndexShift
||
4902 ctx
->Pixel
.IndexOffset
||
4903 ctx
->Pixel
.MapStencilFlag
) {
4904 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4905 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4906 stencilVals
= stencilCopy
;
4909 for (i
= 0; i
< n
; i
++) {
4910 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4911 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4914 if (dstPacking
->SwapBytes
) {
4915 _mesa_swap4(dest
, n
);
4926 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4927 * Return all image data in a contiguous block. This is used when we
4928 * compile glDrawPixels, glTexImage, etc into a display list. We
4929 * need a copy of the data in a standard format.
4932 _mesa_unpack_image( GLuint dimensions
,
4933 GLsizei width
, GLsizei height
, GLsizei depth
,
4934 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4935 const struct gl_pixelstore_attrib
*unpack
)
4937 GLint bytesPerRow
, compsPerRow
;
4938 GLboolean flipBytes
, swap2
, swap4
;
4941 return NULL
; /* not necessarily an error */
4943 if (width
<= 0 || height
<= 0 || depth
<= 0)
4944 return NULL
; /* generate error later */
4946 if (type
== GL_BITMAP
) {
4947 bytesPerRow
= (width
+ 7) >> 3;
4948 flipBytes
= unpack
->LsbFirst
;
4949 swap2
= swap4
= GL_FALSE
;
4953 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4954 GLint components
= _mesa_components_in_format(format
);
4957 if (_mesa_type_is_packed(type
))
4960 if (bytesPerPixel
<= 0 || components
<= 0)
4961 return NULL
; /* bad format or type. generate error later */
4962 bytesPerRow
= bytesPerPixel
* width
;
4963 bytesPerComp
= bytesPerPixel
/ components
;
4964 flipBytes
= GL_FALSE
;
4965 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4966 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4967 compsPerRow
= components
* width
;
4968 assert(compsPerRow
>= width
);
4973 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4977 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4980 for (img
= 0; img
< depth
; img
++) {
4981 for (row
= 0; row
< height
; row
++) {
4982 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4983 width
, height
, format
, type
, img
, row
, 0);
4985 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4987 flipBytes
= GL_FALSE
;
4988 if (unpack
->LsbFirst
) {
4989 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4990 GLubyte dstMask
= 128;
4991 const GLubyte
*s
= src
;
4994 for (i
= 0; i
< width
; i
++) {
4998 if (srcMask
== 128) {
5003 srcMask
= srcMask
<< 1;
5011 dstMask
= dstMask
>> 1;
5016 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5017 GLubyte dstMask
= 128;
5018 const GLubyte
*s
= src
;
5021 for (i
= 0; i
< width
; i
++) {
5030 srcMask
= srcMask
>> 1;
5038 dstMask
= dstMask
>> 1;
5044 memcpy(dst
, src
, bytesPerRow
);
5047 /* byte flipping/swapping */
5049 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5052 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5055 _mesa_swap4((GLuint
*) dst
, compsPerRow
);