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.
39 #include "pixeltransfer.h"
44 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
45 * we later convert the float to a packed integer value (such as for
46 * GL_RGB5_A1) because we'll wind up with a non-zero value.
48 * We redefine the macros here so zero is handled correctly.
51 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
54 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
58 /** Compute ceiling of integer quotient of A divided by B. */
59 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
63 * Flip the 8 bits in each byte of the given array.
66 * \param n number of bytes.
68 * \todo try this trick to flip bytes someday:
70 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
71 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
72 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
76 flip_bytes( GLubyte
*p
, GLuint n
)
79 for (i
= 0; i
< n
; i
++) {
80 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
81 a
= ((b
& 0x01) << 7) |
96 * Unpack a 32x32 pixel polygon stipple from user memory using the
97 * current pixel unpack settings.
100 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
101 const struct gl_pixelstore_attrib
*unpacking
)
103 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
105 /* Convert pattern from GLubytes to GLuints and handle big/little
110 for (i
= 0; i
< 32; i
++) {
111 dest
[i
] = (p
[0] << 24)
123 * Pack polygon stipple into user memory given current pixel packing
127 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
128 const struct gl_pixelstore_attrib
*packing
)
130 /* Convert pattern from GLuints to GLubytes to handle big/little
131 * endian differences.
135 for (i
= 0; i
< 32; i
++) {
136 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
137 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
138 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
139 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
142 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
147 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
148 * order with row alignment = 1 byte.
151 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
152 const struct gl_pixelstore_attrib
*packing
)
154 GLint bytes
, row
, width_in_bytes
;
155 GLubyte
*buffer
, *dst
;
160 /* Alloc dest storage */
161 bytes
= ((width
+ 7) / 8 * height
);
162 buffer
= (GLubyte
*) malloc( bytes
);
166 width_in_bytes
= CEILING( width
, 8 );
168 for (row
= 0; row
< height
; row
++) {
169 const GLubyte
*src
= (const GLubyte
*)
170 _mesa_image_address2d(packing
, pixels
, width
, height
,
171 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
177 if ((packing
->SkipPixels
& 7) == 0) {
178 memcpy( dst
, src
, width_in_bytes
);
179 if (packing
->LsbFirst
) {
180 flip_bytes( dst
, width_in_bytes
);
184 /* handling SkipPixels is a bit tricky (no pun intended!) */
186 if (packing
->LsbFirst
) {
187 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
188 GLubyte dstMask
= 128;
189 const GLubyte
*s
= src
;
192 for (i
= 0; i
< width
; i
++) {
196 if (srcMask
== 128) {
201 srcMask
= srcMask
<< 1;
209 dstMask
= dstMask
>> 1;
214 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
215 GLubyte dstMask
= 128;
216 const GLubyte
*s
= src
;
219 for (i
= 0; i
< width
; i
++) {
228 srcMask
= srcMask
>> 1;
236 dstMask
= dstMask
>> 1;
241 dst
+= width_in_bytes
;
252 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
253 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
255 GLint row
, width_in_bytes
;
261 width_in_bytes
= CEILING( width
, 8 );
263 for (row
= 0; row
< height
; row
++) {
264 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
265 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
269 if ((packing
->SkipPixels
& 7) == 0) {
270 memcpy( dst
, src
, width_in_bytes
);
271 if (packing
->LsbFirst
) {
272 flip_bytes( dst
, width_in_bytes
);
276 /* handling SkipPixels is a bit tricky (no pun intended!) */
278 if (packing
->LsbFirst
) {
279 GLubyte srcMask
= 128;
280 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
281 const GLubyte
*s
= src
;
284 for (i
= 0; i
< width
; i
++) {
293 srcMask
= srcMask
>> 1;
295 if (dstMask
== 128) {
301 dstMask
= dstMask
<< 1;
306 GLubyte srcMask
= 128;
307 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
308 const GLubyte
*s
= src
;
311 for (i
= 0; i
< width
; i
++) {
320 srcMask
= srcMask
>> 1;
328 dstMask
= dstMask
>> 1;
333 src
+= width_in_bytes
;
339 * Get indexes of color components for a basic color format, such as
340 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
344 get_component_indexes(GLenum format
,
349 GLint
*luminanceIndex
,
350 GLint
*intensityIndex
)
356 *luminanceIndex
= -1;
357 *intensityIndex
= -1;
361 case GL_LUMINANCE_INTEGER_EXT
:
364 case GL_LUMINANCE_ALPHA
:
365 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
373 case GL_RED_INTEGER_EXT
:
377 case GL_GREEN_INTEGER_EXT
:
381 case GL_BLUE_INTEGER_EXT
:
385 case GL_ALPHA_INTEGER_EXT
:
394 case GL_RGB_INTEGER_EXT
:
400 case GL_BGR_INTEGER_EXT
:
406 case GL_RGBA_INTEGER_EXT
:
413 case GL_BGRA_INTEGER
:
431 assert(0 && "bad format in get_component_indexes()");
438 * For small integer types, return the min and max possible values.
439 * Used for clamping floats to unscaled integer types.
440 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
443 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
450 case GL_UNSIGNED_BYTE
:
458 case GL_UNSIGNED_SHORT
:
470 * Used to pack an array [][4] of RGBA float colors as specified
471 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
472 * Historically, the RGBA values were in [0,1] and rescaled to fit
473 * into GLubytes, etc. But with new integer formats, the RGBA values
474 * may have any value and we don't always rescale when converting to
477 * Note: the rgba values will be modified by this function when any pixel
478 * transfer ops are enabled.
481 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
482 GLenum dstFormat
, GLenum dstType
,
484 const struct gl_pixelstore_attrib
*dstPacking
,
485 GLbitfield transferOps
)
488 const GLint comps
= _mesa_components_in_format(dstFormat
);
489 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
492 if (dstFormat
== GL_LUMINANCE
||
493 dstFormat
== GL_LUMINANCE_ALPHA
||
494 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
495 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
496 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
498 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
507 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
511 * Component clamping (besides clamping to [0,1] in
512 * _mesa_apply_rgba_transfer_ops()).
515 /* clamping to dest type's min/max values */
517 if (get_type_min_max(dstType
, &min
, &max
)) {
518 for (i
= 0; i
< n
; i
++) {
519 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
520 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
521 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
522 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
526 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
527 /* compute luminance values */
528 if (transferOps
& IMAGE_CLAMP_BIT
) {
529 for (i
= 0; i
< n
; i
++) {
530 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
531 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
535 for (i
= 0; i
< n
; i
++) {
536 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
542 * Pack/store the pixels. Ugh! Lots of cases!!!
545 case GL_UNSIGNED_BYTE
:
547 GLubyte
*dst
= (GLubyte
*) dstAddr
;
551 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
555 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
559 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
563 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
567 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
569 case GL_LUMINANCE_ALPHA
:
571 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
572 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
577 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
578 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
583 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
584 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
585 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
590 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
591 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
592 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
593 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
598 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
599 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
600 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
605 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
606 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
607 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
608 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
613 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
614 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
615 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
616 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
619 case GL_RED_INTEGER_EXT
:
621 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
624 case GL_GREEN_INTEGER_EXT
:
626 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
629 case GL_BLUE_INTEGER_EXT
:
631 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
634 case GL_ALPHA_INTEGER_EXT
:
636 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
639 case GL_RGB_INTEGER_EXT
:
641 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
642 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
643 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
646 case GL_RGBA_INTEGER_EXT
:
648 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
649 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
650 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
651 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
654 case GL_BGR_INTEGER_EXT
:
656 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
657 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
658 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
661 case GL_BGRA_INTEGER_EXT
:
663 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
664 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
665 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
666 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
669 case GL_LUMINANCE_INTEGER_EXT
:
671 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
674 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
677 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
679 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
687 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
688 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
692 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
698 GLbyte
*dst
= (GLbyte
*) dstAddr
;
702 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
706 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
710 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
714 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
718 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
720 case GL_LUMINANCE_ALPHA
:
722 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
723 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
728 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
729 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
734 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
735 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
736 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
741 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
742 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
743 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
744 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
749 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
750 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
751 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
756 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
757 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
758 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
759 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
764 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
765 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
766 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
767 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
770 case GL_RED_INTEGER_EXT
:
772 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
775 case GL_GREEN_INTEGER_EXT
:
777 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
780 case GL_BLUE_INTEGER_EXT
:
782 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
785 case GL_ALPHA_INTEGER_EXT
:
787 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
790 case GL_RGB_INTEGER_EXT
:
792 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
793 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
794 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
797 case GL_RGBA_INTEGER_EXT
:
799 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
800 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
801 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
802 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
805 case GL_BGR_INTEGER_EXT
:
807 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
808 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
809 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
812 case GL_BGRA_INTEGER_EXT
:
814 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
815 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
816 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
817 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
820 case GL_LUMINANCE_INTEGER_EXT
:
822 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
825 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
828 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
830 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
838 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
839 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
843 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
847 case GL_UNSIGNED_SHORT
:
849 GLushort
*dst
= (GLushort
*) dstAddr
;
853 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
857 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
861 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
865 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
869 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
871 case GL_LUMINANCE_ALPHA
:
873 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
874 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
879 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
880 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
885 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
886 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
887 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
892 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
893 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
894 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
895 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
900 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
901 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
902 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
907 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
908 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
909 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
910 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
915 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
916 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
917 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
921 case GL_RED_INTEGER_EXT
:
923 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
926 case GL_GREEN_INTEGER_EXT
:
928 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
931 case GL_BLUE_INTEGER_EXT
:
933 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
936 case GL_ALPHA_INTEGER_EXT
:
938 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
941 case GL_RGB_INTEGER_EXT
:
943 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
944 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
945 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
948 case GL_RGBA_INTEGER_EXT
:
950 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
951 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
952 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
953 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
956 case GL_BGR_INTEGER_EXT
:
958 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
959 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
960 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
963 case GL_BGRA_INTEGER_EXT
:
965 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
966 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
967 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
968 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
971 case GL_LUMINANCE_INTEGER_EXT
:
973 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
976 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
979 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
981 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
989 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
990 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
994 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1000 GLshort
*dst
= (GLshort
*) dstAddr
;
1001 switch (dstFormat
) {
1004 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1008 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1012 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1016 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1020 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1022 case GL_LUMINANCE_ALPHA
:
1024 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1025 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1030 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1031 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1036 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1037 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1038 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1043 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1044 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1045 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1046 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1051 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1052 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1053 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1058 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1059 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1060 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1061 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1066 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1067 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1068 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1069 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1072 case GL_RED_INTEGER_EXT
:
1074 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1077 case GL_GREEN_INTEGER_EXT
:
1079 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1082 case GL_BLUE_INTEGER_EXT
:
1084 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1087 case GL_ALPHA_INTEGER_EXT
:
1089 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1092 case GL_RGB_INTEGER_EXT
:
1094 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1095 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1096 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1099 case GL_RGBA_INTEGER_EXT
:
1101 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1102 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1103 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1104 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1107 case GL_BGR_INTEGER_EXT
:
1109 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1110 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1111 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1114 case GL_BGRA_INTEGER_EXT
:
1116 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1117 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1118 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1119 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1122 case GL_LUMINANCE_INTEGER_EXT
:
1124 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1127 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1130 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1132 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1140 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1141 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1145 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1149 case GL_UNSIGNED_INT
:
1151 GLuint
*dst
= (GLuint
*) dstAddr
;
1152 switch (dstFormat
) {
1155 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1159 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1163 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1167 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1171 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1173 case GL_LUMINANCE_ALPHA
:
1175 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1176 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1181 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1182 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1187 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1188 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1189 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1194 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1195 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1196 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1197 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1202 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1203 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1204 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1209 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1210 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1211 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1212 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1217 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1218 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1219 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1220 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1223 case GL_RED_INTEGER_EXT
:
1225 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1228 case GL_GREEN_INTEGER_EXT
:
1230 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1233 case GL_BLUE_INTEGER_EXT
:
1235 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1238 case GL_ALPHA_INTEGER_EXT
:
1240 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1243 case GL_RGB_INTEGER_EXT
:
1245 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1246 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1247 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1250 case GL_RGBA_INTEGER_EXT
:
1252 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1253 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1254 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1255 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1258 case GL_BGR_INTEGER_EXT
:
1260 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1261 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1262 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1265 case GL_BGRA_INTEGER_EXT
:
1267 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1268 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1269 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1270 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1273 case GL_LUMINANCE_INTEGER_EXT
:
1275 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1278 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1281 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1283 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1291 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1292 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1296 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1302 GLint
*dst
= (GLint
*) dstAddr
;
1303 switch (dstFormat
) {
1306 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1310 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1314 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1318 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1322 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1324 case GL_LUMINANCE_ALPHA
:
1326 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1327 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1332 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1333 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1338 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1339 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1340 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1345 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1346 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1347 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1348 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1353 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1354 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1355 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1360 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1361 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1362 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1363 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1368 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1369 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1370 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1371 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1377 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1378 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1381 case GL_RED_INTEGER_EXT
:
1383 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1386 case GL_GREEN_INTEGER_EXT
:
1388 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1391 case GL_BLUE_INTEGER_EXT
:
1393 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1396 case GL_ALPHA_INTEGER_EXT
:
1398 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1401 case GL_RGB_INTEGER_EXT
:
1403 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1404 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1405 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1408 case GL_RGBA_INTEGER_EXT
:
1410 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1411 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1412 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1413 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1416 case GL_BGR_INTEGER_EXT
:
1418 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1419 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1420 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1423 case GL_BGRA_INTEGER_EXT
:
1425 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1426 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1427 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1428 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1431 case GL_LUMINANCE_INTEGER_EXT
:
1433 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1436 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1439 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1441 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1447 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1453 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1454 switch (dstFormat
) {
1457 dst
[i
] = rgba
[i
][RCOMP
];
1461 dst
[i
] = rgba
[i
][GCOMP
];
1465 dst
[i
] = rgba
[i
][BCOMP
];
1469 dst
[i
] = rgba
[i
][ACOMP
];
1473 dst
[i
] = luminance
[i
];
1475 case GL_LUMINANCE_ALPHA
:
1477 dst
[i
*2+0] = luminance
[i
];
1478 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1483 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1484 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1489 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1490 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1491 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1496 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1497 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1498 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1499 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1504 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1505 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1506 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1511 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1512 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1513 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1514 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1519 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1520 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1521 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1522 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1528 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1529 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1533 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1537 case GL_HALF_FLOAT_ARB
:
1539 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1540 switch (dstFormat
) {
1543 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1547 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1551 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1555 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1559 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1561 case GL_LUMINANCE_ALPHA
:
1563 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1564 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1569 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1570 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1575 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1576 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1577 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1582 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1583 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1584 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1585 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1590 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1591 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1592 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1597 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1598 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1599 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1600 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1605 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1606 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1607 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1608 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1614 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1615 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1619 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1623 case GL_UNSIGNED_BYTE_3_3_2
:
1624 if (dstFormat
== GL_RGB
) {
1625 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1627 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1628 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1629 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1633 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1634 if (dstFormat
== GL_RGB
) {
1635 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1637 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1638 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1639 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1643 case GL_UNSIGNED_SHORT_5_6_5
:
1644 if (dstFormat
== GL_RGB
) {
1645 GLushort
*dst
= (GLushort
*) dstAddr
;
1647 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1648 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1649 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1653 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1654 if (dstFormat
== GL_RGB
) {
1655 GLushort
*dst
= (GLushort
*) dstAddr
;
1657 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1658 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1659 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1663 case GL_UNSIGNED_SHORT_4_4_4_4
:
1664 if (dstFormat
== GL_RGBA
) {
1665 GLushort
*dst
= (GLushort
*) dstAddr
;
1667 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1668 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1669 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1670 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1673 else if (dstFormat
== GL_BGRA
) {
1674 GLushort
*dst
= (GLushort
*) dstAddr
;
1676 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1677 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1678 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1679 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1682 else if (dstFormat
== GL_ABGR_EXT
) {
1683 GLushort
*dst
= (GLushort
*) dstAddr
;
1685 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1686 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1687 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1688 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1692 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1693 if (dstFormat
== GL_RGBA
) {
1694 GLushort
*dst
= (GLushort
*) dstAddr
;
1696 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1697 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1698 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1699 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1702 else if (dstFormat
== GL_BGRA
) {
1703 GLushort
*dst
= (GLushort
*) dstAddr
;
1705 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1706 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1707 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1708 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1711 else if (dstFormat
== GL_ABGR_EXT
) {
1712 GLushort
*dst
= (GLushort
*) dstAddr
;
1714 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1715 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1716 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1717 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1721 case GL_UNSIGNED_SHORT_5_5_5_1
:
1722 if (dstFormat
== GL_RGBA
) {
1723 GLushort
*dst
= (GLushort
*) dstAddr
;
1725 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1726 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1727 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1728 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1731 else if (dstFormat
== GL_BGRA
) {
1732 GLushort
*dst
= (GLushort
*) dstAddr
;
1734 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1735 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1736 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1737 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1740 else if (dstFormat
== GL_ABGR_EXT
) {
1741 GLushort
*dst
= (GLushort
*) dstAddr
;
1743 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1744 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1745 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1746 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1750 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1751 if (dstFormat
== GL_RGBA
) {
1752 GLushort
*dst
= (GLushort
*) dstAddr
;
1754 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1755 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1756 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1757 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1760 else if (dstFormat
== GL_BGRA
) {
1761 GLushort
*dst
= (GLushort
*) dstAddr
;
1763 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1764 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1765 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1766 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1769 else if (dstFormat
== GL_ABGR_EXT
) {
1770 GLushort
*dst
= (GLushort
*) dstAddr
;
1772 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1773 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1774 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1775 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1779 case GL_UNSIGNED_INT_8_8_8_8
:
1780 if (dstFormat
== GL_RGBA
) {
1781 GLuint
*dst
= (GLuint
*) dstAddr
;
1783 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1784 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1785 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1786 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1789 else if (dstFormat
== GL_BGRA
) {
1790 GLuint
*dst
= (GLuint
*) dstAddr
;
1792 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1793 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1794 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1795 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1798 else if (dstFormat
== GL_ABGR_EXT
) {
1799 GLuint
*dst
= (GLuint
*) dstAddr
;
1801 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1802 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1803 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1804 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1808 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1809 if (dstFormat
== GL_RGBA
) {
1810 GLuint
*dst
= (GLuint
*) dstAddr
;
1812 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1813 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1814 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1815 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1818 else if (dstFormat
== GL_BGRA
) {
1819 GLuint
*dst
= (GLuint
*) dstAddr
;
1821 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1822 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1823 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1824 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1827 else if (dstFormat
== GL_ABGR_EXT
) {
1828 GLuint
*dst
= (GLuint
*) dstAddr
;
1830 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1831 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1832 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1833 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1837 case GL_UNSIGNED_INT_10_10_10_2
:
1838 if (dstFormat
== GL_RGBA
) {
1839 GLuint
*dst
= (GLuint
*) dstAddr
;
1841 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1842 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1843 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1844 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1847 else if (dstFormat
== GL_BGRA
) {
1848 GLuint
*dst
= (GLuint
*) dstAddr
;
1850 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1851 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1852 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1853 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1856 else if (dstFormat
== GL_ABGR_EXT
) {
1857 GLuint
*dst
= (GLuint
*) dstAddr
;
1859 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1860 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1861 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1862 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1866 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1867 if (dstFormat
== GL_RGBA
) {
1868 GLuint
*dst
= (GLuint
*) dstAddr
;
1870 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1871 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1872 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1873 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1876 else if (dstFormat
== GL_BGRA
) {
1877 GLuint
*dst
= (GLuint
*) dstAddr
;
1879 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1880 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1881 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1882 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1885 else if (dstFormat
== GL_ABGR_EXT
) {
1886 GLuint
*dst
= (GLuint
*) dstAddr
;
1888 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1889 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1890 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1891 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1896 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1900 if (dstPacking
->SwapBytes
) {
1901 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1902 if (swapSize
== 2) {
1903 if (dstPacking
->SwapBytes
) {
1904 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1907 else if (swapSize
== 4) {
1908 if (dstPacking
->SwapBytes
) {
1909 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1919 #define SWAP2BYTE(VALUE) \
1921 GLubyte *bytes = (GLubyte *) &(VALUE); \
1922 GLubyte tmp = bytes[0]; \
1923 bytes[0] = bytes[1]; \
1927 #define SWAP4BYTE(VALUE) \
1929 GLubyte *bytes = (GLubyte *) &(VALUE); \
1930 GLubyte tmp = bytes[0]; \
1931 bytes[0] = bytes[3]; \
1934 bytes[1] = bytes[2]; \
1940 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1941 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1942 const struct gl_pixelstore_attrib
*unpack
)
1944 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1946 ASSERT(srcType
== GL_BITMAP
||
1947 srcType
== GL_UNSIGNED_BYTE
||
1948 srcType
== GL_BYTE
||
1949 srcType
== GL_UNSIGNED_SHORT
||
1950 srcType
== GL_SHORT
||
1951 srcType
== GL_UNSIGNED_INT
||
1952 srcType
== GL_INT
||
1953 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1954 srcType
== GL_HALF_FLOAT_ARB
||
1955 srcType
== GL_FLOAT
);
1960 GLubyte
*ubsrc
= (GLubyte
*) src
;
1961 if (unpack
->LsbFirst
) {
1962 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1964 for (i
= 0; i
< n
; i
++) {
1965 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1976 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1978 for (i
= 0; i
< n
; i
++) {
1979 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1991 case GL_UNSIGNED_BYTE
:
1994 const GLubyte
*s
= (const GLubyte
*) src
;
1995 for (i
= 0; i
< n
; i
++)
2002 const GLbyte
*s
= (const GLbyte
*) src
;
2003 for (i
= 0; i
< n
; i
++)
2007 case GL_UNSIGNED_SHORT
:
2010 const GLushort
*s
= (const GLushort
*) src
;
2011 if (unpack
->SwapBytes
) {
2012 for (i
= 0; i
< n
; i
++) {
2013 GLushort value
= s
[i
];
2019 for (i
= 0; i
< n
; i
++)
2027 const GLshort
*s
= (const GLshort
*) src
;
2028 if (unpack
->SwapBytes
) {
2029 for (i
= 0; i
< n
; i
++) {
2030 GLshort value
= s
[i
];
2036 for (i
= 0; i
< n
; i
++)
2041 case GL_UNSIGNED_INT
:
2044 const GLuint
*s
= (const GLuint
*) src
;
2045 if (unpack
->SwapBytes
) {
2046 for (i
= 0; i
< n
; i
++) {
2047 GLuint value
= s
[i
];
2053 for (i
= 0; i
< n
; i
++)
2061 const GLint
*s
= (const GLint
*) src
;
2062 if (unpack
->SwapBytes
) {
2063 for (i
= 0; i
< n
; i
++) {
2070 for (i
= 0; i
< n
; i
++)
2078 const GLfloat
*s
= (const GLfloat
*) src
;
2079 if (unpack
->SwapBytes
) {
2080 for (i
= 0; i
< n
; i
++) {
2081 GLfloat value
= s
[i
];
2083 indexes
[i
] = (GLuint
) value
;
2087 for (i
= 0; i
< n
; i
++)
2088 indexes
[i
] = (GLuint
) s
[i
];
2092 case GL_HALF_FLOAT_ARB
:
2095 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2096 if (unpack
->SwapBytes
) {
2097 for (i
= 0; i
< n
; i
++) {
2098 GLhalfARB value
= s
[i
];
2100 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2104 for (i
= 0; i
< n
; i
++)
2105 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2109 case GL_UNSIGNED_INT_24_8_EXT
:
2112 const GLuint
*s
= (const GLuint
*) src
;
2113 if (unpack
->SwapBytes
) {
2114 for (i
= 0; i
< n
; i
++) {
2115 GLuint value
= s
[i
];
2117 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2121 for (i
= 0; i
< n
; i
++)
2122 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2128 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2135 * Return source/dest RGBA indexes for unpacking pixels.
2138 get_component_mapping(GLenum format
,
2150 case GL_RED_INTEGER_EXT
:
2152 *gSrc
= *bSrc
= *aSrc
= -1;
2155 case GL_GREEN_INTEGER_EXT
:
2157 *rSrc
= *bSrc
= *aSrc
= -1;
2160 case GL_BLUE_INTEGER_EXT
:
2162 *rSrc
= *gSrc
= *aSrc
= -1;
2165 case GL_ALPHA_INTEGER_EXT
:
2166 *rSrc
= *gSrc
= *bSrc
= -1;
2170 case GL_LUMINANCE_INTEGER_EXT
:
2171 *rSrc
= *gSrc
= *bSrc
= 0;
2174 case GL_LUMINANCE_ALPHA
:
2175 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2176 *rSrc
= *gSrc
= *bSrc
= 0;
2180 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2194 case GL_RGB_INTEGER
:
2215 case GL_RGBA_INTEGER
:
2253 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2254 _mesa_lookup_enum_by_nr(format
));
2262 * This function extracts floating point RGBA values from arbitrary
2263 * image data. srcFormat and srcType are the format and type parameters
2264 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2266 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2267 * implements the "Conversion to floating point", "Conversion to RGB",
2268 * and "Final Expansion to RGBA" operations.
2270 * Args: n - number of pixels
2271 * rgba - output colors
2272 * srcFormat - format of incoming data
2273 * srcType - data type of incoming data
2274 * src - source data pointer
2275 * swapBytes - perform byteswapping of incoming data?
2278 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2279 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2280 GLboolean swapBytes
)
2282 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2284 GLint rDst
, bDst
, gDst
, aDst
;
2285 GLboolean intFormat
;
2286 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2288 ASSERT(srcFormat
== GL_RED
||
2289 srcFormat
== GL_GREEN
||
2290 srcFormat
== GL_BLUE
||
2291 srcFormat
== GL_ALPHA
||
2292 srcFormat
== GL_LUMINANCE
||
2293 srcFormat
== GL_LUMINANCE_ALPHA
||
2294 srcFormat
== GL_INTENSITY
||
2295 srcFormat
== GL_RG
||
2296 srcFormat
== GL_RGB
||
2297 srcFormat
== GL_BGR
||
2298 srcFormat
== GL_RGBA
||
2299 srcFormat
== GL_BGRA
||
2300 srcFormat
== GL_ABGR_EXT
||
2301 srcFormat
== GL_DU8DV8_ATI
||
2302 srcFormat
== GL_DUDV_ATI
||
2303 srcFormat
== GL_RED_INTEGER_EXT
||
2304 srcFormat
== GL_GREEN_INTEGER_EXT
||
2305 srcFormat
== GL_BLUE_INTEGER_EXT
||
2306 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2307 srcFormat
== GL_RGB_INTEGER_EXT
||
2308 srcFormat
== GL_RGBA_INTEGER_EXT
||
2309 srcFormat
== GL_BGR_INTEGER_EXT
||
2310 srcFormat
== GL_BGRA_INTEGER_EXT
||
2311 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2312 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2314 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2315 srcType
== GL_BYTE
||
2316 srcType
== GL_UNSIGNED_SHORT
||
2317 srcType
== GL_SHORT
||
2318 srcType
== GL_UNSIGNED_INT
||
2319 srcType
== GL_INT
||
2320 srcType
== GL_HALF_FLOAT_ARB
||
2321 srcType
== GL_FLOAT
||
2322 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2323 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2324 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2325 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2326 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2327 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2328 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2329 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2330 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2331 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2332 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2333 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2335 get_component_mapping(srcFormat
,
2336 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2337 &rDst
, &gDst
, &bDst
, &aDst
);
2339 stride
= _mesa_components_in_format(srcFormat
);
2341 intFormat
= _mesa_is_integer_format(srcFormat
);
2343 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2344 if ((SRC_INDEX) < 0) { \
2347 for (i = 0; i < n; i++) { \
2348 rgba[i][DST_INDEX] = DEFAULT_INT; \
2352 for (i = 0; i < n; i++) { \
2353 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2357 else if (swapBytes) { \
2358 const TYPE *s = (const TYPE *) src; \
2360 for (i = 0; i < n; i++) { \
2361 TYPE value = s[SRC_INDEX]; \
2362 if (sizeof(TYPE) == 2) { \
2365 else if (sizeof(TYPE) == 4) { \
2369 rgba[i][DST_INDEX] = (GLfloat) value; \
2371 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2376 const TYPE *s = (const TYPE *) src; \
2379 for (i = 0; i < n; i++) { \
2380 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2385 for (i = 0; i < n; i++) { \
2386 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2393 case GL_UNSIGNED_BYTE
:
2394 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2395 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2396 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2397 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2400 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2401 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2402 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2403 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2405 case GL_UNSIGNED_SHORT
:
2406 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2407 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2408 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2409 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2412 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2413 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2414 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2415 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2417 case GL_UNSIGNED_INT
:
2418 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2419 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2420 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2421 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2424 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2425 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2426 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2427 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2430 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2431 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2432 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2433 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2435 case GL_HALF_FLOAT_ARB
:
2436 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2437 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2438 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2439 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2441 case GL_UNSIGNED_BYTE_3_3_2
:
2443 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2450 for (i
= 0; i
< n
; i
++) {
2451 GLubyte p
= ubsrc
[i
];
2452 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2453 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2454 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2455 rgba
[i
][aDst
] = 1.0F
;
2459 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2461 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2468 for (i
= 0; i
< n
; i
++) {
2469 GLubyte p
= ubsrc
[i
];
2470 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2471 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2472 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2473 rgba
[i
][aDst
] = 1.0F
;
2477 case GL_UNSIGNED_SHORT_5_6_5
:
2484 const GLushort
*ussrc
= (const GLushort
*) src
;
2486 for (i
= 0; i
< n
; i
++) {
2487 GLushort p
= ussrc
[i
];
2489 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2490 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2491 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2492 rgba
[i
][aDst
] = 1.0F
;
2496 const GLushort
*ussrc
= (const GLushort
*) src
;
2498 for (i
= 0; i
< n
; i
++) {
2499 GLushort p
= ussrc
[i
];
2500 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2501 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2502 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2503 rgba
[i
][aDst
] = 1.0F
;
2507 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2514 const GLushort
*ussrc
= (const GLushort
*) src
;
2516 for (i
= 0; i
< n
; i
++) {
2517 GLushort p
= ussrc
[i
];
2519 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2520 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2521 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2522 rgba
[i
][aDst
] = 1.0F
;
2526 const GLushort
*ussrc
= (const GLushort
*) src
;
2528 for (i
= 0; i
< n
; i
++) {
2529 GLushort p
= ussrc
[i
];
2530 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2531 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2532 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2533 rgba
[i
][aDst
] = 1.0F
;
2537 case GL_UNSIGNED_SHORT_4_4_4_4
:
2539 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2542 const GLushort
*ussrc
= (const GLushort
*) src
;
2544 for (i
= 0; i
< n
; i
++) {
2545 GLushort p
= ussrc
[i
];
2547 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2548 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2549 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2550 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2554 const GLushort
*ussrc
= (const GLushort
*) src
;
2556 for (i
= 0; i
< n
; i
++) {
2557 GLushort p
= ussrc
[i
];
2558 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2559 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2560 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2561 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2565 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2567 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2570 const GLushort
*ussrc
= (const GLushort
*) src
;
2572 for (i
= 0; i
< n
; i
++) {
2573 GLushort p
= ussrc
[i
];
2575 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2576 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2577 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2578 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2582 const GLushort
*ussrc
= (const GLushort
*) src
;
2584 for (i
= 0; i
< n
; i
++) {
2585 GLushort p
= ussrc
[i
];
2586 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2587 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2588 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2589 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2593 case GL_UNSIGNED_SHORT_5_5_5_1
:
2595 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2598 const GLushort
*ussrc
= (const GLushort
*) src
;
2600 for (i
= 0; i
< n
; i
++) {
2601 GLushort p
= ussrc
[i
];
2603 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2604 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2605 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2606 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2610 const GLushort
*ussrc
= (const GLushort
*) src
;
2612 for (i
= 0; i
< n
; i
++) {
2613 GLushort p
= ussrc
[i
];
2614 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2615 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2616 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2617 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2621 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2623 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2626 const GLushort
*ussrc
= (const GLushort
*) src
;
2628 for (i
= 0; i
< n
; i
++) {
2629 GLushort p
= ussrc
[i
];
2631 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2632 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2633 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2634 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2638 const GLushort
*ussrc
= (const GLushort
*) src
;
2640 for (i
= 0; i
< n
; i
++) {
2641 GLushort p
= ussrc
[i
];
2642 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2643 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2644 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2645 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2649 case GL_UNSIGNED_INT_8_8_8_8
:
2651 const GLuint
*uisrc
= (const GLuint
*) src
;
2654 for (i
= 0; i
< n
; i
++) {
2655 GLuint p
= uisrc
[i
];
2656 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2657 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2658 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2659 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2663 for (i
= 0; i
< n
; i
++) {
2664 GLuint p
= uisrc
[i
];
2665 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2666 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2667 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2668 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2673 const GLuint
*uisrc
= (const GLuint
*) src
;
2676 for (i
= 0; i
< n
; i
++) {
2677 GLuint p
= uisrc
[i
];
2678 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2679 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2680 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2681 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2685 for (i
= 0; i
< n
; i
++) {
2686 GLuint p
= uisrc
[i
];
2687 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2688 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2689 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2690 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2695 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2697 const GLuint
*uisrc
= (const GLuint
*) src
;
2700 for (i
= 0; i
< n
; i
++) {
2701 GLuint p
= uisrc
[i
];
2702 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2703 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2704 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2705 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2709 for (i
= 0; i
< n
; i
++) {
2710 GLuint p
= uisrc
[i
];
2711 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2712 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2713 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2714 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2719 const GLuint
*uisrc
= (const GLuint
*) src
;
2722 for (i
= 0; i
< n
; i
++) {
2723 GLuint p
= uisrc
[i
];
2724 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2725 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2726 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2727 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2731 for (i
= 0; i
< n
; i
++) {
2732 GLuint p
= uisrc
[i
];
2733 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2734 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2735 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2736 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2741 case GL_UNSIGNED_INT_10_10_10_2
:
2743 rs
= 1.0F
/ 1023.0F
;
2744 gs
= 1.0F
/ 1023.0F
;
2745 bs
= 1.0F
/ 1023.0F
;
2749 const GLuint
*uisrc
= (const GLuint
*) src
;
2751 for (i
= 0; i
< n
; i
++) {
2752 GLuint p
= uisrc
[i
];
2754 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2755 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2756 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2757 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2761 const GLuint
*uisrc
= (const GLuint
*) src
;
2763 for (i
= 0; i
< n
; i
++) {
2764 GLuint p
= uisrc
[i
];
2765 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2766 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2767 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2768 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2772 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2774 rs
= 1.0F
/ 1023.0F
;
2775 gs
= 1.0F
/ 1023.0F
;
2776 bs
= 1.0F
/ 1023.0F
;
2780 const GLuint
*uisrc
= (const GLuint
*) src
;
2782 for (i
= 0; i
< n
; i
++) {
2783 GLuint p
= uisrc
[i
];
2785 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2786 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2787 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2788 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2792 const GLuint
*uisrc
= (const GLuint
*) src
;
2794 for (i
= 0; i
< n
; i
++) {
2795 GLuint p
= uisrc
[i
];
2796 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2797 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2798 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2799 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2804 _mesa_problem(NULL
, "bad srcType in extract float data");
2811 static INLINE GLuint
2812 clamp_byte_to_uint(GLbyte b
)
2814 return b
< 0 ? 0 : b
;
2818 static INLINE GLuint
2819 clamp_short_to_uint(GLshort s
)
2821 return s
< 0 ? 0 : s
;
2825 static INLINE GLuint
2826 clamp_int_to_uint(GLint i
)
2828 return i
< 0 ? 0 : i
;
2832 static INLINE GLuint
2833 clamp_float_to_uint(GLfloat f
)
2835 return f
< 0.0F
? 0 : IROUND(f
);
2839 static INLINE GLuint
2840 clamp_half_to_uint(GLhalfARB h
)
2842 GLfloat f
= _mesa_half_to_float(h
);
2843 return f
< 0.0F
? 0 : IROUND(f
);
2848 * \sa extract_float_rgba()
2851 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2852 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2853 GLboolean swapBytes
)
2855 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2857 GLint rDst
, bDst
, gDst
, aDst
;
2858 GLboolean intFormat
;
2860 ASSERT(srcFormat
== GL_RED
||
2861 srcFormat
== GL_GREEN
||
2862 srcFormat
== GL_BLUE
||
2863 srcFormat
== GL_ALPHA
||
2864 srcFormat
== GL_LUMINANCE
||
2865 srcFormat
== GL_LUMINANCE_ALPHA
||
2866 srcFormat
== GL_INTENSITY
||
2867 srcFormat
== GL_RG
||
2868 srcFormat
== GL_RGB
||
2869 srcFormat
== GL_BGR
||
2870 srcFormat
== GL_RGBA
||
2871 srcFormat
== GL_BGRA
||
2872 srcFormat
== GL_ABGR_EXT
||
2873 srcFormat
== GL_DU8DV8_ATI
||
2874 srcFormat
== GL_DUDV_ATI
||
2875 srcFormat
== GL_RED_INTEGER_EXT
||
2876 srcFormat
== GL_GREEN_INTEGER_EXT
||
2877 srcFormat
== GL_BLUE_INTEGER_EXT
||
2878 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2879 srcFormat
== GL_RGB_INTEGER_EXT
||
2880 srcFormat
== GL_RGBA_INTEGER_EXT
||
2881 srcFormat
== GL_BGR_INTEGER_EXT
||
2882 srcFormat
== GL_BGRA_INTEGER_EXT
||
2883 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2884 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2886 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2887 srcType
== GL_BYTE
||
2888 srcType
== GL_UNSIGNED_SHORT
||
2889 srcType
== GL_SHORT
||
2890 srcType
== GL_UNSIGNED_INT
||
2891 srcType
== GL_INT
||
2892 srcType
== GL_HALF_FLOAT_ARB
||
2893 srcType
== GL_FLOAT
||
2894 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2895 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2896 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2897 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2898 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2899 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2900 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2901 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2902 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2903 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2904 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2905 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2907 get_component_mapping(srcFormat
,
2908 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2909 &rDst
, &gDst
, &bDst
, &aDst
);
2911 stride
= _mesa_components_in_format(srcFormat
);
2913 intFormat
= _mesa_is_integer_format(srcFormat
);
2915 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2916 if ((SRC_INDEX) < 0) { \
2918 for (i = 0; i < n; i++) { \
2919 rgba[i][DST_INDEX] = DEFAULT; \
2922 else if (swapBytes) { \
2923 const TYPE *s = (const TYPE *) src; \
2925 for (i = 0; i < n; i++) { \
2926 TYPE value = s[SRC_INDEX]; \
2927 if (sizeof(TYPE) == 2) { \
2930 else if (sizeof(TYPE) == 4) { \
2933 rgba[i][DST_INDEX] = CONVERSION(value); \
2938 const TYPE *s = (const TYPE *) src; \
2940 for (i = 0; i < n; i++) { \
2941 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2947 case GL_UNSIGNED_BYTE
:
2948 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2949 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2950 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2951 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2954 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2955 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2956 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2957 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2959 case GL_UNSIGNED_SHORT
:
2960 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2961 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2962 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2963 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2966 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2967 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2968 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2969 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2971 case GL_UNSIGNED_INT
:
2972 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2973 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2974 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2975 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2978 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2979 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2980 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2981 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2984 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2985 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2986 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2987 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
2989 case GL_HALF_FLOAT_ARB
:
2990 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2991 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2992 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2993 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
2995 case GL_UNSIGNED_BYTE_3_3_2
:
2997 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2999 for (i
= 0; i
< n
; i
++) {
3000 GLubyte p
= ubsrc
[i
];
3001 rgba
[i
][rDst
] = ((p
>> 5) );
3002 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3003 rgba
[i
][bDst
] = ((p
) & 0x3);
3008 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3010 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3012 for (i
= 0; i
< n
; i
++) {
3013 GLubyte p
= ubsrc
[i
];
3014 rgba
[i
][rDst
] = ((p
) & 0x7);
3015 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3016 rgba
[i
][bDst
] = ((p
>> 6) );
3021 case GL_UNSIGNED_SHORT_5_6_5
:
3023 const GLushort
*ussrc
= (const GLushort
*) src
;
3025 for (i
= 0; i
< n
; i
++) {
3026 GLushort p
= ussrc
[i
];
3028 rgba
[i
][rDst
] = ((p
>> 11) );
3029 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3030 rgba
[i
][bDst
] = ((p
) & 0x1f);
3035 const GLushort
*ussrc
= (const GLushort
*) src
;
3037 for (i
= 0; i
< n
; i
++) {
3038 GLushort p
= ussrc
[i
];
3039 rgba
[i
][rDst
] = ((p
>> 11) );
3040 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3041 rgba
[i
][bDst
] = ((p
) & 0x1f);
3046 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3048 const GLushort
*ussrc
= (const GLushort
*) src
;
3050 for (i
= 0; i
< n
; i
++) {
3051 GLushort p
= ussrc
[i
];
3053 rgba
[i
][rDst
] = ((p
) & 0x1f);
3054 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3055 rgba
[i
][bDst
] = ((p
>> 11) );
3060 const GLushort
*ussrc
= (const GLushort
*) src
;
3062 for (i
= 0; i
< n
; i
++) {
3063 GLushort p
= ussrc
[i
];
3064 rgba
[i
][rDst
] = ((p
) & 0x1f);
3065 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3066 rgba
[i
][bDst
] = ((p
>> 11) );
3071 case GL_UNSIGNED_SHORT_4_4_4_4
:
3073 const GLushort
*ussrc
= (const GLushort
*) src
;
3075 for (i
= 0; i
< n
; i
++) {
3076 GLushort p
= ussrc
[i
];
3078 rgba
[i
][rDst
] = ((p
>> 12) );
3079 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3080 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3081 rgba
[i
][aDst
] = ((p
) & 0xf);
3085 const GLushort
*ussrc
= (const GLushort
*) src
;
3087 for (i
= 0; i
< n
; i
++) {
3088 GLushort p
= ussrc
[i
];
3089 rgba
[i
][rDst
] = ((p
>> 12) );
3090 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3091 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3092 rgba
[i
][aDst
] = ((p
) & 0xf);
3096 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3098 const GLushort
*ussrc
= (const GLushort
*) src
;
3100 for (i
= 0; i
< n
; i
++) {
3101 GLushort p
= ussrc
[i
];
3103 rgba
[i
][rDst
] = ((p
) & 0xf);
3104 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3105 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3106 rgba
[i
][aDst
] = ((p
>> 12) );
3110 const GLushort
*ussrc
= (const GLushort
*) src
;
3112 for (i
= 0; i
< n
; i
++) {
3113 GLushort p
= ussrc
[i
];
3114 rgba
[i
][rDst
] = ((p
) & 0xf);
3115 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3116 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3117 rgba
[i
][aDst
] = ((p
>> 12) );
3121 case GL_UNSIGNED_SHORT_5_5_5_1
:
3123 const GLushort
*ussrc
= (const GLushort
*) src
;
3125 for (i
= 0; i
< n
; i
++) {
3126 GLushort p
= ussrc
[i
];
3128 rgba
[i
][rDst
] = ((p
>> 11) );
3129 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3130 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3131 rgba
[i
][aDst
] = ((p
) & 0x1 );
3135 const GLushort
*ussrc
= (const GLushort
*) src
;
3137 for (i
= 0; i
< n
; i
++) {
3138 GLushort p
= ussrc
[i
];
3139 rgba
[i
][rDst
] = ((p
>> 11) );
3140 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3141 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3142 rgba
[i
][aDst
] = ((p
) & 0x1 );
3146 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3148 const GLushort
*ussrc
= (const GLushort
*) src
;
3150 for (i
= 0; i
< n
; i
++) {
3151 GLushort p
= ussrc
[i
];
3153 rgba
[i
][rDst
] = ((p
) & 0x1f);
3154 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3155 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3156 rgba
[i
][aDst
] = ((p
>> 15) );
3160 const GLushort
*ussrc
= (const GLushort
*) src
;
3162 for (i
= 0; i
< n
; i
++) {
3163 GLushort p
= ussrc
[i
];
3164 rgba
[i
][rDst
] = ((p
) & 0x1f);
3165 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3166 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3167 rgba
[i
][aDst
] = ((p
>> 15) );
3171 case GL_UNSIGNED_INT_8_8_8_8
:
3173 const GLuint
*uisrc
= (const GLuint
*) src
;
3175 for (i
= 0; i
< n
; i
++) {
3176 GLuint p
= uisrc
[i
];
3177 rgba
[i
][rDst
] = ((p
) & 0xff);
3178 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3179 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3180 rgba
[i
][aDst
] = ((p
>> 24) );
3184 const GLuint
*uisrc
= (const GLuint
*) src
;
3186 for (i
= 0; i
< n
; i
++) {
3187 GLuint p
= uisrc
[i
];
3188 rgba
[i
][rDst
] = ((p
>> 24) );
3189 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3190 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3191 rgba
[i
][aDst
] = ((p
) & 0xff);
3195 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3197 const GLuint
*uisrc
= (const GLuint
*) src
;
3199 for (i
= 0; i
< n
; i
++) {
3200 GLuint p
= uisrc
[i
];
3201 rgba
[i
][rDst
] = ((p
>> 24) );
3202 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3203 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3204 rgba
[i
][aDst
] = ((p
) & 0xff);
3208 const GLuint
*uisrc
= (const GLuint
*) src
;
3210 for (i
= 0; i
< n
; i
++) {
3211 GLuint p
= uisrc
[i
];
3212 rgba
[i
][rDst
] = ((p
) & 0xff);
3213 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3214 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3215 rgba
[i
][aDst
] = ((p
>> 24) );
3219 case GL_UNSIGNED_INT_10_10_10_2
:
3221 const GLuint
*uisrc
= (const GLuint
*) src
;
3223 for (i
= 0; i
< n
; i
++) {
3224 GLuint p
= uisrc
[i
];
3226 rgba
[i
][rDst
] = ((p
>> 22) );
3227 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3228 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3229 rgba
[i
][aDst
] = ((p
) & 0x3 );
3233 const GLuint
*uisrc
= (const GLuint
*) src
;
3235 for (i
= 0; i
< n
; i
++) {
3236 GLuint p
= uisrc
[i
];
3237 rgba
[i
][rDst
] = ((p
>> 22) );
3238 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3239 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3240 rgba
[i
][aDst
] = ((p
) & 0x3 );
3244 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3246 const GLuint
*uisrc
= (const GLuint
*) src
;
3248 for (i
= 0; i
< n
; i
++) {
3249 GLuint p
= uisrc
[i
];
3251 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3252 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3253 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3254 rgba
[i
][aDst
] = ((p
>> 30) );
3258 const GLuint
*uisrc
= (const GLuint
*) src
;
3260 for (i
= 0; i
< n
; i
++) {
3261 GLuint p
= uisrc
[i
];
3262 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3263 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3264 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3265 rgba
[i
][aDst
] = ((p
>> 30) );
3270 _mesa_problem(NULL
, "bad srcType in extract uint data");
3279 * Unpack a row of color image data from a client buffer according to
3280 * the pixel unpacking parameters.
3281 * Return GLchan values in the specified dest image format.
3282 * This is used by glDrawPixels and glTexImage?D().
3283 * \param ctx - the context
3284 * n - number of pixels in the span
3285 * dstFormat - format of destination color array
3286 * dest - the destination color array
3287 * srcFormat - source image format
3288 * srcType - source image data type
3289 * source - source image pointer
3290 * srcPacking - pixel unpacking parameters
3291 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3293 * XXX perhaps expand this to process whole images someday.
3296 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3297 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3298 GLenum srcFormat
, GLenum srcType
,
3299 const GLvoid
*source
,
3300 const struct gl_pixelstore_attrib
*srcPacking
,
3301 GLbitfield transferOps
)
3303 ASSERT(dstFormat
== GL_ALPHA
||
3304 dstFormat
== GL_LUMINANCE
||
3305 dstFormat
== GL_LUMINANCE_ALPHA
||
3306 dstFormat
== GL_INTENSITY
||
3307 dstFormat
== GL_RED
||
3308 dstFormat
== GL_RG
||
3309 dstFormat
== GL_RGB
||
3310 dstFormat
== GL_RGBA
||
3311 dstFormat
== GL_COLOR_INDEX
);
3313 ASSERT(srcFormat
== GL_RED
||
3314 srcFormat
== GL_GREEN
||
3315 srcFormat
== GL_BLUE
||
3316 srcFormat
== GL_ALPHA
||
3317 srcFormat
== GL_LUMINANCE
||
3318 srcFormat
== GL_LUMINANCE_ALPHA
||
3319 srcFormat
== GL_INTENSITY
||
3320 srcFormat
== GL_RG
||
3321 srcFormat
== GL_RGB
||
3322 srcFormat
== GL_BGR
||
3323 srcFormat
== GL_RGBA
||
3324 srcFormat
== GL_BGRA
||
3325 srcFormat
== GL_ABGR_EXT
||
3326 srcFormat
== GL_COLOR_INDEX
);
3328 ASSERT(srcType
== GL_BITMAP
||
3329 srcType
== GL_UNSIGNED_BYTE
||
3330 srcType
== GL_BYTE
||
3331 srcType
== GL_UNSIGNED_SHORT
||
3332 srcType
== GL_SHORT
||
3333 srcType
== GL_UNSIGNED_INT
||
3334 srcType
== GL_INT
||
3335 srcType
== GL_HALF_FLOAT_ARB
||
3336 srcType
== GL_FLOAT
||
3337 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3338 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3339 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3340 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3341 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3342 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3343 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3344 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3345 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3346 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3347 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3348 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3350 /* Try simple cases first */
3351 if (transferOps
== 0) {
3352 if (srcType
== CHAN_TYPE
) {
3353 if (dstFormat
== GL_RGBA
) {
3354 if (srcFormat
== GL_RGBA
) {
3355 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3358 else if (srcFormat
== GL_RGB
) {
3360 const GLchan
*src
= (const GLchan
*) source
;
3362 for (i
= 0; i
< n
; i
++) {
3373 else if (dstFormat
== GL_RGB
) {
3374 if (srcFormat
== GL_RGB
) {
3375 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3378 else if (srcFormat
== GL_RGBA
) {
3380 const GLchan
*src
= (const GLchan
*) source
;
3382 for (i
= 0; i
< n
; i
++) {
3392 else if (dstFormat
== srcFormat
) {
3393 GLint comps
= _mesa_components_in_format(srcFormat
);
3395 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3400 * Common situation, loading 8bit RGBA/RGB source images
3401 * into 16/32 bit destination. (OSMesa16/32)
3403 else if (srcType
== GL_UNSIGNED_BYTE
) {
3404 if (dstFormat
== GL_RGBA
) {
3405 if (srcFormat
== GL_RGB
) {
3407 const GLubyte
*src
= (const GLubyte
*) source
;
3409 for (i
= 0; i
< n
; i
++) {
3410 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3411 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3412 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3419 else if (srcFormat
== GL_RGBA
) {
3421 const GLubyte
*src
= (const GLubyte
*) source
;
3423 for (i
= 0; i
< n
; i
++) {
3424 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3425 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3426 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3427 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3434 else if (dstFormat
== GL_RGB
) {
3435 if (srcFormat
== GL_RGB
) {
3437 const GLubyte
*src
= (const GLubyte
*) source
;
3439 for (i
= 0; i
< n
; i
++) {
3440 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3441 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3442 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3448 else if (srcFormat
== GL_RGBA
) {
3450 const GLubyte
*src
= (const GLubyte
*) source
;
3452 for (i
= 0; i
< n
; i
++) {
3453 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3454 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3455 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3466 /* general solution begins here */
3468 GLint dstComponents
;
3469 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3470 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3473 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3477 dstComponents
= _mesa_components_in_format( dstFormat
);
3478 /* source & dest image formats should have been error checked by now */
3479 assert(dstComponents
> 0);
3482 * Extract image data and convert to RGBA floats
3484 if (srcFormat
== GL_COLOR_INDEX
) {
3485 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3488 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3492 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3495 if (dstFormat
== GL_COLOR_INDEX
) {
3497 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3498 /* convert to GLchan and return */
3499 for (i
= 0; i
< n
; i
++) {
3500 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3507 /* Convert indexes to RGBA */
3508 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3509 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3511 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3514 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3515 * with color indexes.
3517 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3522 /* non-color index data */
3523 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3524 srcPacking
->SwapBytes
);
3527 /* Need to clamp if returning GLubytes or GLushorts */
3528 #if CHAN_TYPE != GL_FLOAT
3529 transferOps
|= IMAGE_CLAMP_BIT
;
3533 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3536 get_component_indexes(dstFormat
,
3537 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3539 /* Now return the GLchan data in the requested dstFormat */
3543 for (i
= 0; i
< n
; i
++) {
3544 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3545 dst
+= dstComponents
;
3552 for (i
= 0; i
< n
; i
++) {
3553 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3554 dst
+= dstComponents
;
3561 for (i
= 0; i
< n
; i
++) {
3562 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3563 dst
+= dstComponents
;
3570 for (i
= 0; i
< n
; i
++) {
3571 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3572 dst
+= dstComponents
;
3580 assert(dstComponents
== 1);
3581 for (i
= 0; i
< n
; i
++) {
3582 /* Intensity comes from red channel */
3583 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3591 for (i
= 0; i
< n
; i
++) {
3592 /* Luminance comes from red channel */
3593 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3594 dst
+= dstComponents
;
3604 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3605 * instead of GLchan.
3608 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3609 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3610 GLenum srcFormat
, GLenum srcType
,
3611 const GLvoid
*source
,
3612 const struct gl_pixelstore_attrib
*srcPacking
,
3613 GLbitfield transferOps
)
3615 ASSERT(dstFormat
== GL_ALPHA
||
3616 dstFormat
== GL_LUMINANCE
||
3617 dstFormat
== GL_LUMINANCE_ALPHA
||
3618 dstFormat
== GL_INTENSITY
||
3619 dstFormat
== GL_RED
||
3620 dstFormat
== GL_RG
||
3621 dstFormat
== GL_RGB
||
3622 dstFormat
== GL_RGBA
||
3623 dstFormat
== GL_COLOR_INDEX
);
3625 ASSERT(srcFormat
== GL_RED
||
3626 srcFormat
== GL_GREEN
||
3627 srcFormat
== GL_BLUE
||
3628 srcFormat
== GL_ALPHA
||
3629 srcFormat
== GL_LUMINANCE
||
3630 srcFormat
== GL_LUMINANCE_ALPHA
||
3631 srcFormat
== GL_INTENSITY
||
3632 srcFormat
== GL_RG
||
3633 srcFormat
== GL_RGB
||
3634 srcFormat
== GL_BGR
||
3635 srcFormat
== GL_RGBA
||
3636 srcFormat
== GL_BGRA
||
3637 srcFormat
== GL_ABGR_EXT
||
3638 srcFormat
== GL_RED_INTEGER_EXT
||
3639 srcFormat
== GL_GREEN_INTEGER_EXT
||
3640 srcFormat
== GL_BLUE_INTEGER_EXT
||
3641 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3642 srcFormat
== GL_RGB_INTEGER_EXT
||
3643 srcFormat
== GL_RGBA_INTEGER_EXT
||
3644 srcFormat
== GL_BGR_INTEGER_EXT
||
3645 srcFormat
== GL_BGRA_INTEGER_EXT
||
3646 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3647 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3648 srcFormat
== GL_COLOR_INDEX
);
3650 ASSERT(srcType
== GL_BITMAP
||
3651 srcType
== GL_UNSIGNED_BYTE
||
3652 srcType
== GL_BYTE
||
3653 srcType
== GL_UNSIGNED_SHORT
||
3654 srcType
== GL_SHORT
||
3655 srcType
== GL_UNSIGNED_INT
||
3656 srcType
== GL_INT
||
3657 srcType
== GL_HALF_FLOAT_ARB
||
3658 srcType
== GL_FLOAT
||
3659 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3660 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3661 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3662 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3663 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3664 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3665 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3666 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3667 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3668 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3669 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3670 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3672 /* general solution, no special cases, yet */
3674 GLint dstComponents
;
3675 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3676 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3679 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3683 dstComponents
= _mesa_components_in_format( dstFormat
);
3684 /* source & dest image formats should have been error checked by now */
3685 assert(dstComponents
> 0);
3688 * Extract image data and convert to RGBA floats
3690 if (srcFormat
== GL_COLOR_INDEX
) {
3691 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3694 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3699 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3702 if (dstFormat
== GL_COLOR_INDEX
) {
3704 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3705 /* convert to GLchan and return */
3706 for (i
= 0; i
< n
; i
++) {
3707 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3714 /* Convert indexes to RGBA */
3715 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3716 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3718 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3721 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3722 * with color indexes.
3724 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3729 /* non-color index data */
3730 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3731 srcPacking
->SwapBytes
);
3735 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3738 get_component_indexes(dstFormat
,
3739 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3741 /* Now pack results in the requested dstFormat */
3743 GLfloat
*dst
= dest
;
3745 for (i
= 0; i
< n
; i
++) {
3746 dst
[rDst
] = rgba
[i
][RCOMP
];
3747 dst
+= dstComponents
;
3752 GLfloat
*dst
= dest
;
3754 for (i
= 0; i
< n
; i
++) {
3755 dst
[gDst
] = rgba
[i
][GCOMP
];
3756 dst
+= dstComponents
;
3761 GLfloat
*dst
= dest
;
3763 for (i
= 0; i
< n
; i
++) {
3764 dst
[bDst
] = rgba
[i
][BCOMP
];
3765 dst
+= dstComponents
;
3770 GLfloat
*dst
= dest
;
3772 for (i
= 0; i
< n
; i
++) {
3773 dst
[aDst
] = rgba
[i
][ACOMP
];
3774 dst
+= dstComponents
;
3779 GLfloat
*dst
= dest
;
3782 assert(dstComponents
== 1);
3783 for (i
= 0; i
< n
; i
++) {
3784 /* Intensity comes from red channel */
3785 dst
[i
] = rgba
[i
][RCOMP
];
3790 GLfloat
*dst
= dest
;
3793 for (i
= 0; i
< n
; i
++) {
3794 /* Luminance comes from red channel */
3795 dst
[0] = rgba
[i
][RCOMP
];
3796 dst
+= dstComponents
;
3806 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3807 * instead of GLchan.
3808 * No pixel transfer ops are applied.
3811 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3812 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3813 GLenum srcFormat
, GLenum srcType
,
3814 const GLvoid
*source
,
3815 const struct gl_pixelstore_attrib
*srcPacking
)
3817 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3820 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3824 ASSERT(dstFormat
== GL_ALPHA
||
3825 dstFormat
== GL_LUMINANCE
||
3826 dstFormat
== GL_LUMINANCE_ALPHA
||
3827 dstFormat
== GL_INTENSITY
||
3828 dstFormat
== GL_RED
||
3829 dstFormat
== GL_RG
||
3830 dstFormat
== GL_RGB
||
3831 dstFormat
== GL_RGBA
);
3833 ASSERT(srcFormat
== GL_RED
||
3834 srcFormat
== GL_GREEN
||
3835 srcFormat
== GL_BLUE
||
3836 srcFormat
== GL_ALPHA
||
3837 srcFormat
== GL_LUMINANCE
||
3838 srcFormat
== GL_LUMINANCE_ALPHA
||
3839 srcFormat
== GL_INTENSITY
||
3840 srcFormat
== GL_RG
||
3841 srcFormat
== GL_RGB
||
3842 srcFormat
== GL_BGR
||
3843 srcFormat
== GL_RGBA
||
3844 srcFormat
== GL_BGRA
||
3845 srcFormat
== GL_ABGR_EXT
||
3846 srcFormat
== GL_RED_INTEGER_EXT
||
3847 srcFormat
== GL_GREEN_INTEGER_EXT
||
3848 srcFormat
== GL_BLUE_INTEGER_EXT
||
3849 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3850 srcFormat
== GL_RGB_INTEGER_EXT
||
3851 srcFormat
== GL_RGBA_INTEGER_EXT
||
3852 srcFormat
== GL_BGR_INTEGER_EXT
||
3853 srcFormat
== GL_BGRA_INTEGER_EXT
||
3854 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3855 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3857 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3858 srcType
== GL_BYTE
||
3859 srcType
== GL_UNSIGNED_SHORT
||
3860 srcType
== GL_SHORT
||
3861 srcType
== GL_UNSIGNED_INT
||
3862 srcType
== GL_INT
||
3863 srcType
== GL_HALF_FLOAT_ARB
||
3864 srcType
== GL_FLOAT
||
3865 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3866 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3867 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3868 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3869 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3870 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3871 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3872 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3873 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3874 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3875 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3876 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3879 /* Extract image data as uint[4] pixels */
3880 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3881 srcPacking
->SwapBytes
);
3883 if (dstFormat
== GL_RGBA
) {
3885 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3889 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3890 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3892 assert(dstComponents
> 0);
3894 get_component_indexes(dstFormat
,
3895 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3897 /* Now pack values in the requested dest format */
3901 for (i
= 0; i
< n
; i
++) {
3902 dst
[rDst
] = rgba
[i
][RCOMP
];
3903 dst
+= dstComponents
;
3910 for (i
= 0; i
< n
; i
++) {
3911 dst
[gDst
] = rgba
[i
][GCOMP
];
3912 dst
+= dstComponents
;
3919 for (i
= 0; i
< n
; i
++) {
3920 dst
[bDst
] = rgba
[i
][BCOMP
];
3921 dst
+= dstComponents
;
3928 for (i
= 0; i
< n
; i
++) {
3929 dst
[aDst
] = rgba
[i
][ACOMP
];
3930 dst
+= dstComponents
;
3938 assert(dstComponents
== 1);
3939 for (i
= 0; i
< n
; i
++) {
3940 /* Intensity comes from red channel */
3941 dst
[i
] = rgba
[i
][RCOMP
];
3949 for (i
= 0; i
< n
; i
++) {
3950 /* Luminance comes from red channel */
3951 dst
[0] = rgba
[i
][RCOMP
];
3952 dst
+= dstComponents
;
3963 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3964 * directly return GLbyte data, no transfer ops apply.
3967 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3968 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3969 GLenum srcFormat
, GLenum srcType
,
3970 const GLvoid
*source
,
3971 const struct gl_pixelstore_attrib
*srcPacking
,
3972 GLbitfield transferOps
)
3974 ASSERT(dstFormat
== GL_DUDV_ATI
);
3975 ASSERT(srcFormat
== GL_DUDV_ATI
||
3976 srcFormat
== GL_DU8DV8_ATI
);
3978 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3979 srcType
== GL_BYTE
||
3980 srcType
== GL_UNSIGNED_SHORT
||
3981 srcType
== GL_SHORT
||
3982 srcType
== GL_UNSIGNED_INT
||
3983 srcType
== GL_INT
||
3984 srcType
== GL_HALF_FLOAT_ARB
||
3985 srcType
== GL_FLOAT
);
3987 /* general solution */
3989 GLint dstComponents
;
3992 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3995 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3999 dstComponents
= _mesa_components_in_format( dstFormat
);
4000 /* source & dest image formats should have been error checked by now */
4001 assert(dstComponents
> 0);
4004 * Extract image data and convert to RGBA floats
4006 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4007 srcPacking
->SwapBytes
);
4010 /* Now determine which color channels we need to produce.
4011 * And determine the dest index (offset) within each color tuple.
4014 /* Now pack results in the requested dstFormat */
4015 for (i
= 0; i
< n
; i
++) {
4016 /* not sure - need clamp[-1,1] here? */
4017 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4018 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4019 dst
+= dstComponents
;
4027 * Unpack a row of color index data from a client buffer according to
4028 * the pixel unpacking parameters.
4029 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4031 * Args: ctx - the context
4032 * n - number of pixels
4033 * dstType - destination data type
4034 * dest - destination array
4035 * srcType - source pixel type
4036 * source - source data pointer
4037 * srcPacking - pixel unpacking parameters
4038 * transferOps - the pixel transfer operations to apply
4041 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4042 GLenum dstType
, GLvoid
*dest
,
4043 GLenum srcType
, const GLvoid
*source
,
4044 const struct gl_pixelstore_attrib
*srcPacking
,
4045 GLbitfield transferOps
)
4047 ASSERT(srcType
== GL_BITMAP
||
4048 srcType
== GL_UNSIGNED_BYTE
||
4049 srcType
== GL_BYTE
||
4050 srcType
== GL_UNSIGNED_SHORT
||
4051 srcType
== GL_SHORT
||
4052 srcType
== GL_UNSIGNED_INT
||
4053 srcType
== GL_INT
||
4054 srcType
== GL_HALF_FLOAT_ARB
||
4055 srcType
== GL_FLOAT
);
4057 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4058 dstType
== GL_UNSIGNED_SHORT
||
4059 dstType
== GL_UNSIGNED_INT
);
4062 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4065 * Try simple cases first
4067 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4068 && dstType
== GL_UNSIGNED_BYTE
) {
4069 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4071 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4072 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4073 memcpy(dest
, source
, n
* sizeof(GLuint
));
4079 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4082 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4086 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4090 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4092 /* convert to dest type */
4094 case GL_UNSIGNED_BYTE
:
4096 GLubyte
*dst
= (GLubyte
*) dest
;
4098 for (i
= 0; i
< n
; i
++) {
4099 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4103 case GL_UNSIGNED_SHORT
:
4105 GLuint
*dst
= (GLuint
*) dest
;
4107 for (i
= 0; i
< n
; i
++) {
4108 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4112 case GL_UNSIGNED_INT
:
4113 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4116 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4125 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4126 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4127 const struct gl_pixelstore_attrib
*dstPacking
,
4128 GLbitfield transferOps
)
4130 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4133 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4137 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4139 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4140 /* make a copy of input */
4141 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4142 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4147 case GL_UNSIGNED_BYTE
:
4149 GLubyte
*dst
= (GLubyte
*) dest
;
4151 for (i
= 0; i
< n
; i
++) {
4152 *dst
++ = (GLubyte
) source
[i
];
4158 GLbyte
*dst
= (GLbyte
*) dest
;
4160 for (i
= 0; i
< n
; i
++) {
4161 dst
[i
] = (GLbyte
) source
[i
];
4165 case GL_UNSIGNED_SHORT
:
4167 GLushort
*dst
= (GLushort
*) dest
;
4169 for (i
= 0; i
< n
; i
++) {
4170 dst
[i
] = (GLushort
) source
[i
];
4172 if (dstPacking
->SwapBytes
) {
4173 _mesa_swap2( (GLushort
*) dst
, n
);
4179 GLshort
*dst
= (GLshort
*) dest
;
4181 for (i
= 0; i
< n
; i
++) {
4182 dst
[i
] = (GLshort
) source
[i
];
4184 if (dstPacking
->SwapBytes
) {
4185 _mesa_swap2( (GLushort
*) dst
, n
);
4189 case GL_UNSIGNED_INT
:
4191 GLuint
*dst
= (GLuint
*) dest
;
4193 for (i
= 0; i
< n
; i
++) {
4194 dst
[i
] = (GLuint
) source
[i
];
4196 if (dstPacking
->SwapBytes
) {
4197 _mesa_swap4( (GLuint
*) dst
, n
);
4203 GLint
*dst
= (GLint
*) dest
;
4205 for (i
= 0; i
< n
; i
++) {
4206 dst
[i
] = (GLint
) source
[i
];
4208 if (dstPacking
->SwapBytes
) {
4209 _mesa_swap4( (GLuint
*) dst
, n
);
4215 GLfloat
*dst
= (GLfloat
*) dest
;
4217 for (i
= 0; i
< n
; i
++) {
4218 dst
[i
] = (GLfloat
) source
[i
];
4220 if (dstPacking
->SwapBytes
) {
4221 _mesa_swap4( (GLuint
*) dst
, n
);
4225 case GL_HALF_FLOAT_ARB
:
4227 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4229 for (i
= 0; i
< n
; i
++) {
4230 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4232 if (dstPacking
->SwapBytes
) {
4233 _mesa_swap2( (GLushort
*) dst
, n
);
4238 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4246 * Unpack a row of stencil data from a client buffer according to
4247 * the pixel unpacking parameters.
4248 * This is (or will be) used by glDrawPixels
4250 * Args: ctx - the context
4251 * n - number of pixels
4252 * dstType - destination data type
4253 * dest - destination array
4254 * srcType - source pixel type
4255 * source - source data pointer
4256 * srcPacking - pixel unpacking parameters
4257 * transferOps - apply offset/bias/lookup ops?
4260 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4261 GLenum dstType
, GLvoid
*dest
,
4262 GLenum srcType
, const GLvoid
*source
,
4263 const struct gl_pixelstore_attrib
*srcPacking
,
4264 GLbitfield transferOps
)
4266 ASSERT(srcType
== GL_BITMAP
||
4267 srcType
== GL_UNSIGNED_BYTE
||
4268 srcType
== GL_BYTE
||
4269 srcType
== GL_UNSIGNED_SHORT
||
4270 srcType
== GL_SHORT
||
4271 srcType
== GL_UNSIGNED_INT
||
4272 srcType
== GL_INT
||
4273 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4274 srcType
== GL_HALF_FLOAT_ARB
||
4275 srcType
== GL_FLOAT
);
4277 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4278 dstType
== GL_UNSIGNED_SHORT
||
4279 dstType
== GL_UNSIGNED_INT
);
4281 /* only shift and offset apply to stencil */
4282 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4285 * Try simple cases first
4287 if (transferOps
== 0 &&
4288 !ctx
->Pixel
.MapStencilFlag
&&
4289 srcType
== GL_UNSIGNED_BYTE
&&
4290 dstType
== GL_UNSIGNED_BYTE
) {
4291 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4293 else if (transferOps
== 0 &&
4294 !ctx
->Pixel
.MapStencilFlag
&&
4295 srcType
== GL_UNSIGNED_INT
&&
4296 dstType
== GL_UNSIGNED_INT
&&
4297 !srcPacking
->SwapBytes
) {
4298 memcpy(dest
, source
, n
* sizeof(GLuint
));
4304 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4307 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4311 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4314 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4315 /* shift and offset indexes */
4316 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4319 if (ctx
->Pixel
.MapStencilFlag
) {
4320 /* Apply stencil lookup table */
4321 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4323 for (i
= 0; i
< n
; i
++) {
4324 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4328 /* convert to dest type */
4330 case GL_UNSIGNED_BYTE
:
4332 GLubyte
*dst
= (GLubyte
*) dest
;
4334 for (i
= 0; i
< n
; i
++) {
4335 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4339 case GL_UNSIGNED_SHORT
:
4341 GLuint
*dst
= (GLuint
*) dest
;
4343 for (i
= 0; i
< n
; i
++) {
4344 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4348 case GL_UNSIGNED_INT
:
4349 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4352 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4361 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4362 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4363 const struct gl_pixelstore_attrib
*dstPacking
)
4365 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4368 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4372 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4373 ctx
->Pixel
.MapStencilFlag
) {
4374 /* make a copy of input */
4375 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4376 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4381 case GL_UNSIGNED_BYTE
:
4382 if (sizeof(GLstencil
) == 1) {
4383 memcpy( dest
, source
, n
);
4386 GLubyte
*dst
= (GLubyte
*) dest
;
4389 dst
[i
] = (GLubyte
) source
[i
];
4395 GLbyte
*dst
= (GLbyte
*) dest
;
4398 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4402 case GL_UNSIGNED_SHORT
:
4404 GLushort
*dst
= (GLushort
*) dest
;
4407 dst
[i
] = (GLushort
) source
[i
];
4409 if (dstPacking
->SwapBytes
) {
4410 _mesa_swap2( (GLushort
*) dst
, n
);
4416 GLshort
*dst
= (GLshort
*) dest
;
4419 dst
[i
] = (GLshort
) source
[i
];
4421 if (dstPacking
->SwapBytes
) {
4422 _mesa_swap2( (GLushort
*) dst
, n
);
4426 case GL_UNSIGNED_INT
:
4428 GLuint
*dst
= (GLuint
*) dest
;
4431 dst
[i
] = (GLuint
) source
[i
];
4433 if (dstPacking
->SwapBytes
) {
4434 _mesa_swap4( (GLuint
*) dst
, n
);
4440 GLint
*dst
= (GLint
*) dest
;
4443 dst
[i
] = (GLint
) source
[i
];
4445 if (dstPacking
->SwapBytes
) {
4446 _mesa_swap4( (GLuint
*) dst
, n
);
4452 GLfloat
*dst
= (GLfloat
*) dest
;
4455 dst
[i
] = (GLfloat
) source
[i
];
4457 if (dstPacking
->SwapBytes
) {
4458 _mesa_swap4( (GLuint
*) dst
, n
);
4462 case GL_HALF_FLOAT_ARB
:
4464 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4467 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4469 if (dstPacking
->SwapBytes
) {
4470 _mesa_swap2( (GLushort
*) dst
, n
);
4475 if (dstPacking
->LsbFirst
) {
4476 GLubyte
*dst
= (GLubyte
*) dest
;
4479 for (i
= 0; i
< n
; i
++) {
4482 *dst
|= ((source
[i
] != 0) << shift
);
4491 GLubyte
*dst
= (GLubyte
*) dest
;
4494 for (i
= 0; i
< n
; i
++) {
4497 *dst
|= ((source
[i
] != 0) << shift
);
4507 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4513 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4516 const GLTYPE *src = (const GLTYPE *)source; \
4517 for (i = 0; i < n; i++) { \
4518 GLTYPE value = src[i]; \
4519 if (srcPacking->SwapBytes) { \
4520 if (sizeof(GLTYPE) == 2) { \
4522 } else if (sizeof(GLTYPE) == 4) { \
4526 depthValues[i] = GLTYPE2FLOAT(value); \
4532 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4533 * or GLfloat values.
4534 * The glPixelTransfer (scale/bias) params will be applied.
4536 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4537 * \param depthMax max value for returned GLushort or GLuint values
4538 * (ignored for GLfloat).
4541 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4542 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4543 GLenum srcType
, const GLvoid
*source
,
4544 const struct gl_pixelstore_attrib
*srcPacking
)
4546 GLfloat
*depthTemp
, *depthValues
;
4547 GLboolean needClamp
= GL_FALSE
;
4549 /* Look for special cases first.
4550 * Not only are these faster, they're less prone to numeric conversion
4551 * problems. Otherwise, converting from an int type to a float then
4552 * back to an int type can introduce errors that will show up as
4553 * artifacts in things like depth peeling which uses glCopyTexImage.
4555 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4556 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4557 const GLuint
*src
= (const GLuint
*) source
;
4558 GLushort
*dst
= (GLushort
*) dest
;
4560 for (i
= 0; i
< n
; i
++) {
4561 dst
[i
] = src
[i
] >> 16;
4565 if (srcType
== GL_UNSIGNED_SHORT
4566 && dstType
== GL_UNSIGNED_INT
4567 && depthMax
== 0xffffffff) {
4568 const GLushort
*src
= (const GLushort
*) source
;
4569 GLuint
*dst
= (GLuint
*) dest
;
4571 for (i
= 0; i
< n
; i
++) {
4572 dst
[i
] = src
[i
] | (src
[i
] << 16);
4576 if (srcType
== GL_UNSIGNED_INT_24_8
4577 && dstType
== GL_UNSIGNED_INT
4578 && depthMax
== 0xffffff) {
4579 const GLuint
*src
= (const GLuint
*) source
;
4580 GLuint
*dst
= (GLuint
*) dest
;
4582 for (i
= 0; i
< n
; i
++) {
4583 dst
[i
] = src
[i
] >> 8;
4587 /* XXX may want to add additional cases here someday */
4590 /* general case path follows */
4592 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4594 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4598 if (dstType
== GL_FLOAT
) {
4599 depthValues
= (GLfloat
*) dest
;
4602 depthValues
= depthTemp
;
4605 /* Convert incoming values to GLfloat. Some conversions will require
4610 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4611 needClamp
= GL_TRUE
;
4613 case GL_UNSIGNED_BYTE
:
4614 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4617 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4618 needClamp
= GL_TRUE
;
4620 case GL_UNSIGNED_SHORT
:
4621 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4624 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4625 needClamp
= GL_TRUE
;
4627 case GL_UNSIGNED_INT
:
4628 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4630 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4631 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4632 depthMax
== 0xffffff &&
4633 ctx
->Pixel
.DepthScale
== 1.0 &&
4634 ctx
->Pixel
.DepthBias
== 0.0) {
4635 const GLuint
*src
= (const GLuint
*) source
;
4636 GLuint
*zValues
= (GLuint
*) dest
;
4638 for (i
= 0; i
< n
; i
++) {
4639 GLuint value
= src
[i
];
4640 if (srcPacking
->SwapBytes
) {
4643 zValues
[i
] = value
& 0xffffff00;
4648 const GLuint
*src
= (const GLuint
*) source
;
4649 const GLfloat scale
= 1.0f
/ 0xffffff;
4651 for (i
= 0; i
< n
; i
++) {
4652 GLuint value
= src
[i
];
4653 if (srcPacking
->SwapBytes
) {
4656 depthValues
[i
] = (value
>> 8) * scale
;
4661 DEPTH_VALUES(GLfloat
, 1*);
4662 needClamp
= GL_TRUE
;
4664 case GL_HALF_FLOAT_ARB
:
4667 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4668 for (i
= 0; i
< n
; i
++) {
4669 GLhalfARB value
= src
[i
];
4670 if (srcPacking
->SwapBytes
) {
4673 depthValues
[i
] = _mesa_half_to_float(value
);
4675 needClamp
= GL_TRUE
;
4679 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4684 /* apply depth scale and bias */
4686 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4687 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4688 if (scale
!= 1.0 || bias
!= 0.0) {
4690 for (i
= 0; i
< n
; i
++) {
4691 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4693 needClamp
= GL_TRUE
;
4697 /* clamp to [0, 1] */
4700 for (i
= 0; i
< n
; i
++) {
4701 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4706 * Convert values to dstType
4708 if (dstType
== GL_UNSIGNED_INT
) {
4709 GLuint
*zValues
= (GLuint
*) dest
;
4711 if (depthMax
<= 0xffffff) {
4712 /* no overflow worries */
4713 for (i
= 0; i
< n
; i
++) {
4714 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4718 /* need to use double precision to prevent overflow problems */
4719 for (i
= 0; i
< n
; i
++) {
4720 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4721 if (z
>= (GLdouble
) 0xffffffff)
4722 zValues
[i
] = 0xffffffff;
4724 zValues
[i
] = (GLuint
) z
;
4728 else if (dstType
== GL_UNSIGNED_SHORT
) {
4729 GLushort
*zValues
= (GLushort
*) dest
;
4731 ASSERT(depthMax
<= 0xffff);
4732 for (i
= 0; i
< n
; i
++) {
4733 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4737 ASSERT(dstType
== GL_FLOAT
);
4738 /*ASSERT(depthMax == 1.0F);*/
4746 * Pack an array of depth values. The values are floats in [0,1].
4749 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4750 GLenum dstType
, const GLfloat
*depthSpan
,
4751 const struct gl_pixelstore_attrib
*dstPacking
)
4753 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4755 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4759 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4760 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4761 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4762 depthSpan
= depthCopy
;
4766 case GL_UNSIGNED_BYTE
:
4768 GLubyte
*dst
= (GLubyte
*) dest
;
4770 for (i
= 0; i
< n
; i
++) {
4771 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4777 GLbyte
*dst
= (GLbyte
*) dest
;
4779 for (i
= 0; i
< n
; i
++) {
4780 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4784 case GL_UNSIGNED_SHORT
:
4786 GLushort
*dst
= (GLushort
*) dest
;
4788 for (i
= 0; i
< n
; i
++) {
4789 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4791 if (dstPacking
->SwapBytes
) {
4792 _mesa_swap2( (GLushort
*) dst
, n
);
4798 GLshort
*dst
= (GLshort
*) dest
;
4800 for (i
= 0; i
< n
; i
++) {
4801 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4803 if (dstPacking
->SwapBytes
) {
4804 _mesa_swap2( (GLushort
*) dst
, n
);
4808 case GL_UNSIGNED_INT
:
4810 GLuint
*dst
= (GLuint
*) dest
;
4812 for (i
= 0; i
< n
; i
++) {
4813 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4815 if (dstPacking
->SwapBytes
) {
4816 _mesa_swap4( (GLuint
*) dst
, n
);
4822 GLint
*dst
= (GLint
*) dest
;
4824 for (i
= 0; i
< n
; i
++) {
4825 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4827 if (dstPacking
->SwapBytes
) {
4828 _mesa_swap4( (GLuint
*) dst
, n
);
4834 GLfloat
*dst
= (GLfloat
*) dest
;
4836 for (i
= 0; i
< n
; i
++) {
4837 dst
[i
] = depthSpan
[i
];
4839 if (dstPacking
->SwapBytes
) {
4840 _mesa_swap4( (GLuint
*) dst
, n
);
4844 case GL_HALF_FLOAT_ARB
:
4846 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4848 for (i
= 0; i
< n
; i
++) {
4849 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4851 if (dstPacking
->SwapBytes
) {
4852 _mesa_swap2( (GLushort
*) dst
, n
);
4857 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4866 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4869 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4870 const GLfloat
*depthVals
,
4871 const GLstencil
*stencilVals
,
4872 const struct gl_pixelstore_attrib
*dstPacking
)
4874 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4875 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4878 if (!depthCopy
|| !stencilCopy
) {
4879 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4885 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4886 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4887 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4888 depthVals
= depthCopy
;
4891 if (ctx
->Pixel
.IndexShift
||
4892 ctx
->Pixel
.IndexOffset
||
4893 ctx
->Pixel
.MapStencilFlag
) {
4894 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4895 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4896 stencilVals
= stencilCopy
;
4899 for (i
= 0; i
< n
; i
++) {
4900 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4901 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4904 if (dstPacking
->SwapBytes
) {
4905 _mesa_swap4(dest
, n
);
4916 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4917 * Return all image data in a contiguous block. This is used when we
4918 * compile glDrawPixels, glTexImage, etc into a display list. We
4919 * need a copy of the data in a standard format.
4922 _mesa_unpack_image( GLuint dimensions
,
4923 GLsizei width
, GLsizei height
, GLsizei depth
,
4924 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4925 const struct gl_pixelstore_attrib
*unpack
)
4927 GLint bytesPerRow
, compsPerRow
;
4928 GLboolean flipBytes
, swap2
, swap4
;
4931 return NULL
; /* not necessarily an error */
4933 if (width
<= 0 || height
<= 0 || depth
<= 0)
4934 return NULL
; /* generate error later */
4936 if (type
== GL_BITMAP
) {
4937 bytesPerRow
= (width
+ 7) >> 3;
4938 flipBytes
= unpack
->LsbFirst
;
4939 swap2
= swap4
= GL_FALSE
;
4943 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4944 GLint components
= _mesa_components_in_format(format
);
4947 if (_mesa_type_is_packed(type
))
4950 if (bytesPerPixel
<= 0 || components
<= 0)
4951 return NULL
; /* bad format or type. generate error later */
4952 bytesPerRow
= bytesPerPixel
* width
;
4953 bytesPerComp
= bytesPerPixel
/ components
;
4954 flipBytes
= GL_FALSE
;
4955 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4956 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4957 compsPerRow
= components
* width
;
4958 assert(compsPerRow
>= width
);
4963 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4967 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4970 for (img
= 0; img
< depth
; img
++) {
4971 for (row
= 0; row
< height
; row
++) {
4972 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4973 width
, height
, format
, type
, img
, row
, 0);
4975 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4977 flipBytes
= GL_FALSE
;
4978 if (unpack
->LsbFirst
) {
4979 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4980 GLubyte dstMask
= 128;
4981 const GLubyte
*s
= src
;
4984 for (i
= 0; i
< width
; i
++) {
4988 if (srcMask
== 128) {
4993 srcMask
= srcMask
<< 1;
5001 dstMask
= dstMask
>> 1;
5006 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5007 GLubyte dstMask
= 128;
5008 const GLubyte
*s
= src
;
5011 for (i
= 0; i
< width
; i
++) {
5020 srcMask
= srcMask
>> 1;
5028 dstMask
= dstMask
>> 1;
5034 memcpy(dst
, src
, bytesPerRow
);
5037 /* byte flipping/swapping */
5039 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5042 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5045 _mesa_swap4((GLuint
*) dst
, compsPerRow
);