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
)
487 GLfloat luminance
[MAX_WIDTH
];
488 const GLint comps
= _mesa_components_in_format(dstFormat
);
489 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
493 * This test should probably go away. Have the caller set/clear the
494 * IMAGE_CLAMP_BIT as needed.
496 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
498 /* need to clamp to [0, 1] */
499 transferOps
|= IMAGE_CLAMP_BIT
;
504 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
508 * Component clamping (besides clamping to [0,1] in
509 * _mesa_apply_rgba_transfer_ops()).
512 /* clamping to dest type's min/max values */
514 if (get_type_min_max(dstType
, &min
, &max
)) {
515 for (i
= 0; i
< n
; i
++) {
516 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
517 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
518 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
519 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
523 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
524 /* compute luminance values */
525 if (transferOps
& IMAGE_CLAMP_BIT
) {
526 for (i
= 0; i
< n
; i
++) {
527 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
528 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
532 for (i
= 0; i
< n
; i
++) {
533 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
539 * Pack/store the pixels. Ugh! Lots of cases!!!
542 case GL_UNSIGNED_BYTE
:
544 GLubyte
*dst
= (GLubyte
*) dstAddr
;
548 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
552 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
556 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
560 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
564 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
566 case GL_LUMINANCE_ALPHA
:
568 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
569 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
574 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
575 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
580 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
581 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
582 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
587 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
588 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
589 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
590 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
595 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
596 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
597 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
602 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
603 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
604 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
605 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
610 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
611 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
612 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
613 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
616 case GL_RED_INTEGER_EXT
:
618 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
621 case GL_GREEN_INTEGER_EXT
:
623 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
626 case GL_BLUE_INTEGER_EXT
:
628 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
631 case GL_ALPHA_INTEGER_EXT
:
633 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
636 case GL_RGB_INTEGER_EXT
:
638 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
639 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
640 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
643 case GL_RGBA_INTEGER_EXT
:
645 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
646 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
647 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
648 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
651 case GL_BGR_INTEGER_EXT
:
653 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
654 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
655 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
658 case GL_BGRA_INTEGER_EXT
:
660 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
661 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
662 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
663 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
666 case GL_LUMINANCE_INTEGER_EXT
:
668 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
671 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
674 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
676 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
684 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
685 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
689 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
695 GLbyte
*dst
= (GLbyte
*) dstAddr
;
699 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
703 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
707 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
711 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
715 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
717 case GL_LUMINANCE_ALPHA
:
719 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
720 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
725 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
726 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
731 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
732 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
733 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
738 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
739 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
740 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
741 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
746 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
747 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
748 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
753 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
754 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
755 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
756 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
761 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
762 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
763 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
764 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
767 case GL_RED_INTEGER_EXT
:
769 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
772 case GL_GREEN_INTEGER_EXT
:
774 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
777 case GL_BLUE_INTEGER_EXT
:
779 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
782 case GL_ALPHA_INTEGER_EXT
:
784 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
787 case GL_RGB_INTEGER_EXT
:
789 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
790 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
791 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
794 case GL_RGBA_INTEGER_EXT
:
796 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
797 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
798 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
799 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
802 case GL_BGR_INTEGER_EXT
:
804 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
805 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
806 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
809 case GL_BGRA_INTEGER_EXT
:
811 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
812 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
813 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
814 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
817 case GL_LUMINANCE_INTEGER_EXT
:
819 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
822 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
825 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
827 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
835 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
836 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
840 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
844 case GL_UNSIGNED_SHORT
:
846 GLushort
*dst
= (GLushort
*) dstAddr
;
850 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
854 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
858 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
862 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
866 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
868 case GL_LUMINANCE_ALPHA
:
870 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
871 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
876 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
877 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
882 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
883 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
884 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
889 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
890 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
891 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
892 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
897 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
898 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
899 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
904 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
905 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
906 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
907 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
912 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
913 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
914 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
915 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
918 case GL_RED_INTEGER_EXT
:
920 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
923 case GL_GREEN_INTEGER_EXT
:
925 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
928 case GL_BLUE_INTEGER_EXT
:
930 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
933 case GL_ALPHA_INTEGER_EXT
:
935 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
938 case GL_RGB_INTEGER_EXT
:
940 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
941 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
942 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
945 case GL_RGBA_INTEGER_EXT
:
947 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
948 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
949 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
950 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
953 case GL_BGR_INTEGER_EXT
:
955 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
956 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
957 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
960 case GL_BGRA_INTEGER_EXT
:
962 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
963 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
964 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
965 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
968 case GL_LUMINANCE_INTEGER_EXT
:
970 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
973 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
976 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
978 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
986 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
987 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
991 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
997 GLshort
*dst
= (GLshort
*) dstAddr
;
1001 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1005 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1009 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1013 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1017 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1019 case GL_LUMINANCE_ALPHA
:
1021 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1022 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1027 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1028 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1033 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1034 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1035 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1040 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1041 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1042 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1043 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1048 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1049 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1050 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1055 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1056 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1057 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1058 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1063 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1064 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1065 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1066 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1069 case GL_RED_INTEGER_EXT
:
1071 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1074 case GL_GREEN_INTEGER_EXT
:
1076 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1079 case GL_BLUE_INTEGER_EXT
:
1081 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1084 case GL_ALPHA_INTEGER_EXT
:
1086 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1089 case GL_RGB_INTEGER_EXT
:
1091 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1092 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1093 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1096 case GL_RGBA_INTEGER_EXT
:
1098 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1099 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1100 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1101 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1104 case GL_BGR_INTEGER_EXT
:
1106 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1107 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1108 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1111 case GL_BGRA_INTEGER_EXT
:
1113 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1114 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1115 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1116 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1119 case GL_LUMINANCE_INTEGER_EXT
:
1121 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1124 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1127 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1129 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1137 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1138 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1142 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1146 case GL_UNSIGNED_INT
:
1148 GLuint
*dst
= (GLuint
*) dstAddr
;
1149 switch (dstFormat
) {
1152 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1156 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1160 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1164 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1168 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1170 case GL_LUMINANCE_ALPHA
:
1172 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1173 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1178 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1179 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1184 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1185 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1186 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1191 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1192 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1193 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1194 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1199 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1200 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1201 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1206 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1207 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1208 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1209 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1214 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1215 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1216 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1217 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1220 case GL_RED_INTEGER_EXT
:
1222 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1225 case GL_GREEN_INTEGER_EXT
:
1227 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1230 case GL_BLUE_INTEGER_EXT
:
1232 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1235 case GL_ALPHA_INTEGER_EXT
:
1237 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1240 case GL_RGB_INTEGER_EXT
:
1242 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1243 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1244 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1247 case GL_RGBA_INTEGER_EXT
:
1249 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1250 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1251 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1252 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1255 case GL_BGR_INTEGER_EXT
:
1257 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1258 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1259 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1262 case GL_BGRA_INTEGER_EXT
:
1264 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1265 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1266 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1267 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1270 case GL_LUMINANCE_INTEGER_EXT
:
1272 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1275 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1278 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1280 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1288 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1289 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1293 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1299 GLint
*dst
= (GLint
*) dstAddr
;
1300 switch (dstFormat
) {
1303 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1307 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1311 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1315 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1319 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1321 case GL_LUMINANCE_ALPHA
:
1323 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1324 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1329 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1330 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1335 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1336 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1337 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1342 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1343 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1344 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1345 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1350 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1351 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1352 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1357 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1358 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1359 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1360 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1365 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1366 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1367 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1368 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1374 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1375 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1378 case GL_RED_INTEGER_EXT
:
1380 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1383 case GL_GREEN_INTEGER_EXT
:
1385 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1388 case GL_BLUE_INTEGER_EXT
:
1390 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1393 case GL_ALPHA_INTEGER_EXT
:
1395 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1398 case GL_RGB_INTEGER_EXT
:
1400 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1401 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1402 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1405 case GL_RGBA_INTEGER_EXT
:
1407 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1408 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1409 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1410 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1413 case GL_BGR_INTEGER_EXT
:
1415 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1416 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1417 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1420 case GL_BGRA_INTEGER_EXT
:
1422 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1423 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1424 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1425 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1428 case GL_LUMINANCE_INTEGER_EXT
:
1430 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1433 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1436 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1438 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1444 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1450 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1451 switch (dstFormat
) {
1454 dst
[i
] = rgba
[i
][RCOMP
];
1458 dst
[i
] = rgba
[i
][GCOMP
];
1462 dst
[i
] = rgba
[i
][BCOMP
];
1466 dst
[i
] = rgba
[i
][ACOMP
];
1470 dst
[i
] = luminance
[i
];
1472 case GL_LUMINANCE_ALPHA
:
1474 dst
[i
*2+0] = luminance
[i
];
1475 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1480 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1481 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1486 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1487 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1488 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1493 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1494 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1495 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1496 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1501 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1502 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1503 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1508 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1509 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1510 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1511 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1516 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1517 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1518 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1519 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1525 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1526 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1530 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1534 case GL_HALF_FLOAT_ARB
:
1536 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1537 switch (dstFormat
) {
1540 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1544 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1548 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1552 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1556 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1558 case GL_LUMINANCE_ALPHA
:
1560 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1561 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1566 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1567 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1572 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1573 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1574 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1579 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1580 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1581 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1582 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1587 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1588 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1589 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1594 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1595 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1596 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1597 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1602 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1603 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1604 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1605 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1611 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1612 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1616 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1620 case GL_UNSIGNED_BYTE_3_3_2
:
1621 if (dstFormat
== GL_RGB
) {
1622 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1624 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1625 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1626 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1630 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1631 if (dstFormat
== GL_RGB
) {
1632 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1634 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1635 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1636 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1640 case GL_UNSIGNED_SHORT_5_6_5
:
1641 if (dstFormat
== GL_RGB
) {
1642 GLushort
*dst
= (GLushort
*) dstAddr
;
1644 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1645 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1646 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1650 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1651 if (dstFormat
== GL_RGB
) {
1652 GLushort
*dst
= (GLushort
*) dstAddr
;
1654 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1655 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1656 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1660 case GL_UNSIGNED_SHORT_4_4_4_4
:
1661 if (dstFormat
== GL_RGBA
) {
1662 GLushort
*dst
= (GLushort
*) dstAddr
;
1664 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1665 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1666 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1667 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1670 else if (dstFormat
== GL_BGRA
) {
1671 GLushort
*dst
= (GLushort
*) dstAddr
;
1673 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1674 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1675 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1676 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1679 else if (dstFormat
== GL_ABGR_EXT
) {
1680 GLushort
*dst
= (GLushort
*) dstAddr
;
1682 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1683 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1684 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1685 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1689 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1690 if (dstFormat
== GL_RGBA
) {
1691 GLushort
*dst
= (GLushort
*) dstAddr
;
1693 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1694 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1695 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1696 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1699 else if (dstFormat
== GL_BGRA
) {
1700 GLushort
*dst
= (GLushort
*) dstAddr
;
1702 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1703 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1704 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1705 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1708 else if (dstFormat
== GL_ABGR_EXT
) {
1709 GLushort
*dst
= (GLushort
*) dstAddr
;
1711 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1712 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1713 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1714 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1718 case GL_UNSIGNED_SHORT_5_5_5_1
:
1719 if (dstFormat
== GL_RGBA
) {
1720 GLushort
*dst
= (GLushort
*) dstAddr
;
1722 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1723 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1724 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1725 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1728 else if (dstFormat
== GL_BGRA
) {
1729 GLushort
*dst
= (GLushort
*) dstAddr
;
1731 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1732 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1733 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1734 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1737 else if (dstFormat
== GL_ABGR_EXT
) {
1738 GLushort
*dst
= (GLushort
*) dstAddr
;
1740 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1741 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1742 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1743 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1747 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1748 if (dstFormat
== GL_RGBA
) {
1749 GLushort
*dst
= (GLushort
*) dstAddr
;
1751 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1752 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1753 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1754 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1757 else if (dstFormat
== GL_BGRA
) {
1758 GLushort
*dst
= (GLushort
*) dstAddr
;
1760 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1761 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1762 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1763 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1766 else if (dstFormat
== GL_ABGR_EXT
) {
1767 GLushort
*dst
= (GLushort
*) dstAddr
;
1769 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1770 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1771 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1772 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1776 case GL_UNSIGNED_INT_8_8_8_8
:
1777 if (dstFormat
== GL_RGBA
) {
1778 GLuint
*dst
= (GLuint
*) dstAddr
;
1780 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1781 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1782 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1783 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1786 else if (dstFormat
== GL_BGRA
) {
1787 GLuint
*dst
= (GLuint
*) dstAddr
;
1789 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1790 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1791 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1792 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1795 else if (dstFormat
== GL_ABGR_EXT
) {
1796 GLuint
*dst
= (GLuint
*) dstAddr
;
1798 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1799 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1800 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1801 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1805 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1806 if (dstFormat
== GL_RGBA
) {
1807 GLuint
*dst
= (GLuint
*) dstAddr
;
1809 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1810 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1811 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1812 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1815 else if (dstFormat
== GL_BGRA
) {
1816 GLuint
*dst
= (GLuint
*) dstAddr
;
1818 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1819 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1820 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1821 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1824 else if (dstFormat
== GL_ABGR_EXT
) {
1825 GLuint
*dst
= (GLuint
*) dstAddr
;
1827 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1828 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1829 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1830 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1834 case GL_UNSIGNED_INT_10_10_10_2
:
1835 if (dstFormat
== GL_RGBA
) {
1836 GLuint
*dst
= (GLuint
*) dstAddr
;
1838 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1839 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1840 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1841 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1844 else if (dstFormat
== GL_BGRA
) {
1845 GLuint
*dst
= (GLuint
*) dstAddr
;
1847 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1848 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1849 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1850 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1853 else if (dstFormat
== GL_ABGR_EXT
) {
1854 GLuint
*dst
= (GLuint
*) dstAddr
;
1856 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1857 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1858 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1859 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1863 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1864 if (dstFormat
== GL_RGBA
) {
1865 GLuint
*dst
= (GLuint
*) dstAddr
;
1867 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1868 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1869 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1870 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1873 else if (dstFormat
== GL_BGRA
) {
1874 GLuint
*dst
= (GLuint
*) dstAddr
;
1876 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1877 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1878 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1879 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1882 else if (dstFormat
== GL_ABGR_EXT
) {
1883 GLuint
*dst
= (GLuint
*) dstAddr
;
1885 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1886 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1887 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1888 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1893 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1897 if (dstPacking
->SwapBytes
) {
1898 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1899 if (swapSize
== 2) {
1900 if (dstPacking
->SwapBytes
) {
1901 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1904 else if (swapSize
== 4) {
1905 if (dstPacking
->SwapBytes
) {
1906 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1914 #define SWAP2BYTE(VALUE) \
1916 GLubyte *bytes = (GLubyte *) &(VALUE); \
1917 GLubyte tmp = bytes[0]; \
1918 bytes[0] = bytes[1]; \
1922 #define SWAP4BYTE(VALUE) \
1924 GLubyte *bytes = (GLubyte *) &(VALUE); \
1925 GLubyte tmp = bytes[0]; \
1926 bytes[0] = bytes[3]; \
1929 bytes[1] = bytes[2]; \
1935 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1936 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1937 const struct gl_pixelstore_attrib
*unpack
)
1939 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1941 ASSERT(srcType
== GL_BITMAP
||
1942 srcType
== GL_UNSIGNED_BYTE
||
1943 srcType
== GL_BYTE
||
1944 srcType
== GL_UNSIGNED_SHORT
||
1945 srcType
== GL_SHORT
||
1946 srcType
== GL_UNSIGNED_INT
||
1947 srcType
== GL_INT
||
1948 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1949 srcType
== GL_HALF_FLOAT_ARB
||
1950 srcType
== GL_FLOAT
);
1955 GLubyte
*ubsrc
= (GLubyte
*) src
;
1956 if (unpack
->LsbFirst
) {
1957 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1959 for (i
= 0; i
< n
; i
++) {
1960 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1971 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1973 for (i
= 0; i
< n
; i
++) {
1974 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1986 case GL_UNSIGNED_BYTE
:
1989 const GLubyte
*s
= (const GLubyte
*) src
;
1990 for (i
= 0; i
< n
; i
++)
1997 const GLbyte
*s
= (const GLbyte
*) src
;
1998 for (i
= 0; i
< n
; i
++)
2002 case GL_UNSIGNED_SHORT
:
2005 const GLushort
*s
= (const GLushort
*) src
;
2006 if (unpack
->SwapBytes
) {
2007 for (i
= 0; i
< n
; i
++) {
2008 GLushort value
= s
[i
];
2014 for (i
= 0; i
< n
; i
++)
2022 const GLshort
*s
= (const GLshort
*) src
;
2023 if (unpack
->SwapBytes
) {
2024 for (i
= 0; i
< n
; i
++) {
2025 GLshort value
= s
[i
];
2031 for (i
= 0; i
< n
; i
++)
2036 case GL_UNSIGNED_INT
:
2039 const GLuint
*s
= (const GLuint
*) src
;
2040 if (unpack
->SwapBytes
) {
2041 for (i
= 0; i
< n
; i
++) {
2042 GLuint value
= s
[i
];
2048 for (i
= 0; i
< n
; i
++)
2056 const GLint
*s
= (const GLint
*) src
;
2057 if (unpack
->SwapBytes
) {
2058 for (i
= 0; i
< n
; i
++) {
2065 for (i
= 0; i
< n
; i
++)
2073 const GLfloat
*s
= (const GLfloat
*) src
;
2074 if (unpack
->SwapBytes
) {
2075 for (i
= 0; i
< n
; i
++) {
2076 GLfloat value
= s
[i
];
2078 indexes
[i
] = (GLuint
) value
;
2082 for (i
= 0; i
< n
; i
++)
2083 indexes
[i
] = (GLuint
) s
[i
];
2087 case GL_HALF_FLOAT_ARB
:
2090 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2091 if (unpack
->SwapBytes
) {
2092 for (i
= 0; i
< n
; i
++) {
2093 GLhalfARB value
= s
[i
];
2095 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2099 for (i
= 0; i
< n
; i
++)
2100 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2104 case GL_UNSIGNED_INT_24_8_EXT
:
2107 const GLuint
*s
= (const GLuint
*) src
;
2108 if (unpack
->SwapBytes
) {
2109 for (i
= 0; i
< n
; i
++) {
2110 GLuint value
= s
[i
];
2112 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2116 for (i
= 0; i
< n
; i
++)
2117 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2123 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2130 * Return source/dest RGBA indexes for unpacking pixels.
2133 get_component_mapping(GLenum format
,
2145 case GL_RED_INTEGER_EXT
:
2147 *gSrc
= *bSrc
= *aSrc
= -1;
2150 case GL_GREEN_INTEGER_EXT
:
2152 *rSrc
= *bSrc
= *aSrc
= -1;
2155 case GL_BLUE_INTEGER_EXT
:
2157 *rSrc
= *gSrc
= *aSrc
= -1;
2160 case GL_ALPHA_INTEGER_EXT
:
2161 *rSrc
= *gSrc
= *bSrc
= -1;
2165 case GL_LUMINANCE_INTEGER_EXT
:
2166 *rSrc
= *gSrc
= *bSrc
= 0;
2169 case GL_LUMINANCE_ALPHA
:
2170 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2171 *rSrc
= *gSrc
= *bSrc
= 0;
2175 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2189 case GL_RGB_INTEGER
:
2210 case GL_RGBA_INTEGER
:
2248 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2249 _mesa_lookup_enum_by_nr(format
));
2257 * This function extracts floating point RGBA values from arbitrary
2258 * image data. srcFormat and srcType are the format and type parameters
2259 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2261 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2262 * implements the "Conversion to floating point", "Conversion to RGB",
2263 * and "Final Expansion to RGBA" operations.
2265 * Args: n - number of pixels
2266 * rgba - output colors
2267 * srcFormat - format of incoming data
2268 * srcType - data type of incoming data
2269 * src - source data pointer
2270 * swapBytes - perform byteswapping of incoming data?
2273 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2274 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2275 GLboolean swapBytes
)
2277 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2279 GLint rDst
, bDst
, gDst
, aDst
;
2280 GLboolean intFormat
;
2281 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2283 ASSERT(srcFormat
== GL_RED
||
2284 srcFormat
== GL_GREEN
||
2285 srcFormat
== GL_BLUE
||
2286 srcFormat
== GL_ALPHA
||
2287 srcFormat
== GL_LUMINANCE
||
2288 srcFormat
== GL_LUMINANCE_ALPHA
||
2289 srcFormat
== GL_INTENSITY
||
2290 srcFormat
== GL_RG
||
2291 srcFormat
== GL_RGB
||
2292 srcFormat
== GL_BGR
||
2293 srcFormat
== GL_RGBA
||
2294 srcFormat
== GL_BGRA
||
2295 srcFormat
== GL_ABGR_EXT
||
2296 srcFormat
== GL_DU8DV8_ATI
||
2297 srcFormat
== GL_DUDV_ATI
||
2298 srcFormat
== GL_RED_INTEGER_EXT
||
2299 srcFormat
== GL_GREEN_INTEGER_EXT
||
2300 srcFormat
== GL_BLUE_INTEGER_EXT
||
2301 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2302 srcFormat
== GL_RGB_INTEGER_EXT
||
2303 srcFormat
== GL_RGBA_INTEGER_EXT
||
2304 srcFormat
== GL_BGR_INTEGER_EXT
||
2305 srcFormat
== GL_BGRA_INTEGER_EXT
||
2306 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2307 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2309 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2310 srcType
== GL_BYTE
||
2311 srcType
== GL_UNSIGNED_SHORT
||
2312 srcType
== GL_SHORT
||
2313 srcType
== GL_UNSIGNED_INT
||
2314 srcType
== GL_INT
||
2315 srcType
== GL_HALF_FLOAT_ARB
||
2316 srcType
== GL_FLOAT
||
2317 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2318 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2319 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2320 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2321 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2322 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2323 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2324 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2325 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2326 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2327 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2328 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2330 get_component_mapping(srcFormat
,
2331 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2332 &rDst
, &gDst
, &bDst
, &aDst
);
2334 stride
= _mesa_components_in_format(srcFormat
);
2336 intFormat
= _mesa_is_integer_format(srcFormat
);
2338 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2339 if ((SRC_INDEX) < 0) { \
2342 for (i = 0; i < n; i++) { \
2343 rgba[i][DST_INDEX] = DEFAULT_INT; \
2347 for (i = 0; i < n; i++) { \
2348 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2352 else if (swapBytes) { \
2353 const TYPE *s = (const TYPE *) src; \
2355 for (i = 0; i < n; i++) { \
2356 TYPE value = s[SRC_INDEX]; \
2357 if (sizeof(TYPE) == 2) { \
2360 else if (sizeof(TYPE) == 4) { \
2364 rgba[i][DST_INDEX] = (GLfloat) value; \
2366 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2371 const TYPE *s = (const TYPE *) src; \
2374 for (i = 0; i < n; i++) { \
2375 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2380 for (i = 0; i < n; i++) { \
2381 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2388 case GL_UNSIGNED_BYTE
:
2389 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2390 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2391 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2392 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2395 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2396 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2397 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2398 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2400 case GL_UNSIGNED_SHORT
:
2401 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2402 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2403 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2404 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2407 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2408 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2409 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2410 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2412 case GL_UNSIGNED_INT
:
2413 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2414 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2415 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2416 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2419 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2420 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2421 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2422 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2425 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2426 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2427 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2428 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2430 case GL_HALF_FLOAT_ARB
:
2431 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2432 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2433 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2434 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2436 case GL_UNSIGNED_BYTE_3_3_2
:
2438 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2445 for (i
= 0; i
< n
; i
++) {
2446 GLubyte p
= ubsrc
[i
];
2447 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2448 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2449 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2450 rgba
[i
][aDst
] = 1.0F
;
2454 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2456 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2463 for (i
= 0; i
< n
; i
++) {
2464 GLubyte p
= ubsrc
[i
];
2465 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2466 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2467 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2468 rgba
[i
][aDst
] = 1.0F
;
2472 case GL_UNSIGNED_SHORT_5_6_5
:
2479 const GLushort
*ussrc
= (const GLushort
*) src
;
2481 for (i
= 0; i
< n
; i
++) {
2482 GLushort p
= ussrc
[i
];
2484 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2485 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2486 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2487 rgba
[i
][aDst
] = 1.0F
;
2491 const GLushort
*ussrc
= (const GLushort
*) src
;
2493 for (i
= 0; i
< n
; i
++) {
2494 GLushort p
= ussrc
[i
];
2495 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2496 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2497 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2498 rgba
[i
][aDst
] = 1.0F
;
2502 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2509 const GLushort
*ussrc
= (const GLushort
*) src
;
2511 for (i
= 0; i
< n
; i
++) {
2512 GLushort p
= ussrc
[i
];
2514 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2515 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2516 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2517 rgba
[i
][aDst
] = 1.0F
;
2521 const GLushort
*ussrc
= (const GLushort
*) src
;
2523 for (i
= 0; i
< n
; i
++) {
2524 GLushort p
= ussrc
[i
];
2525 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2526 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2527 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2528 rgba
[i
][aDst
] = 1.0F
;
2532 case GL_UNSIGNED_SHORT_4_4_4_4
:
2534 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2537 const GLushort
*ussrc
= (const GLushort
*) src
;
2539 for (i
= 0; i
< n
; i
++) {
2540 GLushort p
= ussrc
[i
];
2542 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2543 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2544 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2545 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2549 const GLushort
*ussrc
= (const GLushort
*) src
;
2551 for (i
= 0; i
< n
; i
++) {
2552 GLushort p
= ussrc
[i
];
2553 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2554 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2555 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2556 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2560 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2562 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2565 const GLushort
*ussrc
= (const GLushort
*) src
;
2567 for (i
= 0; i
< n
; i
++) {
2568 GLushort p
= ussrc
[i
];
2570 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2571 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2572 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2573 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2577 const GLushort
*ussrc
= (const GLushort
*) src
;
2579 for (i
= 0; i
< n
; i
++) {
2580 GLushort p
= ussrc
[i
];
2581 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2582 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2583 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2584 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2588 case GL_UNSIGNED_SHORT_5_5_5_1
:
2590 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2593 const GLushort
*ussrc
= (const GLushort
*) src
;
2595 for (i
= 0; i
< n
; i
++) {
2596 GLushort p
= ussrc
[i
];
2598 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2599 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2600 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2601 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2605 const GLushort
*ussrc
= (const GLushort
*) src
;
2607 for (i
= 0; i
< n
; i
++) {
2608 GLushort p
= ussrc
[i
];
2609 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2610 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2611 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2612 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2616 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2618 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2621 const GLushort
*ussrc
= (const GLushort
*) src
;
2623 for (i
= 0; i
< n
; i
++) {
2624 GLushort p
= ussrc
[i
];
2626 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2627 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2628 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2629 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2633 const GLushort
*ussrc
= (const GLushort
*) src
;
2635 for (i
= 0; i
< n
; i
++) {
2636 GLushort p
= ussrc
[i
];
2637 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2638 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2639 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2640 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2644 case GL_UNSIGNED_INT_8_8_8_8
:
2646 const GLuint
*uisrc
= (const GLuint
*) src
;
2649 for (i
= 0; i
< n
; i
++) {
2650 GLuint p
= uisrc
[i
];
2651 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2652 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2653 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2654 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2658 for (i
= 0; i
< n
; i
++) {
2659 GLuint p
= uisrc
[i
];
2660 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2661 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2662 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2663 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2668 const GLuint
*uisrc
= (const GLuint
*) src
;
2671 for (i
= 0; i
< n
; i
++) {
2672 GLuint p
= uisrc
[i
];
2673 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2674 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2675 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2676 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2680 for (i
= 0; i
< n
; i
++) {
2681 GLuint p
= uisrc
[i
];
2682 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2683 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2684 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2685 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2690 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2692 const GLuint
*uisrc
= (const GLuint
*) src
;
2695 for (i
= 0; i
< n
; i
++) {
2696 GLuint p
= uisrc
[i
];
2697 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2698 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2699 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2700 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2704 for (i
= 0; i
< n
; i
++) {
2705 GLuint p
= uisrc
[i
];
2706 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2707 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2708 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2709 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2714 const GLuint
*uisrc
= (const GLuint
*) src
;
2717 for (i
= 0; i
< n
; i
++) {
2718 GLuint p
= uisrc
[i
];
2719 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2720 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2721 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2722 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2726 for (i
= 0; i
< n
; i
++) {
2727 GLuint p
= uisrc
[i
];
2728 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2729 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2730 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2731 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2736 case GL_UNSIGNED_INT_10_10_10_2
:
2738 rs
= 1.0F
/ 1023.0F
;
2739 gs
= 1.0F
/ 1023.0F
;
2740 bs
= 1.0F
/ 1023.0F
;
2744 const GLuint
*uisrc
= (const GLuint
*) src
;
2746 for (i
= 0; i
< n
; i
++) {
2747 GLuint p
= uisrc
[i
];
2749 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2750 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2751 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2752 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2756 const GLuint
*uisrc
= (const GLuint
*) src
;
2758 for (i
= 0; i
< n
; i
++) {
2759 GLuint p
= uisrc
[i
];
2760 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2761 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2762 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2763 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2767 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2769 rs
= 1.0F
/ 1023.0F
;
2770 gs
= 1.0F
/ 1023.0F
;
2771 bs
= 1.0F
/ 1023.0F
;
2775 const GLuint
*uisrc
= (const GLuint
*) src
;
2777 for (i
= 0; i
< n
; i
++) {
2778 GLuint p
= uisrc
[i
];
2780 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2781 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2782 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2783 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2787 const GLuint
*uisrc
= (const GLuint
*) src
;
2789 for (i
= 0; i
< n
; i
++) {
2790 GLuint p
= uisrc
[i
];
2791 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2792 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2793 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2794 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2799 _mesa_problem(NULL
, "bad srcType in extract float data");
2806 static INLINE GLuint
2807 clamp_byte_to_uint(GLbyte b
)
2809 return b
< 0 ? 0 : b
;
2813 static INLINE GLuint
2814 clamp_short_to_uint(GLshort s
)
2816 return s
< 0 ? 0 : s
;
2820 static INLINE GLuint
2821 clamp_int_to_uint(GLint i
)
2823 return i
< 0 ? 0 : i
;
2827 static INLINE GLuint
2828 clamp_float_to_uint(GLfloat f
)
2830 return f
< 0.0F
? 0 : IROUND(f
);
2834 static INLINE GLuint
2835 clamp_half_to_uint(GLhalfARB h
)
2837 GLfloat f
= _mesa_half_to_float(h
);
2838 return f
< 0.0F
? 0 : IROUND(f
);
2843 * \sa extract_float_rgba()
2846 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2847 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2848 GLboolean swapBytes
)
2850 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2852 GLint rDst
, bDst
, gDst
, aDst
;
2853 GLboolean intFormat
;
2855 ASSERT(srcFormat
== GL_RED
||
2856 srcFormat
== GL_GREEN
||
2857 srcFormat
== GL_BLUE
||
2858 srcFormat
== GL_ALPHA
||
2859 srcFormat
== GL_LUMINANCE
||
2860 srcFormat
== GL_LUMINANCE_ALPHA
||
2861 srcFormat
== GL_INTENSITY
||
2862 srcFormat
== GL_RG
||
2863 srcFormat
== GL_RGB
||
2864 srcFormat
== GL_BGR
||
2865 srcFormat
== GL_RGBA
||
2866 srcFormat
== GL_BGRA
||
2867 srcFormat
== GL_ABGR_EXT
||
2868 srcFormat
== GL_DU8DV8_ATI
||
2869 srcFormat
== GL_DUDV_ATI
||
2870 srcFormat
== GL_RED_INTEGER_EXT
||
2871 srcFormat
== GL_GREEN_INTEGER_EXT
||
2872 srcFormat
== GL_BLUE_INTEGER_EXT
||
2873 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2874 srcFormat
== GL_RGB_INTEGER_EXT
||
2875 srcFormat
== GL_RGBA_INTEGER_EXT
||
2876 srcFormat
== GL_BGR_INTEGER_EXT
||
2877 srcFormat
== GL_BGRA_INTEGER_EXT
||
2878 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2879 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2881 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2882 srcType
== GL_BYTE
||
2883 srcType
== GL_UNSIGNED_SHORT
||
2884 srcType
== GL_SHORT
||
2885 srcType
== GL_UNSIGNED_INT
||
2886 srcType
== GL_INT
||
2887 srcType
== GL_HALF_FLOAT_ARB
||
2888 srcType
== GL_FLOAT
||
2889 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2890 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2891 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2892 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2893 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2894 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2895 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2896 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2897 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2898 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2899 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2900 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2902 get_component_mapping(srcFormat
,
2903 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2904 &rDst
, &gDst
, &bDst
, &aDst
);
2906 stride
= _mesa_components_in_format(srcFormat
);
2908 intFormat
= _mesa_is_integer_format(srcFormat
);
2910 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2911 if ((SRC_INDEX) < 0) { \
2913 for (i = 0; i < n; i++) { \
2914 rgba[i][DST_INDEX] = DEFAULT; \
2917 else if (swapBytes) { \
2918 const TYPE *s = (const TYPE *) src; \
2920 for (i = 0; i < n; i++) { \
2921 TYPE value = s[SRC_INDEX]; \
2922 if (sizeof(TYPE) == 2) { \
2925 else if (sizeof(TYPE) == 4) { \
2928 rgba[i][DST_INDEX] = CONVERSION(value); \
2933 const TYPE *s = (const TYPE *) src; \
2935 for (i = 0; i < n; i++) { \
2936 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2942 case GL_UNSIGNED_BYTE
:
2943 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2944 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2945 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2946 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2949 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2950 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2951 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2952 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2954 case GL_UNSIGNED_SHORT
:
2955 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2956 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2957 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2958 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2961 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2962 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2963 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2964 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2966 case GL_UNSIGNED_INT
:
2967 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2968 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2969 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2970 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2973 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2974 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2975 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2976 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2979 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2980 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2981 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2982 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
2984 case GL_HALF_FLOAT_ARB
:
2985 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2986 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2987 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2988 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
2990 case GL_UNSIGNED_BYTE_3_3_2
:
2992 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2994 for (i
= 0; i
< n
; i
++) {
2995 GLubyte p
= ubsrc
[i
];
2996 rgba
[i
][rDst
] = ((p
>> 5) );
2997 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
2998 rgba
[i
][bDst
] = ((p
) & 0x3);
3003 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3005 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3007 for (i
= 0; i
< n
; i
++) {
3008 GLubyte p
= ubsrc
[i
];
3009 rgba
[i
][rDst
] = ((p
) & 0x7);
3010 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3011 rgba
[i
][bDst
] = ((p
>> 6) );
3016 case GL_UNSIGNED_SHORT_5_6_5
:
3018 const GLushort
*ussrc
= (const GLushort
*) src
;
3020 for (i
= 0; i
< n
; i
++) {
3021 GLushort p
= ussrc
[i
];
3023 rgba
[i
][rDst
] = ((p
>> 11) );
3024 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3025 rgba
[i
][bDst
] = ((p
) & 0x1f);
3030 const GLushort
*ussrc
= (const GLushort
*) src
;
3032 for (i
= 0; i
< n
; i
++) {
3033 GLushort p
= ussrc
[i
];
3034 rgba
[i
][rDst
] = ((p
>> 11) );
3035 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3036 rgba
[i
][bDst
] = ((p
) & 0x1f);
3041 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3043 const GLushort
*ussrc
= (const GLushort
*) src
;
3045 for (i
= 0; i
< n
; i
++) {
3046 GLushort p
= ussrc
[i
];
3048 rgba
[i
][rDst
] = ((p
) & 0x1f);
3049 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3050 rgba
[i
][bDst
] = ((p
>> 11) );
3055 const GLushort
*ussrc
= (const GLushort
*) src
;
3057 for (i
= 0; i
< n
; i
++) {
3058 GLushort p
= ussrc
[i
];
3059 rgba
[i
][rDst
] = ((p
) & 0x1f);
3060 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3061 rgba
[i
][bDst
] = ((p
>> 11) );
3066 case GL_UNSIGNED_SHORT_4_4_4_4
:
3068 const GLushort
*ussrc
= (const GLushort
*) src
;
3070 for (i
= 0; i
< n
; i
++) {
3071 GLushort p
= ussrc
[i
];
3073 rgba
[i
][rDst
] = ((p
>> 12) );
3074 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3075 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3076 rgba
[i
][aDst
] = ((p
) & 0xf);
3080 const GLushort
*ussrc
= (const GLushort
*) src
;
3082 for (i
= 0; i
< n
; i
++) {
3083 GLushort p
= ussrc
[i
];
3084 rgba
[i
][rDst
] = ((p
>> 12) );
3085 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3086 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3087 rgba
[i
][aDst
] = ((p
) & 0xf);
3091 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3093 const GLushort
*ussrc
= (const GLushort
*) src
;
3095 for (i
= 0; i
< n
; i
++) {
3096 GLushort p
= ussrc
[i
];
3098 rgba
[i
][rDst
] = ((p
) & 0xf);
3099 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3100 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3101 rgba
[i
][aDst
] = ((p
>> 12) );
3105 const GLushort
*ussrc
= (const GLushort
*) src
;
3107 for (i
= 0; i
< n
; i
++) {
3108 GLushort p
= ussrc
[i
];
3109 rgba
[i
][rDst
] = ((p
) & 0xf);
3110 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3111 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3112 rgba
[i
][aDst
] = ((p
>> 12) );
3116 case GL_UNSIGNED_SHORT_5_5_5_1
:
3118 const GLushort
*ussrc
= (const GLushort
*) src
;
3120 for (i
= 0; i
< n
; i
++) {
3121 GLushort p
= ussrc
[i
];
3123 rgba
[i
][rDst
] = ((p
>> 11) );
3124 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3125 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3126 rgba
[i
][aDst
] = ((p
) & 0x1 );
3130 const GLushort
*ussrc
= (const GLushort
*) src
;
3132 for (i
= 0; i
< n
; i
++) {
3133 GLushort p
= ussrc
[i
];
3134 rgba
[i
][rDst
] = ((p
>> 11) );
3135 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3136 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3137 rgba
[i
][aDst
] = ((p
) & 0x1 );
3141 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3143 const GLushort
*ussrc
= (const GLushort
*) src
;
3145 for (i
= 0; i
< n
; i
++) {
3146 GLushort p
= ussrc
[i
];
3148 rgba
[i
][rDst
] = ((p
) & 0x1f);
3149 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3150 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3151 rgba
[i
][aDst
] = ((p
>> 15) );
3155 const GLushort
*ussrc
= (const GLushort
*) src
;
3157 for (i
= 0; i
< n
; i
++) {
3158 GLushort p
= ussrc
[i
];
3159 rgba
[i
][rDst
] = ((p
) & 0x1f);
3160 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3161 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3162 rgba
[i
][aDst
] = ((p
>> 15) );
3166 case GL_UNSIGNED_INT_8_8_8_8
:
3168 const GLuint
*uisrc
= (const GLuint
*) src
;
3170 for (i
= 0; i
< n
; i
++) {
3171 GLuint p
= uisrc
[i
];
3172 rgba
[i
][rDst
] = ((p
) & 0xff);
3173 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3174 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3175 rgba
[i
][aDst
] = ((p
>> 24) );
3179 const GLuint
*uisrc
= (const GLuint
*) src
;
3181 for (i
= 0; i
< n
; i
++) {
3182 GLuint p
= uisrc
[i
];
3183 rgba
[i
][rDst
] = ((p
>> 24) );
3184 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3185 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3186 rgba
[i
][aDst
] = ((p
) & 0xff);
3190 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3192 const GLuint
*uisrc
= (const GLuint
*) src
;
3194 for (i
= 0; i
< n
; i
++) {
3195 GLuint p
= uisrc
[i
];
3196 rgba
[i
][rDst
] = ((p
>> 24) );
3197 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3198 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3199 rgba
[i
][aDst
] = ((p
) & 0xff);
3203 const GLuint
*uisrc
= (const GLuint
*) src
;
3205 for (i
= 0; i
< n
; i
++) {
3206 GLuint p
= uisrc
[i
];
3207 rgba
[i
][rDst
] = ((p
) & 0xff);
3208 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3209 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3210 rgba
[i
][aDst
] = ((p
>> 24) );
3214 case GL_UNSIGNED_INT_10_10_10_2
:
3216 const GLuint
*uisrc
= (const GLuint
*) src
;
3218 for (i
= 0; i
< n
; i
++) {
3219 GLuint p
= uisrc
[i
];
3221 rgba
[i
][rDst
] = ((p
>> 22) );
3222 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3223 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3224 rgba
[i
][aDst
] = ((p
) & 0x3 );
3228 const GLuint
*uisrc
= (const GLuint
*) src
;
3230 for (i
= 0; i
< n
; i
++) {
3231 GLuint p
= uisrc
[i
];
3232 rgba
[i
][rDst
] = ((p
>> 22) );
3233 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3234 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3235 rgba
[i
][aDst
] = ((p
) & 0x3 );
3239 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3241 const GLuint
*uisrc
= (const GLuint
*) src
;
3243 for (i
= 0; i
< n
; i
++) {
3244 GLuint p
= uisrc
[i
];
3246 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3247 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3248 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3249 rgba
[i
][aDst
] = ((p
>> 30) );
3253 const GLuint
*uisrc
= (const GLuint
*) src
;
3255 for (i
= 0; i
< n
; i
++) {
3256 GLuint p
= uisrc
[i
];
3257 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3258 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3259 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3260 rgba
[i
][aDst
] = ((p
>> 30) );
3265 _mesa_problem(NULL
, "bad srcType in extract uint data");
3274 * Unpack a row of color image data from a client buffer according to
3275 * the pixel unpacking parameters.
3276 * Return GLchan values in the specified dest image format.
3277 * This is used by glDrawPixels and glTexImage?D().
3278 * \param ctx - the context
3279 * n - number of pixels in the span
3280 * dstFormat - format of destination color array
3281 * dest - the destination color array
3282 * srcFormat - source image format
3283 * srcType - source image data type
3284 * source - source image pointer
3285 * srcPacking - pixel unpacking parameters
3286 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3288 * XXX perhaps expand this to process whole images someday.
3291 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3292 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3293 GLenum srcFormat
, GLenum srcType
,
3294 const GLvoid
*source
,
3295 const struct gl_pixelstore_attrib
*srcPacking
,
3296 GLbitfield transferOps
)
3298 ASSERT(dstFormat
== GL_ALPHA
||
3299 dstFormat
== GL_LUMINANCE
||
3300 dstFormat
== GL_LUMINANCE_ALPHA
||
3301 dstFormat
== GL_INTENSITY
||
3302 dstFormat
== GL_RED
||
3303 dstFormat
== GL_RG
||
3304 dstFormat
== GL_RGB
||
3305 dstFormat
== GL_RGBA
||
3306 dstFormat
== GL_COLOR_INDEX
);
3308 ASSERT(srcFormat
== GL_RED
||
3309 srcFormat
== GL_GREEN
||
3310 srcFormat
== GL_BLUE
||
3311 srcFormat
== GL_ALPHA
||
3312 srcFormat
== GL_LUMINANCE
||
3313 srcFormat
== GL_LUMINANCE_ALPHA
||
3314 srcFormat
== GL_INTENSITY
||
3315 srcFormat
== GL_RG
||
3316 srcFormat
== GL_RGB
||
3317 srcFormat
== GL_BGR
||
3318 srcFormat
== GL_RGBA
||
3319 srcFormat
== GL_BGRA
||
3320 srcFormat
== GL_ABGR_EXT
||
3321 srcFormat
== GL_COLOR_INDEX
);
3323 ASSERT(srcType
== GL_BITMAP
||
3324 srcType
== GL_UNSIGNED_BYTE
||
3325 srcType
== GL_BYTE
||
3326 srcType
== GL_UNSIGNED_SHORT
||
3327 srcType
== GL_SHORT
||
3328 srcType
== GL_UNSIGNED_INT
||
3329 srcType
== GL_INT
||
3330 srcType
== GL_HALF_FLOAT_ARB
||
3331 srcType
== GL_FLOAT
||
3332 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3333 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3334 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3335 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3336 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3337 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3338 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3339 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3340 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3341 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3342 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3343 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3345 /* Try simple cases first */
3346 if (transferOps
== 0) {
3347 if (srcType
== CHAN_TYPE
) {
3348 if (dstFormat
== GL_RGBA
) {
3349 if (srcFormat
== GL_RGBA
) {
3350 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3353 else if (srcFormat
== GL_RGB
) {
3355 const GLchan
*src
= (const GLchan
*) source
;
3357 for (i
= 0; i
< n
; i
++) {
3368 else if (dstFormat
== GL_RGB
) {
3369 if (srcFormat
== GL_RGB
) {
3370 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3373 else if (srcFormat
== GL_RGBA
) {
3375 const GLchan
*src
= (const GLchan
*) source
;
3377 for (i
= 0; i
< n
; i
++) {
3387 else if (dstFormat
== srcFormat
) {
3388 GLint comps
= _mesa_components_in_format(srcFormat
);
3390 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3395 * Common situation, loading 8bit RGBA/RGB source images
3396 * into 16/32 bit destination. (OSMesa16/32)
3398 else if (srcType
== GL_UNSIGNED_BYTE
) {
3399 if (dstFormat
== GL_RGBA
) {
3400 if (srcFormat
== GL_RGB
) {
3402 const GLubyte
*src
= (const GLubyte
*) source
;
3404 for (i
= 0; i
< n
; i
++) {
3405 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3406 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3407 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3414 else if (srcFormat
== GL_RGBA
) {
3416 const GLubyte
*src
= (const GLubyte
*) source
;
3418 for (i
= 0; i
< n
; i
++) {
3419 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3420 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3421 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3422 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3429 else if (dstFormat
== GL_RGB
) {
3430 if (srcFormat
== GL_RGB
) {
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]);
3443 else if (srcFormat
== GL_RGBA
) {
3445 const GLubyte
*src
= (const GLubyte
*) source
;
3447 for (i
= 0; i
< n
; i
++) {
3448 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3449 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3450 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3461 /* general solution begins here */
3463 GLint dstComponents
;
3464 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3465 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3468 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3472 dstComponents
= _mesa_components_in_format( dstFormat
);
3473 /* source & dest image formats should have been error checked by now */
3474 assert(dstComponents
> 0);
3477 * Extract image data and convert to RGBA floats
3479 assert(n
<= MAX_WIDTH
);
3480 if (srcFormat
== GL_COLOR_INDEX
) {
3481 GLuint indexes
[MAX_WIDTH
];
3482 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3485 if (dstFormat
== GL_COLOR_INDEX
) {
3487 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3488 /* convert to GLchan and return */
3489 for (i
= 0; i
< n
; i
++) {
3490 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3496 /* Convert indexes to RGBA */
3497 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3498 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3500 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3503 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3504 * with color indexes.
3506 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3509 /* non-color index data */
3510 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3511 srcPacking
->SwapBytes
);
3514 /* Need to clamp if returning GLubytes or GLushorts */
3515 #if CHAN_TYPE != GL_FLOAT
3516 transferOps
|= IMAGE_CLAMP_BIT
;
3520 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3523 get_component_indexes(dstFormat
,
3524 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3526 /* Now return the GLchan data in the requested dstFormat */
3530 for (i
= 0; i
< n
; i
++) {
3531 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3532 dst
+= dstComponents
;
3539 for (i
= 0; i
< n
; i
++) {
3540 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3541 dst
+= dstComponents
;
3548 for (i
= 0; i
< n
; i
++) {
3549 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3550 dst
+= dstComponents
;
3557 for (i
= 0; i
< n
; i
++) {
3558 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3559 dst
+= dstComponents
;
3567 assert(dstComponents
== 1);
3568 for (i
= 0; i
< n
; i
++) {
3569 /* Intensity comes from red channel */
3570 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3578 for (i
= 0; i
< n
; i
++) {
3579 /* Luminance comes from red channel */
3580 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3581 dst
+= dstComponents
;
3591 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3592 * instead of GLchan.
3595 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3596 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3597 GLenum srcFormat
, GLenum srcType
,
3598 const GLvoid
*source
,
3599 const struct gl_pixelstore_attrib
*srcPacking
,
3600 GLbitfield transferOps
)
3602 ASSERT(dstFormat
== GL_ALPHA
||
3603 dstFormat
== GL_LUMINANCE
||
3604 dstFormat
== GL_LUMINANCE_ALPHA
||
3605 dstFormat
== GL_INTENSITY
||
3606 dstFormat
== GL_RED
||
3607 dstFormat
== GL_RG
||
3608 dstFormat
== GL_RGB
||
3609 dstFormat
== GL_RGBA
||
3610 dstFormat
== GL_COLOR_INDEX
);
3612 ASSERT(srcFormat
== GL_RED
||
3613 srcFormat
== GL_GREEN
||
3614 srcFormat
== GL_BLUE
||
3615 srcFormat
== GL_ALPHA
||
3616 srcFormat
== GL_LUMINANCE
||
3617 srcFormat
== GL_LUMINANCE_ALPHA
||
3618 srcFormat
== GL_INTENSITY
||
3619 srcFormat
== GL_RG
||
3620 srcFormat
== GL_RGB
||
3621 srcFormat
== GL_BGR
||
3622 srcFormat
== GL_RGBA
||
3623 srcFormat
== GL_BGRA
||
3624 srcFormat
== GL_ABGR_EXT
||
3625 srcFormat
== GL_RED_INTEGER_EXT
||
3626 srcFormat
== GL_GREEN_INTEGER_EXT
||
3627 srcFormat
== GL_BLUE_INTEGER_EXT
||
3628 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3629 srcFormat
== GL_RGB_INTEGER_EXT
||
3630 srcFormat
== GL_RGBA_INTEGER_EXT
||
3631 srcFormat
== GL_BGR_INTEGER_EXT
||
3632 srcFormat
== GL_BGRA_INTEGER_EXT
||
3633 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3634 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3635 srcFormat
== GL_COLOR_INDEX
);
3637 ASSERT(srcType
== GL_BITMAP
||
3638 srcType
== GL_UNSIGNED_BYTE
||
3639 srcType
== GL_BYTE
||
3640 srcType
== GL_UNSIGNED_SHORT
||
3641 srcType
== GL_SHORT
||
3642 srcType
== GL_UNSIGNED_INT
||
3643 srcType
== GL_INT
||
3644 srcType
== GL_HALF_FLOAT_ARB
||
3645 srcType
== GL_FLOAT
||
3646 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3647 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3648 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3649 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3650 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3651 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3652 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3653 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3654 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3655 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3656 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3657 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3659 /* general solution, no special cases, yet */
3661 GLint dstComponents
;
3662 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3663 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3666 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3670 dstComponents
= _mesa_components_in_format( dstFormat
);
3671 /* source & dest image formats should have been error checked by now */
3672 assert(dstComponents
> 0);
3675 * Extract image data and convert to RGBA floats
3677 assert(n
<= MAX_WIDTH
);
3678 if (srcFormat
== GL_COLOR_INDEX
) {
3679 GLuint indexes
[MAX_WIDTH
];
3680 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3683 if (dstFormat
== GL_COLOR_INDEX
) {
3685 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3686 /* convert to GLchan and return */
3687 for (i
= 0; i
< n
; i
++) {
3688 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3694 /* Convert indexes to RGBA */
3695 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3696 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3698 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3701 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3702 * with color indexes.
3704 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3709 /* non-color index data */
3710 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3711 srcPacking
->SwapBytes
);
3715 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3718 get_component_indexes(dstFormat
,
3719 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3721 /* Now pack results in the requested dstFormat */
3723 GLfloat
*dst
= dest
;
3725 for (i
= 0; i
< n
; i
++) {
3726 dst
[rDst
] = rgba
[i
][RCOMP
];
3727 dst
+= dstComponents
;
3732 GLfloat
*dst
= dest
;
3734 for (i
= 0; i
< n
; i
++) {
3735 dst
[gDst
] = rgba
[i
][GCOMP
];
3736 dst
+= dstComponents
;
3741 GLfloat
*dst
= dest
;
3743 for (i
= 0; i
< n
; i
++) {
3744 dst
[bDst
] = rgba
[i
][BCOMP
];
3745 dst
+= dstComponents
;
3750 GLfloat
*dst
= dest
;
3752 for (i
= 0; i
< n
; i
++) {
3753 dst
[aDst
] = rgba
[i
][ACOMP
];
3754 dst
+= dstComponents
;
3759 GLfloat
*dst
= dest
;
3762 assert(dstComponents
== 1);
3763 for (i
= 0; i
< n
; i
++) {
3764 /* Intensity comes from red channel */
3765 dst
[i
] = rgba
[i
][RCOMP
];
3770 GLfloat
*dst
= dest
;
3773 for (i
= 0; i
< n
; i
++) {
3774 /* Luminance comes from red channel */
3775 dst
[0] = rgba
[i
][RCOMP
];
3776 dst
+= dstComponents
;
3784 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3785 * instead of GLchan.
3786 * No pixel transfer ops are applied.
3789 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3790 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3791 GLenum srcFormat
, GLenum srcType
,
3792 const GLvoid
*source
,
3793 const struct gl_pixelstore_attrib
*srcPacking
)
3795 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3798 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3802 ASSERT(n
<= MAX_WIDTH
);
3804 ASSERT(dstFormat
== GL_ALPHA
||
3805 dstFormat
== GL_LUMINANCE
||
3806 dstFormat
== GL_LUMINANCE_ALPHA
||
3807 dstFormat
== GL_INTENSITY
||
3808 dstFormat
== GL_RED
||
3809 dstFormat
== GL_RG
||
3810 dstFormat
== GL_RGB
||
3811 dstFormat
== GL_RGBA
);
3813 ASSERT(srcFormat
== GL_RED
||
3814 srcFormat
== GL_GREEN
||
3815 srcFormat
== GL_BLUE
||
3816 srcFormat
== GL_ALPHA
||
3817 srcFormat
== GL_LUMINANCE
||
3818 srcFormat
== GL_LUMINANCE_ALPHA
||
3819 srcFormat
== GL_INTENSITY
||
3820 srcFormat
== GL_RG
||
3821 srcFormat
== GL_RGB
||
3822 srcFormat
== GL_BGR
||
3823 srcFormat
== GL_RGBA
||
3824 srcFormat
== GL_BGRA
||
3825 srcFormat
== GL_ABGR_EXT
||
3826 srcFormat
== GL_RED_INTEGER_EXT
||
3827 srcFormat
== GL_GREEN_INTEGER_EXT
||
3828 srcFormat
== GL_BLUE_INTEGER_EXT
||
3829 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3830 srcFormat
== GL_RGB_INTEGER_EXT
||
3831 srcFormat
== GL_RGBA_INTEGER_EXT
||
3832 srcFormat
== GL_BGR_INTEGER_EXT
||
3833 srcFormat
== GL_BGRA_INTEGER_EXT
||
3834 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3835 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3837 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3838 srcType
== GL_BYTE
||
3839 srcType
== GL_UNSIGNED_SHORT
||
3840 srcType
== GL_SHORT
||
3841 srcType
== GL_UNSIGNED_INT
||
3842 srcType
== GL_INT
||
3843 srcType
== GL_HALF_FLOAT_ARB
||
3844 srcType
== GL_FLOAT
||
3845 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3846 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3847 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3848 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3849 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3850 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3851 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3852 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3853 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3854 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3855 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3856 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3859 /* Extract image data as uint[4] pixels */
3860 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3861 srcPacking
->SwapBytes
);
3863 if (dstFormat
== GL_RGBA
) {
3865 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3869 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3870 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3872 assert(dstComponents
> 0);
3874 get_component_indexes(dstFormat
,
3875 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3877 /* Now pack values in the requested dest format */
3881 for (i
= 0; i
< n
; i
++) {
3882 dst
[rDst
] = rgba
[i
][RCOMP
];
3883 dst
+= dstComponents
;
3890 for (i
= 0; i
< n
; i
++) {
3891 dst
[gDst
] = rgba
[i
][GCOMP
];
3892 dst
+= dstComponents
;
3899 for (i
= 0; i
< n
; i
++) {
3900 dst
[bDst
] = rgba
[i
][BCOMP
];
3901 dst
+= dstComponents
;
3908 for (i
= 0; i
< n
; i
++) {
3909 dst
[aDst
] = rgba
[i
][ACOMP
];
3910 dst
+= dstComponents
;
3918 assert(dstComponents
== 1);
3919 for (i
= 0; i
< n
; i
++) {
3920 /* Intensity comes from red channel */
3921 dst
[i
] = rgba
[i
][RCOMP
];
3929 for (i
= 0; i
< n
; i
++) {
3930 /* Luminance comes from red channel */
3931 dst
[0] = rgba
[i
][RCOMP
];
3932 dst
+= dstComponents
;
3943 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3944 * directly return GLbyte data, no transfer ops apply.
3947 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3948 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3949 GLenum srcFormat
, GLenum srcType
,
3950 const GLvoid
*source
,
3951 const struct gl_pixelstore_attrib
*srcPacking
,
3952 GLbitfield transferOps
)
3954 ASSERT(dstFormat
== GL_DUDV_ATI
);
3955 ASSERT(srcFormat
== GL_DUDV_ATI
);
3957 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3958 srcType
== GL_BYTE
||
3959 srcType
== GL_UNSIGNED_SHORT
||
3960 srcType
== GL_SHORT
||
3961 srcType
== GL_UNSIGNED_INT
||
3962 srcType
== GL_INT
||
3963 srcType
== GL_HALF_FLOAT_ARB
||
3964 srcType
== GL_FLOAT
);
3966 /* general solution */
3968 GLint dstComponents
;
3971 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3974 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3978 dstComponents
= _mesa_components_in_format( dstFormat
);
3979 /* source & dest image formats should have been error checked by now */
3980 assert(dstComponents
> 0);
3983 * Extract image data and convert to RGBA floats
3985 assert(n
<= MAX_WIDTH
);
3986 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3987 srcPacking
->SwapBytes
);
3990 /* Now determine which color channels we need to produce.
3991 * And determine the dest index (offset) within each color tuple.
3994 /* Now pack results in the requested dstFormat */
3995 for (i
= 0; i
< n
; i
++) {
3996 /* not sure - need clamp[-1,1] here? */
3997 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
3998 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
3999 dst
+= dstComponents
;
4007 * Unpack a row of color index data from a client buffer according to
4008 * the pixel unpacking parameters.
4009 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4011 * Args: ctx - the context
4012 * n - number of pixels
4013 * dstType - destination data type
4014 * dest - destination array
4015 * srcType - source pixel type
4016 * source - source data pointer
4017 * srcPacking - pixel unpacking parameters
4018 * transferOps - the pixel transfer operations to apply
4021 _mesa_unpack_index_span( const struct gl_context
*ctx
, GLuint n
,
4022 GLenum dstType
, GLvoid
*dest
,
4023 GLenum srcType
, const GLvoid
*source
,
4024 const struct gl_pixelstore_attrib
*srcPacking
,
4025 GLbitfield transferOps
)
4027 ASSERT(srcType
== GL_BITMAP
||
4028 srcType
== GL_UNSIGNED_BYTE
||
4029 srcType
== GL_BYTE
||
4030 srcType
== GL_UNSIGNED_SHORT
||
4031 srcType
== GL_SHORT
||
4032 srcType
== GL_UNSIGNED_INT
||
4033 srcType
== GL_INT
||
4034 srcType
== GL_HALF_FLOAT_ARB
||
4035 srcType
== GL_FLOAT
);
4037 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4038 dstType
== GL_UNSIGNED_SHORT
||
4039 dstType
== GL_UNSIGNED_INT
);
4042 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4045 * Try simple cases first
4047 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4048 && dstType
== GL_UNSIGNED_BYTE
) {
4049 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4051 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4052 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4053 memcpy(dest
, source
, n
* sizeof(GLuint
));
4059 GLuint indexes
[MAX_WIDTH
];
4060 assert(n
<= MAX_WIDTH
);
4062 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4066 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4068 /* convert to dest type */
4070 case GL_UNSIGNED_BYTE
:
4072 GLubyte
*dst
= (GLubyte
*) dest
;
4074 for (i
= 0; i
< n
; i
++) {
4075 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4079 case GL_UNSIGNED_SHORT
:
4081 GLuint
*dst
= (GLuint
*) dest
;
4083 for (i
= 0; i
< n
; i
++) {
4084 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4088 case GL_UNSIGNED_INT
:
4089 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4092 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4099 _mesa_pack_index_span( const struct gl_context
*ctx
, GLuint n
,
4100 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4101 const struct gl_pixelstore_attrib
*dstPacking
,
4102 GLbitfield transferOps
)
4104 GLuint indexes
[MAX_WIDTH
];
4106 ASSERT(n
<= MAX_WIDTH
);
4108 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4110 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4111 /* make a copy of input */
4112 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4113 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4118 case GL_UNSIGNED_BYTE
:
4120 GLubyte
*dst
= (GLubyte
*) dest
;
4122 for (i
= 0; i
< n
; i
++) {
4123 *dst
++ = (GLubyte
) source
[i
];
4129 GLbyte
*dst
= (GLbyte
*) dest
;
4131 for (i
= 0; i
< n
; i
++) {
4132 dst
[i
] = (GLbyte
) source
[i
];
4136 case GL_UNSIGNED_SHORT
:
4138 GLushort
*dst
= (GLushort
*) dest
;
4140 for (i
= 0; i
< n
; i
++) {
4141 dst
[i
] = (GLushort
) source
[i
];
4143 if (dstPacking
->SwapBytes
) {
4144 _mesa_swap2( (GLushort
*) dst
, n
);
4150 GLshort
*dst
= (GLshort
*) dest
;
4152 for (i
= 0; i
< n
; i
++) {
4153 dst
[i
] = (GLshort
) source
[i
];
4155 if (dstPacking
->SwapBytes
) {
4156 _mesa_swap2( (GLushort
*) dst
, n
);
4160 case GL_UNSIGNED_INT
:
4162 GLuint
*dst
= (GLuint
*) dest
;
4164 for (i
= 0; i
< n
; i
++) {
4165 dst
[i
] = (GLuint
) source
[i
];
4167 if (dstPacking
->SwapBytes
) {
4168 _mesa_swap4( (GLuint
*) dst
, n
);
4174 GLint
*dst
= (GLint
*) dest
;
4176 for (i
= 0; i
< n
; i
++) {
4177 dst
[i
] = (GLint
) source
[i
];
4179 if (dstPacking
->SwapBytes
) {
4180 _mesa_swap4( (GLuint
*) dst
, n
);
4186 GLfloat
*dst
= (GLfloat
*) dest
;
4188 for (i
= 0; i
< n
; i
++) {
4189 dst
[i
] = (GLfloat
) source
[i
];
4191 if (dstPacking
->SwapBytes
) {
4192 _mesa_swap4( (GLuint
*) dst
, n
);
4196 case GL_HALF_FLOAT_ARB
:
4198 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4200 for (i
= 0; i
< n
; i
++) {
4201 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4203 if (dstPacking
->SwapBytes
) {
4204 _mesa_swap2( (GLushort
*) dst
, n
);
4209 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4215 * Unpack a row of stencil data from a client buffer according to
4216 * the pixel unpacking parameters.
4217 * This is (or will be) used by glDrawPixels
4219 * Args: ctx - the context
4220 * n - number of pixels
4221 * dstType - destination data type
4222 * dest - destination array
4223 * srcType - source pixel type
4224 * source - source data pointer
4225 * srcPacking - pixel unpacking parameters
4226 * transferOps - apply offset/bias/lookup ops?
4229 _mesa_unpack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4230 GLenum dstType
, GLvoid
*dest
,
4231 GLenum srcType
, const GLvoid
*source
,
4232 const struct gl_pixelstore_attrib
*srcPacking
,
4233 GLbitfield transferOps
)
4235 ASSERT(srcType
== GL_BITMAP
||
4236 srcType
== GL_UNSIGNED_BYTE
||
4237 srcType
== GL_BYTE
||
4238 srcType
== GL_UNSIGNED_SHORT
||
4239 srcType
== GL_SHORT
||
4240 srcType
== GL_UNSIGNED_INT
||
4241 srcType
== GL_INT
||
4242 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4243 srcType
== GL_HALF_FLOAT_ARB
||
4244 srcType
== GL_FLOAT
);
4246 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4247 dstType
== GL_UNSIGNED_SHORT
||
4248 dstType
== GL_UNSIGNED_INT
);
4250 /* only shift and offset apply to stencil */
4251 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4254 * Try simple cases first
4256 if (transferOps
== 0 &&
4257 !ctx
->Pixel
.MapStencilFlag
&&
4258 srcType
== GL_UNSIGNED_BYTE
&&
4259 dstType
== GL_UNSIGNED_BYTE
) {
4260 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4262 else if (transferOps
== 0 &&
4263 !ctx
->Pixel
.MapStencilFlag
&&
4264 srcType
== GL_UNSIGNED_INT
&&
4265 dstType
== GL_UNSIGNED_INT
&&
4266 !srcPacking
->SwapBytes
) {
4267 memcpy(dest
, source
, n
* sizeof(GLuint
));
4273 GLuint indexes
[MAX_WIDTH
];
4274 assert(n
<= MAX_WIDTH
);
4276 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4279 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4280 /* shift and offset indexes */
4281 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4284 if (ctx
->Pixel
.MapStencilFlag
) {
4285 /* Apply stencil lookup table */
4286 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4288 for (i
= 0; i
< n
; i
++) {
4289 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4293 /* convert to dest type */
4295 case GL_UNSIGNED_BYTE
:
4297 GLubyte
*dst
= (GLubyte
*) dest
;
4299 for (i
= 0; i
< n
; i
++) {
4300 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4304 case GL_UNSIGNED_SHORT
:
4306 GLuint
*dst
= (GLuint
*) dest
;
4308 for (i
= 0; i
< n
; i
++) {
4309 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4313 case GL_UNSIGNED_INT
:
4314 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4317 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4324 _mesa_pack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4325 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4326 const struct gl_pixelstore_attrib
*dstPacking
)
4328 GLstencil stencil
[MAX_WIDTH
];
4330 ASSERT(n
<= MAX_WIDTH
);
4332 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4333 ctx
->Pixel
.MapStencilFlag
) {
4334 /* make a copy of input */
4335 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4336 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4341 case GL_UNSIGNED_BYTE
:
4342 if (sizeof(GLstencil
) == 1) {
4343 memcpy( dest
, source
, n
);
4346 GLubyte
*dst
= (GLubyte
*) dest
;
4349 dst
[i
] = (GLubyte
) source
[i
];
4355 GLbyte
*dst
= (GLbyte
*) dest
;
4358 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4362 case GL_UNSIGNED_SHORT
:
4364 GLushort
*dst
= (GLushort
*) dest
;
4367 dst
[i
] = (GLushort
) source
[i
];
4369 if (dstPacking
->SwapBytes
) {
4370 _mesa_swap2( (GLushort
*) dst
, n
);
4376 GLshort
*dst
= (GLshort
*) dest
;
4379 dst
[i
] = (GLshort
) source
[i
];
4381 if (dstPacking
->SwapBytes
) {
4382 _mesa_swap2( (GLushort
*) dst
, n
);
4386 case GL_UNSIGNED_INT
:
4388 GLuint
*dst
= (GLuint
*) dest
;
4391 dst
[i
] = (GLuint
) source
[i
];
4393 if (dstPacking
->SwapBytes
) {
4394 _mesa_swap4( (GLuint
*) dst
, n
);
4400 GLint
*dst
= (GLint
*) dest
;
4403 dst
[i
] = (GLint
) source
[i
];
4405 if (dstPacking
->SwapBytes
) {
4406 _mesa_swap4( (GLuint
*) dst
, n
);
4412 GLfloat
*dst
= (GLfloat
*) dest
;
4415 dst
[i
] = (GLfloat
) source
[i
];
4417 if (dstPacking
->SwapBytes
) {
4418 _mesa_swap4( (GLuint
*) dst
, n
);
4422 case GL_HALF_FLOAT_ARB
:
4424 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4427 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4429 if (dstPacking
->SwapBytes
) {
4430 _mesa_swap2( (GLushort
*) dst
, n
);
4435 if (dstPacking
->LsbFirst
) {
4436 GLubyte
*dst
= (GLubyte
*) dest
;
4439 for (i
= 0; i
< n
; i
++) {
4442 *dst
|= ((source
[i
] != 0) << shift
);
4451 GLubyte
*dst
= (GLubyte
*) dest
;
4454 for (i
= 0; i
< n
; i
++) {
4457 *dst
|= ((source
[i
] != 0) << shift
);
4467 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4471 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4474 const GLTYPE *src = (const GLTYPE *)source; \
4475 for (i = 0; i < n; i++) { \
4476 GLTYPE value = src[i]; \
4477 if (srcPacking->SwapBytes) { \
4478 if (sizeof(GLTYPE) == 2) { \
4480 } else if (sizeof(GLTYPE) == 4) { \
4484 depthValues[i] = GLTYPE2FLOAT(value); \
4490 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4491 * or GLfloat values.
4492 * The glPixelTransfer (scale/bias) params will be applied.
4494 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4495 * \param depthMax max value for returned GLushort or GLuint values
4496 * (ignored for GLfloat).
4499 _mesa_unpack_depth_span( const struct gl_context
*ctx
, GLuint n
,
4500 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4501 GLenum srcType
, const GLvoid
*source
,
4502 const struct gl_pixelstore_attrib
*srcPacking
)
4504 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
4505 GLboolean needClamp
= GL_FALSE
;
4507 /* Look for special cases first.
4508 * Not only are these faster, they're less prone to numeric conversion
4509 * problems. Otherwise, converting from an int type to a float then
4510 * back to an int type can introduce errors that will show up as
4511 * artifacts in things like depth peeling which uses glCopyTexImage.
4513 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4514 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4515 const GLuint
*src
= (const GLuint
*) source
;
4516 GLushort
*dst
= (GLushort
*) dest
;
4518 for (i
= 0; i
< n
; i
++) {
4519 dst
[i
] = src
[i
] >> 16;
4523 if (srcType
== GL_UNSIGNED_SHORT
4524 && dstType
== GL_UNSIGNED_INT
4525 && depthMax
== 0xffffffff) {
4526 const GLushort
*src
= (const GLushort
*) source
;
4527 GLuint
*dst
= (GLuint
*) dest
;
4529 for (i
= 0; i
< n
; i
++) {
4530 dst
[i
] = src
[i
] | (src
[i
] << 16);
4534 if (srcType
== GL_UNSIGNED_INT_24_8
4535 && dstType
== GL_UNSIGNED_INT
4536 && depthMax
== 0xffffff) {
4537 const GLuint
*src
= (const GLuint
*) source
;
4538 GLuint
*dst
= (GLuint
*) dest
;
4540 for (i
= 0; i
< n
; i
++) {
4541 dst
[i
] = src
[i
] >> 8;
4545 /* XXX may want to add additional cases here someday */
4548 /* general case path follows */
4550 if (dstType
== GL_FLOAT
) {
4551 depthValues
= (GLfloat
*) dest
;
4554 depthValues
= depthTemp
;
4557 /* Convert incoming values to GLfloat. Some conversions will require
4562 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4563 needClamp
= GL_TRUE
;
4565 case GL_UNSIGNED_BYTE
:
4566 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4569 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4570 needClamp
= GL_TRUE
;
4572 case GL_UNSIGNED_SHORT
:
4573 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4576 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4577 needClamp
= GL_TRUE
;
4579 case GL_UNSIGNED_INT
:
4580 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4582 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4583 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4584 depthMax
== 0xffffff &&
4585 ctx
->Pixel
.DepthScale
== 1.0 &&
4586 ctx
->Pixel
.DepthBias
== 0.0) {
4587 const GLuint
*src
= (const GLuint
*) source
;
4588 GLuint
*zValues
= (GLuint
*) dest
;
4590 for (i
= 0; i
< n
; i
++) {
4591 GLuint value
= src
[i
];
4592 if (srcPacking
->SwapBytes
) {
4595 zValues
[i
] = value
& 0xffffff00;
4600 const GLuint
*src
= (const GLuint
*) source
;
4601 const GLfloat scale
= 1.0f
/ 0xffffff;
4603 for (i
= 0; i
< n
; i
++) {
4604 GLuint value
= src
[i
];
4605 if (srcPacking
->SwapBytes
) {
4608 depthValues
[i
] = (value
>> 8) * scale
;
4613 DEPTH_VALUES(GLfloat
, 1*);
4614 needClamp
= GL_TRUE
;
4616 case GL_HALF_FLOAT_ARB
:
4619 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4620 for (i
= 0; i
< n
; i
++) {
4621 GLhalfARB value
= src
[i
];
4622 if (srcPacking
->SwapBytes
) {
4625 depthValues
[i
] = _mesa_half_to_float(value
);
4627 needClamp
= GL_TRUE
;
4631 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4635 /* apply depth scale and bias */
4637 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4638 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4639 if (scale
!= 1.0 || bias
!= 0.0) {
4641 for (i
= 0; i
< n
; i
++) {
4642 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4644 needClamp
= GL_TRUE
;
4648 /* clamp to [0, 1] */
4651 for (i
= 0; i
< n
; i
++) {
4652 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4657 * Convert values to dstType
4659 if (dstType
== GL_UNSIGNED_INT
) {
4660 GLuint
*zValues
= (GLuint
*) dest
;
4662 if (depthMax
<= 0xffffff) {
4663 /* no overflow worries */
4664 for (i
= 0; i
< n
; i
++) {
4665 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4669 /* need to use double precision to prevent overflow problems */
4670 for (i
= 0; i
< n
; i
++) {
4671 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4672 if (z
>= (GLdouble
) 0xffffffff)
4673 zValues
[i
] = 0xffffffff;
4675 zValues
[i
] = (GLuint
) z
;
4679 else if (dstType
== GL_UNSIGNED_SHORT
) {
4680 GLushort
*zValues
= (GLushort
*) dest
;
4682 ASSERT(depthMax
<= 0xffff);
4683 for (i
= 0; i
< n
; i
++) {
4684 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4688 ASSERT(dstType
== GL_FLOAT
);
4689 /*ASSERT(depthMax == 1.0F);*/
4695 * Pack an array of depth values. The values are floats in [0,1].
4698 _mesa_pack_depth_span( const struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4699 GLenum dstType
, const GLfloat
*depthSpan
,
4700 const struct gl_pixelstore_attrib
*dstPacking
)
4702 GLfloat depthCopy
[MAX_WIDTH
];
4704 ASSERT(n
<= MAX_WIDTH
);
4706 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4707 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4708 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4709 depthSpan
= depthCopy
;
4713 case GL_UNSIGNED_BYTE
:
4715 GLubyte
*dst
= (GLubyte
*) dest
;
4717 for (i
= 0; i
< n
; i
++) {
4718 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4724 GLbyte
*dst
= (GLbyte
*) dest
;
4726 for (i
= 0; i
< n
; i
++) {
4727 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4731 case GL_UNSIGNED_SHORT
:
4733 GLushort
*dst
= (GLushort
*) dest
;
4735 for (i
= 0; i
< n
; i
++) {
4736 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4738 if (dstPacking
->SwapBytes
) {
4739 _mesa_swap2( (GLushort
*) dst
, n
);
4745 GLshort
*dst
= (GLshort
*) dest
;
4747 for (i
= 0; i
< n
; i
++) {
4748 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4750 if (dstPacking
->SwapBytes
) {
4751 _mesa_swap2( (GLushort
*) dst
, n
);
4755 case GL_UNSIGNED_INT
:
4757 GLuint
*dst
= (GLuint
*) dest
;
4759 for (i
= 0; i
< n
; i
++) {
4760 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4762 if (dstPacking
->SwapBytes
) {
4763 _mesa_swap4( (GLuint
*) dst
, n
);
4769 GLint
*dst
= (GLint
*) dest
;
4771 for (i
= 0; i
< n
; i
++) {
4772 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4774 if (dstPacking
->SwapBytes
) {
4775 _mesa_swap4( (GLuint
*) dst
, n
);
4781 GLfloat
*dst
= (GLfloat
*) dest
;
4783 for (i
= 0; i
< n
; i
++) {
4784 dst
[i
] = depthSpan
[i
];
4786 if (dstPacking
->SwapBytes
) {
4787 _mesa_swap4( (GLuint
*) dst
, n
);
4791 case GL_HALF_FLOAT_ARB
:
4793 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4795 for (i
= 0; i
< n
; i
++) {
4796 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4798 if (dstPacking
->SwapBytes
) {
4799 _mesa_swap2( (GLushort
*) dst
, n
);
4804 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4811 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4814 _mesa_pack_depth_stencil_span(const struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4815 const GLfloat
*depthVals
,
4816 const GLstencil
*stencilVals
,
4817 const struct gl_pixelstore_attrib
*dstPacking
)
4819 GLfloat depthCopy
[MAX_WIDTH
];
4820 GLstencil stencilCopy
[MAX_WIDTH
];
4823 ASSERT(n
<= MAX_WIDTH
);
4825 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4826 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4827 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4828 depthVals
= depthCopy
;
4831 if (ctx
->Pixel
.IndexShift
||
4832 ctx
->Pixel
.IndexOffset
||
4833 ctx
->Pixel
.MapStencilFlag
) {
4834 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4835 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4836 stencilVals
= stencilCopy
;
4839 for (i
= 0; i
< n
; i
++) {
4840 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4841 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4844 if (dstPacking
->SwapBytes
) {
4845 _mesa_swap4(dest
, n
);
4853 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4854 * Return all image data in a contiguous block. This is used when we
4855 * compile glDrawPixels, glTexImage, etc into a display list. We
4856 * need a copy of the data in a standard format.
4859 _mesa_unpack_image( GLuint dimensions
,
4860 GLsizei width
, GLsizei height
, GLsizei depth
,
4861 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4862 const struct gl_pixelstore_attrib
*unpack
)
4864 GLint bytesPerRow
, compsPerRow
;
4865 GLboolean flipBytes
, swap2
, swap4
;
4868 return NULL
; /* not necessarily an error */
4870 if (width
<= 0 || height
<= 0 || depth
<= 0)
4871 return NULL
; /* generate error later */
4873 if (type
== GL_BITMAP
) {
4874 bytesPerRow
= (width
+ 7) >> 3;
4875 flipBytes
= unpack
->LsbFirst
;
4876 swap2
= swap4
= GL_FALSE
;
4880 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4881 GLint components
= _mesa_components_in_format(format
);
4884 if (_mesa_type_is_packed(type
))
4887 if (bytesPerPixel
<= 0 || components
<= 0)
4888 return NULL
; /* bad format or type. generate error later */
4889 bytesPerRow
= bytesPerPixel
* width
;
4890 bytesPerComp
= bytesPerPixel
/ components
;
4891 flipBytes
= GL_FALSE
;
4892 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4893 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4894 compsPerRow
= components
* width
;
4895 assert(compsPerRow
>= width
);
4900 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4904 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4907 for (img
= 0; img
< depth
; img
++) {
4908 for (row
= 0; row
< height
; row
++) {
4909 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4910 width
, height
, format
, type
, img
, row
, 0);
4912 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4914 flipBytes
= GL_FALSE
;
4915 if (unpack
->LsbFirst
) {
4916 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4917 GLubyte dstMask
= 128;
4918 const GLubyte
*s
= src
;
4921 for (i
= 0; i
< width
; i
++) {
4925 if (srcMask
== 128) {
4930 srcMask
= srcMask
<< 1;
4938 dstMask
= dstMask
>> 1;
4943 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
4944 GLubyte dstMask
= 128;
4945 const GLubyte
*s
= src
;
4948 for (i
= 0; i
< width
; i
++) {
4957 srcMask
= srcMask
>> 1;
4965 dstMask
= dstMask
>> 1;
4971 memcpy(dst
, src
, bytesPerRow
);
4974 /* byte flipping/swapping */
4976 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
4979 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
4982 _mesa_swap4((GLuint
*) dst
, compsPerRow
);