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
[MAX_WIDTH
][4];
3467 dstComponents
= _mesa_components_in_format( dstFormat
);
3468 /* source & dest image formats should have been error checked by now */
3469 assert(dstComponents
> 0);
3472 * Extract image data and convert to RGBA floats
3474 assert(n
<= MAX_WIDTH
);
3475 if (srcFormat
== GL_COLOR_INDEX
) {
3476 GLuint indexes
[MAX_WIDTH
];
3477 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3480 if (dstFormat
== GL_COLOR_INDEX
) {
3482 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3483 /* convert to GLchan and return */
3484 for (i
= 0; i
< n
; i
++) {
3485 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3490 /* Convert indexes to RGBA */
3491 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3492 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3494 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3497 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3498 * with color indexes.
3500 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3503 /* non-color index data */
3504 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3505 srcPacking
->SwapBytes
);
3508 /* Need to clamp if returning GLubytes or GLushorts */
3509 #if CHAN_TYPE != GL_FLOAT
3510 transferOps
|= IMAGE_CLAMP_BIT
;
3514 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3517 get_component_indexes(dstFormat
,
3518 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3520 /* Now return the GLchan data in the requested dstFormat */
3524 for (i
= 0; i
< n
; i
++) {
3525 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3526 dst
+= dstComponents
;
3533 for (i
= 0; i
< n
; i
++) {
3534 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3535 dst
+= dstComponents
;
3542 for (i
= 0; i
< n
; i
++) {
3543 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3544 dst
+= dstComponents
;
3551 for (i
= 0; i
< n
; i
++) {
3552 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3553 dst
+= dstComponents
;
3561 assert(dstComponents
== 1);
3562 for (i
= 0; i
< n
; i
++) {
3563 /* Intensity comes from red channel */
3564 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3572 for (i
= 0; i
< n
; i
++) {
3573 /* Luminance comes from red channel */
3574 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3575 dst
+= dstComponents
;
3583 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3584 * instead of GLchan.
3587 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3588 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3589 GLenum srcFormat
, GLenum srcType
,
3590 const GLvoid
*source
,
3591 const struct gl_pixelstore_attrib
*srcPacking
,
3592 GLbitfield transferOps
)
3594 ASSERT(dstFormat
== GL_ALPHA
||
3595 dstFormat
== GL_LUMINANCE
||
3596 dstFormat
== GL_LUMINANCE_ALPHA
||
3597 dstFormat
== GL_INTENSITY
||
3598 dstFormat
== GL_RED
||
3599 dstFormat
== GL_RG
||
3600 dstFormat
== GL_RGB
||
3601 dstFormat
== GL_RGBA
||
3602 dstFormat
== GL_COLOR_INDEX
);
3604 ASSERT(srcFormat
== GL_RED
||
3605 srcFormat
== GL_GREEN
||
3606 srcFormat
== GL_BLUE
||
3607 srcFormat
== GL_ALPHA
||
3608 srcFormat
== GL_LUMINANCE
||
3609 srcFormat
== GL_LUMINANCE_ALPHA
||
3610 srcFormat
== GL_INTENSITY
||
3611 srcFormat
== GL_RG
||
3612 srcFormat
== GL_RGB
||
3613 srcFormat
== GL_BGR
||
3614 srcFormat
== GL_RGBA
||
3615 srcFormat
== GL_BGRA
||
3616 srcFormat
== GL_ABGR_EXT
||
3617 srcFormat
== GL_RED_INTEGER_EXT
||
3618 srcFormat
== GL_GREEN_INTEGER_EXT
||
3619 srcFormat
== GL_BLUE_INTEGER_EXT
||
3620 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3621 srcFormat
== GL_RGB_INTEGER_EXT
||
3622 srcFormat
== GL_RGBA_INTEGER_EXT
||
3623 srcFormat
== GL_BGR_INTEGER_EXT
||
3624 srcFormat
== GL_BGRA_INTEGER_EXT
||
3625 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3626 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3627 srcFormat
== GL_COLOR_INDEX
);
3629 ASSERT(srcType
== GL_BITMAP
||
3630 srcType
== GL_UNSIGNED_BYTE
||
3631 srcType
== GL_BYTE
||
3632 srcType
== GL_UNSIGNED_SHORT
||
3633 srcType
== GL_SHORT
||
3634 srcType
== GL_UNSIGNED_INT
||
3635 srcType
== GL_INT
||
3636 srcType
== GL_HALF_FLOAT_ARB
||
3637 srcType
== GL_FLOAT
||
3638 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3639 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3640 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3641 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3642 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3643 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3644 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3645 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3646 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3647 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3648 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3649 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3651 /* general solution, no special cases, yet */
3653 GLint dstComponents
;
3654 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3655 GLfloat rgba
[MAX_WIDTH
][4];
3657 dstComponents
= _mesa_components_in_format( dstFormat
);
3658 /* source & dest image formats should have been error checked by now */
3659 assert(dstComponents
> 0);
3662 * Extract image data and convert to RGBA floats
3664 assert(n
<= MAX_WIDTH
);
3665 if (srcFormat
== GL_COLOR_INDEX
) {
3666 GLuint indexes
[MAX_WIDTH
];
3667 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3670 if (dstFormat
== GL_COLOR_INDEX
) {
3672 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3673 /* convert to GLchan and return */
3674 for (i
= 0; i
< n
; i
++) {
3675 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3680 /* Convert indexes to RGBA */
3681 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3682 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3684 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3687 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3688 * with color indexes.
3690 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3693 /* non-color index data */
3694 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3695 srcPacking
->SwapBytes
);
3699 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3702 get_component_indexes(dstFormat
,
3703 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3705 /* Now pack results in the requested dstFormat */
3707 GLfloat
*dst
= dest
;
3709 for (i
= 0; i
< n
; i
++) {
3710 dst
[rDst
] = rgba
[i
][RCOMP
];
3711 dst
+= dstComponents
;
3716 GLfloat
*dst
= dest
;
3718 for (i
= 0; i
< n
; i
++) {
3719 dst
[gDst
] = rgba
[i
][GCOMP
];
3720 dst
+= dstComponents
;
3725 GLfloat
*dst
= dest
;
3727 for (i
= 0; i
< n
; i
++) {
3728 dst
[bDst
] = rgba
[i
][BCOMP
];
3729 dst
+= dstComponents
;
3734 GLfloat
*dst
= dest
;
3736 for (i
= 0; i
< n
; i
++) {
3737 dst
[aDst
] = rgba
[i
][ACOMP
];
3738 dst
+= dstComponents
;
3743 GLfloat
*dst
= dest
;
3746 assert(dstComponents
== 1);
3747 for (i
= 0; i
< n
; i
++) {
3748 /* Intensity comes from red channel */
3749 dst
[i
] = rgba
[i
][RCOMP
];
3754 GLfloat
*dst
= dest
;
3757 for (i
= 0; i
< n
; i
++) {
3758 /* Luminance comes from red channel */
3759 dst
[0] = rgba
[i
][RCOMP
];
3760 dst
+= dstComponents
;
3768 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3769 * instead of GLchan.
3770 * No pixel transfer ops are applied.
3773 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3774 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3775 GLenum srcFormat
, GLenum srcType
,
3776 const GLvoid
*source
,
3777 const struct gl_pixelstore_attrib
*srcPacking
)
3779 GLuint rgba
[MAX_WIDTH
][4];
3781 ASSERT(n
<= MAX_WIDTH
);
3783 ASSERT(dstFormat
== GL_ALPHA
||
3784 dstFormat
== GL_LUMINANCE
||
3785 dstFormat
== GL_LUMINANCE_ALPHA
||
3786 dstFormat
== GL_INTENSITY
||
3787 dstFormat
== GL_RED
||
3788 dstFormat
== GL_RG
||
3789 dstFormat
== GL_RGB
||
3790 dstFormat
== GL_RGBA
);
3792 ASSERT(srcFormat
== GL_RED
||
3793 srcFormat
== GL_GREEN
||
3794 srcFormat
== GL_BLUE
||
3795 srcFormat
== GL_ALPHA
||
3796 srcFormat
== GL_LUMINANCE
||
3797 srcFormat
== GL_LUMINANCE_ALPHA
||
3798 srcFormat
== GL_INTENSITY
||
3799 srcFormat
== GL_RG
||
3800 srcFormat
== GL_RGB
||
3801 srcFormat
== GL_BGR
||
3802 srcFormat
== GL_RGBA
||
3803 srcFormat
== GL_BGRA
||
3804 srcFormat
== GL_ABGR_EXT
||
3805 srcFormat
== GL_RED_INTEGER_EXT
||
3806 srcFormat
== GL_GREEN_INTEGER_EXT
||
3807 srcFormat
== GL_BLUE_INTEGER_EXT
||
3808 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3809 srcFormat
== GL_RGB_INTEGER_EXT
||
3810 srcFormat
== GL_RGBA_INTEGER_EXT
||
3811 srcFormat
== GL_BGR_INTEGER_EXT
||
3812 srcFormat
== GL_BGRA_INTEGER_EXT
||
3813 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3814 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3816 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3817 srcType
== GL_BYTE
||
3818 srcType
== GL_UNSIGNED_SHORT
||
3819 srcType
== GL_SHORT
||
3820 srcType
== GL_UNSIGNED_INT
||
3821 srcType
== GL_INT
||
3822 srcType
== GL_HALF_FLOAT_ARB
||
3823 srcType
== GL_FLOAT
||
3824 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3825 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3826 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3827 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3828 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3829 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3830 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3831 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3832 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3833 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3834 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3835 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3838 /* Extract image data as uint[4] pixels */
3839 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3840 srcPacking
->SwapBytes
);
3842 if (dstFormat
== GL_RGBA
) {
3844 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3848 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3849 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3851 assert(dstComponents
> 0);
3853 get_component_indexes(dstFormat
,
3854 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3856 /* Now pack values in the requested dest format */
3860 for (i
= 0; i
< n
; i
++) {
3861 dst
[rDst
] = rgba
[i
][RCOMP
];
3862 dst
+= dstComponents
;
3869 for (i
= 0; i
< n
; i
++) {
3870 dst
[gDst
] = rgba
[i
][GCOMP
];
3871 dst
+= dstComponents
;
3878 for (i
= 0; i
< n
; i
++) {
3879 dst
[bDst
] = rgba
[i
][BCOMP
];
3880 dst
+= dstComponents
;
3887 for (i
= 0; i
< n
; i
++) {
3888 dst
[aDst
] = rgba
[i
][ACOMP
];
3889 dst
+= dstComponents
;
3897 assert(dstComponents
== 1);
3898 for (i
= 0; i
< n
; i
++) {
3899 /* Intensity comes from red channel */
3900 dst
[i
] = rgba
[i
][RCOMP
];
3908 for (i
= 0; i
< n
; i
++) {
3909 /* Luminance comes from red channel */
3910 dst
[0] = rgba
[i
][RCOMP
];
3911 dst
+= dstComponents
;
3920 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3921 * directly return GLbyte data, no transfer ops apply.
3924 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3925 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3926 GLenum srcFormat
, GLenum srcType
,
3927 const GLvoid
*source
,
3928 const struct gl_pixelstore_attrib
*srcPacking
,
3929 GLbitfield transferOps
)
3931 ASSERT(dstFormat
== GL_DUDV_ATI
);
3932 ASSERT(srcFormat
== GL_DUDV_ATI
);
3934 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3935 srcType
== GL_BYTE
||
3936 srcType
== GL_UNSIGNED_SHORT
||
3937 srcType
== GL_SHORT
||
3938 srcType
== GL_UNSIGNED_INT
||
3939 srcType
== GL_INT
||
3940 srcType
== GL_HALF_FLOAT_ARB
||
3941 srcType
== GL_FLOAT
);
3943 /* general solution */
3945 GLint dstComponents
;
3946 GLfloat rgba
[MAX_WIDTH
][4];
3950 dstComponents
= _mesa_components_in_format( dstFormat
);
3951 /* source & dest image formats should have been error checked by now */
3952 assert(dstComponents
> 0);
3955 * Extract image data and convert to RGBA floats
3957 assert(n
<= MAX_WIDTH
);
3958 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3959 srcPacking
->SwapBytes
);
3962 /* Now determine which color channels we need to produce.
3963 * And determine the dest index (offset) within each color tuple.
3966 /* Now pack results in the requested dstFormat */
3967 for (i
= 0; i
< n
; i
++) {
3968 /* not sure - need clamp[-1,1] here? */
3969 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
3970 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
3971 dst
+= dstComponents
;
3977 * Unpack a row of color index data from a client buffer according to
3978 * the pixel unpacking parameters.
3979 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
3981 * Args: ctx - the context
3982 * n - number of pixels
3983 * dstType - destination data type
3984 * dest - destination array
3985 * srcType - source pixel type
3986 * source - source data pointer
3987 * srcPacking - pixel unpacking parameters
3988 * transferOps - the pixel transfer operations to apply
3991 _mesa_unpack_index_span( const struct gl_context
*ctx
, GLuint n
,
3992 GLenum dstType
, GLvoid
*dest
,
3993 GLenum srcType
, const GLvoid
*source
,
3994 const struct gl_pixelstore_attrib
*srcPacking
,
3995 GLbitfield transferOps
)
3997 ASSERT(srcType
== GL_BITMAP
||
3998 srcType
== GL_UNSIGNED_BYTE
||
3999 srcType
== GL_BYTE
||
4000 srcType
== GL_UNSIGNED_SHORT
||
4001 srcType
== GL_SHORT
||
4002 srcType
== GL_UNSIGNED_INT
||
4003 srcType
== GL_INT
||
4004 srcType
== GL_HALF_FLOAT_ARB
||
4005 srcType
== GL_FLOAT
);
4007 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4008 dstType
== GL_UNSIGNED_SHORT
||
4009 dstType
== GL_UNSIGNED_INT
);
4012 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4015 * Try simple cases first
4017 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4018 && dstType
== GL_UNSIGNED_BYTE
) {
4019 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4021 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4022 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4023 memcpy(dest
, source
, n
* sizeof(GLuint
));
4029 GLuint indexes
[MAX_WIDTH
];
4030 assert(n
<= MAX_WIDTH
);
4032 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4036 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4038 /* convert to dest type */
4040 case GL_UNSIGNED_BYTE
:
4042 GLubyte
*dst
= (GLubyte
*) dest
;
4044 for (i
= 0; i
< n
; i
++) {
4045 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4049 case GL_UNSIGNED_SHORT
:
4051 GLuint
*dst
= (GLuint
*) dest
;
4053 for (i
= 0; i
< n
; i
++) {
4054 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4058 case GL_UNSIGNED_INT
:
4059 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4062 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4069 _mesa_pack_index_span( const struct gl_context
*ctx
, GLuint n
,
4070 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4071 const struct gl_pixelstore_attrib
*dstPacking
,
4072 GLbitfield transferOps
)
4074 GLuint indexes
[MAX_WIDTH
];
4076 ASSERT(n
<= MAX_WIDTH
);
4078 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4080 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4081 /* make a copy of input */
4082 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4083 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4088 case GL_UNSIGNED_BYTE
:
4090 GLubyte
*dst
= (GLubyte
*) dest
;
4092 for (i
= 0; i
< n
; i
++) {
4093 *dst
++ = (GLubyte
) source
[i
];
4099 GLbyte
*dst
= (GLbyte
*) dest
;
4101 for (i
= 0; i
< n
; i
++) {
4102 dst
[i
] = (GLbyte
) source
[i
];
4106 case GL_UNSIGNED_SHORT
:
4108 GLushort
*dst
= (GLushort
*) dest
;
4110 for (i
= 0; i
< n
; i
++) {
4111 dst
[i
] = (GLushort
) source
[i
];
4113 if (dstPacking
->SwapBytes
) {
4114 _mesa_swap2( (GLushort
*) dst
, n
);
4120 GLshort
*dst
= (GLshort
*) dest
;
4122 for (i
= 0; i
< n
; i
++) {
4123 dst
[i
] = (GLshort
) source
[i
];
4125 if (dstPacking
->SwapBytes
) {
4126 _mesa_swap2( (GLushort
*) dst
, n
);
4130 case GL_UNSIGNED_INT
:
4132 GLuint
*dst
= (GLuint
*) dest
;
4134 for (i
= 0; i
< n
; i
++) {
4135 dst
[i
] = (GLuint
) source
[i
];
4137 if (dstPacking
->SwapBytes
) {
4138 _mesa_swap4( (GLuint
*) dst
, n
);
4144 GLint
*dst
= (GLint
*) dest
;
4146 for (i
= 0; i
< n
; i
++) {
4147 dst
[i
] = (GLint
) source
[i
];
4149 if (dstPacking
->SwapBytes
) {
4150 _mesa_swap4( (GLuint
*) dst
, n
);
4156 GLfloat
*dst
= (GLfloat
*) dest
;
4158 for (i
= 0; i
< n
; i
++) {
4159 dst
[i
] = (GLfloat
) source
[i
];
4161 if (dstPacking
->SwapBytes
) {
4162 _mesa_swap4( (GLuint
*) dst
, n
);
4166 case GL_HALF_FLOAT_ARB
:
4168 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4170 for (i
= 0; i
< n
; i
++) {
4171 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4173 if (dstPacking
->SwapBytes
) {
4174 _mesa_swap2( (GLushort
*) dst
, n
);
4179 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4185 * Unpack a row of stencil data from a client buffer according to
4186 * the pixel unpacking parameters.
4187 * This is (or will be) used by glDrawPixels
4189 * Args: ctx - the context
4190 * n - number of pixels
4191 * dstType - destination data type
4192 * dest - destination array
4193 * srcType - source pixel type
4194 * source - source data pointer
4195 * srcPacking - pixel unpacking parameters
4196 * transferOps - apply offset/bias/lookup ops?
4199 _mesa_unpack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4200 GLenum dstType
, GLvoid
*dest
,
4201 GLenum srcType
, const GLvoid
*source
,
4202 const struct gl_pixelstore_attrib
*srcPacking
,
4203 GLbitfield transferOps
)
4205 ASSERT(srcType
== GL_BITMAP
||
4206 srcType
== GL_UNSIGNED_BYTE
||
4207 srcType
== GL_BYTE
||
4208 srcType
== GL_UNSIGNED_SHORT
||
4209 srcType
== GL_SHORT
||
4210 srcType
== GL_UNSIGNED_INT
||
4211 srcType
== GL_INT
||
4212 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4213 srcType
== GL_HALF_FLOAT_ARB
||
4214 srcType
== GL_FLOAT
);
4216 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4217 dstType
== GL_UNSIGNED_SHORT
||
4218 dstType
== GL_UNSIGNED_INT
);
4220 /* only shift and offset apply to stencil */
4221 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4224 * Try simple cases first
4226 if (transferOps
== 0 &&
4227 !ctx
->Pixel
.MapStencilFlag
&&
4228 srcType
== GL_UNSIGNED_BYTE
&&
4229 dstType
== GL_UNSIGNED_BYTE
) {
4230 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4232 else if (transferOps
== 0 &&
4233 !ctx
->Pixel
.MapStencilFlag
&&
4234 srcType
== GL_UNSIGNED_INT
&&
4235 dstType
== GL_UNSIGNED_INT
&&
4236 !srcPacking
->SwapBytes
) {
4237 memcpy(dest
, source
, n
* sizeof(GLuint
));
4243 GLuint indexes
[MAX_WIDTH
];
4244 assert(n
<= MAX_WIDTH
);
4246 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4249 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4250 /* shift and offset indexes */
4251 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4254 if (ctx
->Pixel
.MapStencilFlag
) {
4255 /* Apply stencil lookup table */
4256 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4258 for (i
= 0; i
< n
; i
++) {
4259 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4263 /* convert to dest type */
4265 case GL_UNSIGNED_BYTE
:
4267 GLubyte
*dst
= (GLubyte
*) dest
;
4269 for (i
= 0; i
< n
; i
++) {
4270 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4274 case GL_UNSIGNED_SHORT
:
4276 GLuint
*dst
= (GLuint
*) dest
;
4278 for (i
= 0; i
< n
; i
++) {
4279 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4283 case GL_UNSIGNED_INT
:
4284 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4287 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4294 _mesa_pack_stencil_span( const struct gl_context
*ctx
, GLuint n
,
4295 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4296 const struct gl_pixelstore_attrib
*dstPacking
)
4298 GLstencil stencil
[MAX_WIDTH
];
4300 ASSERT(n
<= MAX_WIDTH
);
4302 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4303 ctx
->Pixel
.MapStencilFlag
) {
4304 /* make a copy of input */
4305 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4306 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4311 case GL_UNSIGNED_BYTE
:
4312 if (sizeof(GLstencil
) == 1) {
4313 memcpy( dest
, source
, n
);
4316 GLubyte
*dst
= (GLubyte
*) dest
;
4319 dst
[i
] = (GLubyte
) source
[i
];
4325 GLbyte
*dst
= (GLbyte
*) dest
;
4328 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4332 case GL_UNSIGNED_SHORT
:
4334 GLushort
*dst
= (GLushort
*) dest
;
4337 dst
[i
] = (GLushort
) source
[i
];
4339 if (dstPacking
->SwapBytes
) {
4340 _mesa_swap2( (GLushort
*) dst
, n
);
4346 GLshort
*dst
= (GLshort
*) dest
;
4349 dst
[i
] = (GLshort
) source
[i
];
4351 if (dstPacking
->SwapBytes
) {
4352 _mesa_swap2( (GLushort
*) dst
, n
);
4356 case GL_UNSIGNED_INT
:
4358 GLuint
*dst
= (GLuint
*) dest
;
4361 dst
[i
] = (GLuint
) source
[i
];
4363 if (dstPacking
->SwapBytes
) {
4364 _mesa_swap4( (GLuint
*) dst
, n
);
4370 GLint
*dst
= (GLint
*) dest
;
4373 dst
[i
] = (GLint
) source
[i
];
4375 if (dstPacking
->SwapBytes
) {
4376 _mesa_swap4( (GLuint
*) dst
, n
);
4382 GLfloat
*dst
= (GLfloat
*) dest
;
4385 dst
[i
] = (GLfloat
) source
[i
];
4387 if (dstPacking
->SwapBytes
) {
4388 _mesa_swap4( (GLuint
*) dst
, n
);
4392 case GL_HALF_FLOAT_ARB
:
4394 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4397 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4399 if (dstPacking
->SwapBytes
) {
4400 _mesa_swap2( (GLushort
*) dst
, n
);
4405 if (dstPacking
->LsbFirst
) {
4406 GLubyte
*dst
= (GLubyte
*) dest
;
4409 for (i
= 0; i
< n
; i
++) {
4412 *dst
|= ((source
[i
] != 0) << shift
);
4421 GLubyte
*dst
= (GLubyte
*) dest
;
4424 for (i
= 0; i
< n
; i
++) {
4427 *dst
|= ((source
[i
] != 0) << shift
);
4437 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4441 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4444 const GLTYPE *src = (const GLTYPE *)source; \
4445 for (i = 0; i < n; i++) { \
4446 GLTYPE value = src[i]; \
4447 if (srcPacking->SwapBytes) { \
4448 if (sizeof(GLTYPE) == 2) { \
4450 } else if (sizeof(GLTYPE) == 4) { \
4454 depthValues[i] = GLTYPE2FLOAT(value); \
4460 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4461 * or GLfloat values.
4462 * The glPixelTransfer (scale/bias) params will be applied.
4464 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4465 * \param depthMax max value for returned GLushort or GLuint values
4466 * (ignored for GLfloat).
4469 _mesa_unpack_depth_span( const struct gl_context
*ctx
, GLuint n
,
4470 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4471 GLenum srcType
, const GLvoid
*source
,
4472 const struct gl_pixelstore_attrib
*srcPacking
)
4474 GLfloat depthTemp
[MAX_WIDTH
], *depthValues
;
4475 GLboolean needClamp
= GL_FALSE
;
4477 /* Look for special cases first.
4478 * Not only are these faster, they're less prone to numeric conversion
4479 * problems. Otherwise, converting from an int type to a float then
4480 * back to an int type can introduce errors that will show up as
4481 * artifacts in things like depth peeling which uses glCopyTexImage.
4483 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4484 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4485 const GLuint
*src
= (const GLuint
*) source
;
4486 GLushort
*dst
= (GLushort
*) dest
;
4488 for (i
= 0; i
< n
; i
++) {
4489 dst
[i
] = src
[i
] >> 16;
4493 if (srcType
== GL_UNSIGNED_SHORT
4494 && dstType
== GL_UNSIGNED_INT
4495 && depthMax
== 0xffffffff) {
4496 const GLushort
*src
= (const GLushort
*) source
;
4497 GLuint
*dst
= (GLuint
*) dest
;
4499 for (i
= 0; i
< n
; i
++) {
4500 dst
[i
] = src
[i
] | (src
[i
] << 16);
4504 if (srcType
== GL_UNSIGNED_INT_24_8
4505 && dstType
== GL_UNSIGNED_INT
4506 && depthMax
== 0xffffff) {
4507 const GLuint
*src
= (const GLuint
*) source
;
4508 GLuint
*dst
= (GLuint
*) dest
;
4510 for (i
= 0; i
< n
; i
++) {
4511 dst
[i
] = src
[i
] >> 8;
4515 /* XXX may want to add additional cases here someday */
4518 /* general case path follows */
4520 if (dstType
== GL_FLOAT
) {
4521 depthValues
= (GLfloat
*) dest
;
4524 depthValues
= depthTemp
;
4527 /* Convert incoming values to GLfloat. Some conversions will require
4532 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4533 needClamp
= GL_TRUE
;
4535 case GL_UNSIGNED_BYTE
:
4536 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4539 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4540 needClamp
= GL_TRUE
;
4542 case GL_UNSIGNED_SHORT
:
4543 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4546 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4547 needClamp
= GL_TRUE
;
4549 case GL_UNSIGNED_INT
:
4550 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4552 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4553 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4554 depthMax
== 0xffffff &&
4555 ctx
->Pixel
.DepthScale
== 1.0 &&
4556 ctx
->Pixel
.DepthBias
== 0.0) {
4557 const GLuint
*src
= (const GLuint
*) source
;
4558 GLuint
*zValues
= (GLuint
*) dest
;
4560 for (i
= 0; i
< n
; i
++) {
4561 GLuint value
= src
[i
];
4562 if (srcPacking
->SwapBytes
) {
4565 zValues
[i
] = value
& 0xffffff00;
4570 const GLuint
*src
= (const GLuint
*) source
;
4571 const GLfloat scale
= 1.0f
/ 0xffffff;
4573 for (i
= 0; i
< n
; i
++) {
4574 GLuint value
= src
[i
];
4575 if (srcPacking
->SwapBytes
) {
4578 depthValues
[i
] = (value
>> 8) * scale
;
4583 DEPTH_VALUES(GLfloat
, 1*);
4584 needClamp
= GL_TRUE
;
4586 case GL_HALF_FLOAT_ARB
:
4589 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4590 for (i
= 0; i
< n
; i
++) {
4591 GLhalfARB value
= src
[i
];
4592 if (srcPacking
->SwapBytes
) {
4595 depthValues
[i
] = _mesa_half_to_float(value
);
4597 needClamp
= GL_TRUE
;
4601 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4605 /* apply depth scale and bias */
4607 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4608 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4609 if (scale
!= 1.0 || bias
!= 0.0) {
4611 for (i
= 0; i
< n
; i
++) {
4612 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4614 needClamp
= GL_TRUE
;
4618 /* clamp to [0, 1] */
4621 for (i
= 0; i
< n
; i
++) {
4622 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4627 * Convert values to dstType
4629 if (dstType
== GL_UNSIGNED_INT
) {
4630 GLuint
*zValues
= (GLuint
*) dest
;
4632 if (depthMax
<= 0xffffff) {
4633 /* no overflow worries */
4634 for (i
= 0; i
< n
; i
++) {
4635 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4639 /* need to use double precision to prevent overflow problems */
4640 for (i
= 0; i
< n
; i
++) {
4641 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4642 if (z
>= (GLdouble
) 0xffffffff)
4643 zValues
[i
] = 0xffffffff;
4645 zValues
[i
] = (GLuint
) z
;
4649 else if (dstType
== GL_UNSIGNED_SHORT
) {
4650 GLushort
*zValues
= (GLushort
*) dest
;
4652 ASSERT(depthMax
<= 0xffff);
4653 for (i
= 0; i
< n
; i
++) {
4654 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4658 ASSERT(dstType
== GL_FLOAT
);
4659 /*ASSERT(depthMax == 1.0F);*/
4665 * Pack an array of depth values. The values are floats in [0,1].
4668 _mesa_pack_depth_span( const struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4669 GLenum dstType
, const GLfloat
*depthSpan
,
4670 const struct gl_pixelstore_attrib
*dstPacking
)
4672 GLfloat depthCopy
[MAX_WIDTH
];
4674 ASSERT(n
<= MAX_WIDTH
);
4676 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4677 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4678 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4679 depthSpan
= depthCopy
;
4683 case GL_UNSIGNED_BYTE
:
4685 GLubyte
*dst
= (GLubyte
*) dest
;
4687 for (i
= 0; i
< n
; i
++) {
4688 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4694 GLbyte
*dst
= (GLbyte
*) dest
;
4696 for (i
= 0; i
< n
; i
++) {
4697 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4701 case GL_UNSIGNED_SHORT
:
4703 GLushort
*dst
= (GLushort
*) dest
;
4705 for (i
= 0; i
< n
; i
++) {
4706 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4708 if (dstPacking
->SwapBytes
) {
4709 _mesa_swap2( (GLushort
*) dst
, n
);
4715 GLshort
*dst
= (GLshort
*) dest
;
4717 for (i
= 0; i
< n
; i
++) {
4718 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4720 if (dstPacking
->SwapBytes
) {
4721 _mesa_swap2( (GLushort
*) dst
, n
);
4725 case GL_UNSIGNED_INT
:
4727 GLuint
*dst
= (GLuint
*) dest
;
4729 for (i
= 0; i
< n
; i
++) {
4730 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4732 if (dstPacking
->SwapBytes
) {
4733 _mesa_swap4( (GLuint
*) dst
, n
);
4739 GLint
*dst
= (GLint
*) dest
;
4741 for (i
= 0; i
< n
; i
++) {
4742 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4744 if (dstPacking
->SwapBytes
) {
4745 _mesa_swap4( (GLuint
*) dst
, n
);
4751 GLfloat
*dst
= (GLfloat
*) dest
;
4753 for (i
= 0; i
< n
; i
++) {
4754 dst
[i
] = depthSpan
[i
];
4756 if (dstPacking
->SwapBytes
) {
4757 _mesa_swap4( (GLuint
*) dst
, n
);
4761 case GL_HALF_FLOAT_ARB
:
4763 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4765 for (i
= 0; i
< n
; i
++) {
4766 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4768 if (dstPacking
->SwapBytes
) {
4769 _mesa_swap2( (GLushort
*) dst
, n
);
4774 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4781 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4784 _mesa_pack_depth_stencil_span(const struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4785 const GLfloat
*depthVals
,
4786 const GLstencil
*stencilVals
,
4787 const struct gl_pixelstore_attrib
*dstPacking
)
4789 GLfloat depthCopy
[MAX_WIDTH
];
4790 GLstencil stencilCopy
[MAX_WIDTH
];
4793 ASSERT(n
<= MAX_WIDTH
);
4795 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4796 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4797 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4798 depthVals
= depthCopy
;
4801 if (ctx
->Pixel
.IndexShift
||
4802 ctx
->Pixel
.IndexOffset
||
4803 ctx
->Pixel
.MapStencilFlag
) {
4804 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4805 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4806 stencilVals
= stencilCopy
;
4809 for (i
= 0; i
< n
; i
++) {
4810 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4811 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4814 if (dstPacking
->SwapBytes
) {
4815 _mesa_swap4(dest
, n
);
4823 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4824 * Return all image data in a contiguous block. This is used when we
4825 * compile glDrawPixels, glTexImage, etc into a display list. We
4826 * need a copy of the data in a standard format.
4829 _mesa_unpack_image( GLuint dimensions
,
4830 GLsizei width
, GLsizei height
, GLsizei depth
,
4831 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4832 const struct gl_pixelstore_attrib
*unpack
)
4834 GLint bytesPerRow
, compsPerRow
;
4835 GLboolean flipBytes
, swap2
, swap4
;
4838 return NULL
; /* not necessarily an error */
4840 if (width
<= 0 || height
<= 0 || depth
<= 0)
4841 return NULL
; /* generate error later */
4843 if (type
== GL_BITMAP
) {
4844 bytesPerRow
= (width
+ 7) >> 3;
4845 flipBytes
= unpack
->LsbFirst
;
4846 swap2
= swap4
= GL_FALSE
;
4850 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4851 GLint components
= _mesa_components_in_format(format
);
4854 if (_mesa_type_is_packed(type
))
4857 if (bytesPerPixel
<= 0 || components
<= 0)
4858 return NULL
; /* bad format or type. generate error later */
4859 bytesPerRow
= bytesPerPixel
* width
;
4860 bytesPerComp
= bytesPerPixel
/ components
;
4861 flipBytes
= GL_FALSE
;
4862 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4863 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4864 compsPerRow
= components
* width
;
4865 assert(compsPerRow
>= width
);
4870 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4874 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4877 for (img
= 0; img
< depth
; img
++) {
4878 for (row
= 0; row
< height
; row
++) {
4879 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4880 width
, height
, format
, type
, img
, row
, 0);
4882 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4884 flipBytes
= GL_FALSE
;
4885 if (unpack
->LsbFirst
) {
4886 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4887 GLubyte dstMask
= 128;
4888 const GLubyte
*s
= src
;
4891 for (i
= 0; i
< width
; i
++) {
4895 if (srcMask
== 128) {
4900 srcMask
= srcMask
<< 1;
4908 dstMask
= dstMask
>> 1;
4913 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
4914 GLubyte dstMask
= 128;
4915 const GLubyte
*s
= src
;
4918 for (i
= 0; i
< width
; i
++) {
4927 srcMask
= srcMask
>> 1;
4935 dstMask
= dstMask
>> 1;
4941 memcpy(dst
, src
, bytesPerRow
);
4944 /* byte flipping/swapping */
4946 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
4949 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
4952 _mesa_swap4((GLuint
*) dst
, compsPerRow
);