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"
45 * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when
46 * we later convert the float to a packed integer value (such as for
47 * GL_RGB5_A1) because we'll wind up with a non-zero value.
49 * We redefine the macros here so zero is handled correctly.
52 #define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
55 #define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
59 /** Compute ceiling of integer quotient of A divided by B. */
60 #define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
64 * Flip the 8 bits in each byte of the given array.
67 * \param n number of bytes.
69 * \todo try this trick to flip bytes someday:
71 * v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
72 * v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
73 * v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
77 flip_bytes( GLubyte
*p
, GLuint n
)
80 for (i
= 0; i
< n
; i
++) {
81 b
= (GLuint
) p
[i
]; /* words are often faster than bytes */
82 a
= ((b
& 0x01) << 7) |
97 * Unpack a 32x32 pixel polygon stipple from user memory using the
98 * current pixel unpack settings.
101 _mesa_unpack_polygon_stipple( const GLubyte
*pattern
, GLuint dest
[32],
102 const struct gl_pixelstore_attrib
*unpacking
)
104 GLubyte
*ptrn
= (GLubyte
*) _mesa_unpack_bitmap(32, 32, pattern
, unpacking
);
106 /* Convert pattern from GLubytes to GLuints and handle big/little
111 for (i
= 0; i
< 32; i
++) {
112 dest
[i
] = (p
[0] << 24)
124 * Pack polygon stipple into user memory given current pixel packing
128 _mesa_pack_polygon_stipple( const GLuint pattern
[32], GLubyte
*dest
,
129 const struct gl_pixelstore_attrib
*packing
)
131 /* Convert pattern from GLuints to GLubytes to handle big/little
132 * endian differences.
136 for (i
= 0; i
< 32; i
++) {
137 ptrn
[i
* 4 + 0] = (GLubyte
) ((pattern
[i
] >> 24) & 0xff);
138 ptrn
[i
* 4 + 1] = (GLubyte
) ((pattern
[i
] >> 16) & 0xff);
139 ptrn
[i
* 4 + 2] = (GLubyte
) ((pattern
[i
] >> 8 ) & 0xff);
140 ptrn
[i
* 4 + 3] = (GLubyte
) ((pattern
[i
] ) & 0xff);
143 _mesa_pack_bitmap(32, 32, ptrn
, dest
, packing
);
148 * Unpack bitmap data. Resulting data will be in most-significant-bit-first
149 * order with row alignment = 1 byte.
152 _mesa_unpack_bitmap( GLint width
, GLint height
, const GLubyte
*pixels
,
153 const struct gl_pixelstore_attrib
*packing
)
155 GLint bytes
, row
, width_in_bytes
;
156 GLubyte
*buffer
, *dst
;
161 /* Alloc dest storage */
162 bytes
= ((width
+ 7) / 8 * height
);
163 buffer
= (GLubyte
*) malloc( bytes
);
167 width_in_bytes
= CEILING( width
, 8 );
169 for (row
= 0; row
< height
; row
++) {
170 const GLubyte
*src
= (const GLubyte
*)
171 _mesa_image_address2d(packing
, pixels
, width
, height
,
172 GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
178 if ((packing
->SkipPixels
& 7) == 0) {
179 memcpy( dst
, src
, width_in_bytes
);
180 if (packing
->LsbFirst
) {
181 flip_bytes( dst
, width_in_bytes
);
185 /* handling SkipPixels is a bit tricky (no pun intended!) */
187 if (packing
->LsbFirst
) {
188 GLubyte srcMask
= 1 << (packing
->SkipPixels
& 0x7);
189 GLubyte dstMask
= 128;
190 const GLubyte
*s
= src
;
193 for (i
= 0; i
< width
; i
++) {
197 if (srcMask
== 128) {
202 srcMask
= srcMask
<< 1;
210 dstMask
= dstMask
>> 1;
215 GLubyte srcMask
= 128 >> (packing
->SkipPixels
& 0x7);
216 GLubyte dstMask
= 128;
217 const GLubyte
*s
= src
;
220 for (i
= 0; i
< width
; i
++) {
229 srcMask
= srcMask
>> 1;
237 dstMask
= dstMask
>> 1;
242 dst
+= width_in_bytes
;
253 _mesa_pack_bitmap( GLint width
, GLint height
, const GLubyte
*source
,
254 GLubyte
*dest
, const struct gl_pixelstore_attrib
*packing
)
256 GLint row
, width_in_bytes
;
262 width_in_bytes
= CEILING( width
, 8 );
264 for (row
= 0; row
< height
; row
++) {
265 GLubyte
*dst
= (GLubyte
*) _mesa_image_address2d(packing
, dest
,
266 width
, height
, GL_COLOR_INDEX
, GL_BITMAP
, row
, 0);
270 if ((packing
->SkipPixels
& 7) == 0) {
271 memcpy( dst
, src
, width_in_bytes
);
272 if (packing
->LsbFirst
) {
273 flip_bytes( dst
, width_in_bytes
);
277 /* handling SkipPixels is a bit tricky (no pun intended!) */
279 if (packing
->LsbFirst
) {
280 GLubyte srcMask
= 128;
281 GLubyte dstMask
= 1 << (packing
->SkipPixels
& 0x7);
282 const GLubyte
*s
= src
;
285 for (i
= 0; i
< width
; i
++) {
294 srcMask
= srcMask
>> 1;
296 if (dstMask
== 128) {
302 dstMask
= dstMask
<< 1;
307 GLubyte srcMask
= 128;
308 GLubyte dstMask
= 128 >> (packing
->SkipPixels
& 0x7);
309 const GLubyte
*s
= src
;
312 for (i
= 0; i
< width
; i
++) {
321 srcMask
= srcMask
>> 1;
329 dstMask
= dstMask
>> 1;
334 src
+= width_in_bytes
;
340 * Get indexes of color components for a basic color format, such as
341 * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc. Return -1 for indexes
345 get_component_indexes(GLenum format
,
350 GLint
*luminanceIndex
,
351 GLint
*intensityIndex
)
357 *luminanceIndex
= -1;
358 *intensityIndex
= -1;
362 case GL_LUMINANCE_INTEGER_EXT
:
365 case GL_LUMINANCE_ALPHA
:
366 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
374 case GL_RED_INTEGER_EXT
:
378 case GL_GREEN_INTEGER_EXT
:
382 case GL_BLUE_INTEGER_EXT
:
386 case GL_ALPHA_INTEGER_EXT
:
395 case GL_RGB_INTEGER_EXT
:
401 case GL_BGR_INTEGER_EXT
:
407 case GL_RGBA_INTEGER_EXT
:
414 case GL_BGRA_INTEGER
:
432 assert(0 && "bad format in get_component_indexes()");
439 * For small integer types, return the min and max possible values.
440 * Used for clamping floats to unscaled integer types.
441 * \return GL_TRUE if type is handled, GL_FALSE otherwise.
444 get_type_min_max(GLenum type
, GLfloat
*min
, GLfloat
*max
)
451 case GL_UNSIGNED_BYTE
:
459 case GL_UNSIGNED_SHORT
:
471 * Used to pack an array [][4] of RGBA float colors as specified
472 * by the dstFormat, dstType and dstPacking. Used by glReadPixels.
473 * Historically, the RGBA values were in [0,1] and rescaled to fit
474 * into GLubytes, etc. But with new integer formats, the RGBA values
475 * may have any value and we don't always rescale when converting to
478 * Note: the rgba values will be modified by this function when any pixel
479 * transfer ops are enabled.
482 _mesa_pack_rgba_span_float(struct gl_context
*ctx
, GLuint n
, GLfloat rgba
[][4],
483 GLenum dstFormat
, GLenum dstType
,
485 const struct gl_pixelstore_attrib
*dstPacking
,
486 GLbitfield transferOps
)
489 const GLint comps
= _mesa_components_in_format(dstFormat
);
490 const GLboolean intDstFormat
= _mesa_is_integer_format(dstFormat
);
493 if (dstFormat
== GL_LUMINANCE
||
494 dstFormat
== GL_LUMINANCE_ALPHA
||
495 dstFormat
== GL_LUMINANCE_INTEGER_EXT
||
496 dstFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
) {
497 luminance
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
499 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
508 * This test should probably go away. Have the caller set/clear the
509 * IMAGE_CLAMP_BIT as needed.
511 if (dstType
!= GL_FLOAT
|| ctx
->Color
.ClampReadColor
== GL_TRUE
) {
513 /* need to clamp to [0, 1] */
514 transferOps
|= IMAGE_CLAMP_BIT
;
519 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
523 * Component clamping (besides clamping to [0,1] in
524 * _mesa_apply_rgba_transfer_ops()).
527 /* clamping to dest type's min/max values */
529 if (get_type_min_max(dstType
, &min
, &max
)) {
530 for (i
= 0; i
< n
; i
++) {
531 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
532 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
533 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
534 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
538 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
539 /* compute luminance values */
540 if (transferOps
& IMAGE_CLAMP_BIT
) {
541 for (i
= 0; i
< n
; i
++) {
542 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
543 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
547 for (i
= 0; i
< n
; i
++) {
548 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
554 * Pack/store the pixels. Ugh! Lots of cases!!!
557 case GL_UNSIGNED_BYTE
:
559 GLubyte
*dst
= (GLubyte
*) dstAddr
;
563 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
567 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
571 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
575 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
579 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
581 case GL_LUMINANCE_ALPHA
:
583 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
584 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
589 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
590 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
595 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
596 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
597 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
602 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
603 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
604 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
605 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
610 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
611 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
612 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
617 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
618 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
619 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
620 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
625 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
626 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
627 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
628 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
631 case GL_RED_INTEGER_EXT
:
633 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
636 case GL_GREEN_INTEGER_EXT
:
638 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
641 case GL_BLUE_INTEGER_EXT
:
643 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
646 case GL_ALPHA_INTEGER_EXT
:
648 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
651 case GL_RGB_INTEGER_EXT
:
653 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
654 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
655 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
658 case GL_RGBA_INTEGER_EXT
:
660 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
661 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
662 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
663 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
666 case GL_BGR_INTEGER_EXT
:
668 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
669 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
670 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
673 case GL_BGRA_INTEGER_EXT
:
675 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
676 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
677 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
678 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
681 case GL_LUMINANCE_INTEGER_EXT
:
683 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
686 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
689 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
691 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
699 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
700 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
704 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
710 GLbyte
*dst
= (GLbyte
*) dstAddr
;
714 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
718 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
722 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
726 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
730 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
732 case GL_LUMINANCE_ALPHA
:
734 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
735 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
740 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
741 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
746 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
747 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
748 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
753 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
754 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
755 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
756 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
761 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
762 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
763 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
768 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
769 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
770 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
771 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
776 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
777 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
778 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
779 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
782 case GL_RED_INTEGER_EXT
:
784 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
787 case GL_GREEN_INTEGER_EXT
:
789 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
792 case GL_BLUE_INTEGER_EXT
:
794 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
797 case GL_ALPHA_INTEGER_EXT
:
799 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
802 case GL_RGB_INTEGER_EXT
:
804 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
805 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
806 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
809 case GL_RGBA_INTEGER_EXT
:
811 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
812 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
813 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
814 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
817 case GL_BGR_INTEGER_EXT
:
819 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
820 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
821 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
824 case GL_BGRA_INTEGER_EXT
:
826 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
827 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
828 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
829 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
832 case GL_LUMINANCE_INTEGER_EXT
:
834 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
837 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
840 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
842 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
850 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
851 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
855 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
859 case GL_UNSIGNED_SHORT
:
861 GLushort
*dst
= (GLushort
*) dstAddr
;
865 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
869 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
873 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
877 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
881 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
883 case GL_LUMINANCE_ALPHA
:
885 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
886 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
891 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
892 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
897 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
898 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
899 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
904 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
905 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
906 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
907 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
912 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
913 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
914 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
920 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
921 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
922 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
927 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
928 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
929 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
930 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
933 case GL_RED_INTEGER_EXT
:
935 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
938 case GL_GREEN_INTEGER_EXT
:
940 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
943 case GL_BLUE_INTEGER_EXT
:
945 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
948 case GL_ALPHA_INTEGER_EXT
:
950 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
953 case GL_RGB_INTEGER_EXT
:
955 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
956 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
957 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
960 case GL_RGBA_INTEGER_EXT
:
962 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
963 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
964 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
965 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
968 case GL_BGR_INTEGER_EXT
:
970 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
971 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
972 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
975 case GL_BGRA_INTEGER_EXT
:
977 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
978 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
979 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
980 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
983 case GL_LUMINANCE_INTEGER_EXT
:
985 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
988 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
991 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
993 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
1001 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
1002 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
1006 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1012 GLshort
*dst
= (GLshort
*) dstAddr
;
1013 switch (dstFormat
) {
1016 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1020 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1024 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1028 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1032 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1034 case GL_LUMINANCE_ALPHA
:
1036 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1037 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1042 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1043 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1048 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1049 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1050 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1055 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1056 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1057 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1058 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1063 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1064 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1065 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1070 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1071 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1072 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1073 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1078 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1079 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1080 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1081 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1084 case GL_RED_INTEGER_EXT
:
1086 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1089 case GL_GREEN_INTEGER_EXT
:
1091 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1094 case GL_BLUE_INTEGER_EXT
:
1096 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1099 case GL_ALPHA_INTEGER_EXT
:
1101 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1104 case GL_RGB_INTEGER_EXT
:
1106 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1107 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1108 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1111 case GL_RGBA_INTEGER_EXT
:
1113 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1114 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1115 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1116 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1119 case GL_BGR_INTEGER_EXT
:
1121 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1122 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1123 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1126 case GL_BGRA_INTEGER_EXT
:
1128 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1129 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1130 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1131 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1134 case GL_LUMINANCE_INTEGER_EXT
:
1136 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1139 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1142 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1144 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1152 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1153 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1157 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1161 case GL_UNSIGNED_INT
:
1163 GLuint
*dst
= (GLuint
*) dstAddr
;
1164 switch (dstFormat
) {
1167 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1171 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1175 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1179 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1183 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1185 case GL_LUMINANCE_ALPHA
:
1187 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1188 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1193 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1194 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1199 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1200 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1201 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1206 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1207 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1208 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1209 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1214 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1215 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1216 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1221 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1222 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1223 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1224 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1229 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1230 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1231 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1232 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1235 case GL_RED_INTEGER_EXT
:
1237 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1240 case GL_GREEN_INTEGER_EXT
:
1242 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1245 case GL_BLUE_INTEGER_EXT
:
1247 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1250 case GL_ALPHA_INTEGER_EXT
:
1252 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1255 case GL_RGB_INTEGER_EXT
:
1257 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1258 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1259 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1262 case GL_RGBA_INTEGER_EXT
:
1264 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1265 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1266 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1267 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1270 case GL_BGR_INTEGER_EXT
:
1272 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1273 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1274 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1277 case GL_BGRA_INTEGER_EXT
:
1279 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1280 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1281 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1282 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1285 case GL_LUMINANCE_INTEGER_EXT
:
1287 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1290 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1293 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1295 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1303 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1304 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1308 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1314 GLint
*dst
= (GLint
*) dstAddr
;
1315 switch (dstFormat
) {
1318 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1322 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1326 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1330 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1334 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1336 case GL_LUMINANCE_ALPHA
:
1338 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1339 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1344 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1345 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1350 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1351 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1352 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1357 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1358 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1359 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1360 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1365 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1366 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1367 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1372 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1373 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1374 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1375 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1380 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1381 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1382 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1383 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1389 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1390 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1393 case GL_RED_INTEGER_EXT
:
1395 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1398 case GL_GREEN_INTEGER_EXT
:
1400 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1403 case GL_BLUE_INTEGER_EXT
:
1405 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1408 case GL_ALPHA_INTEGER_EXT
:
1410 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1413 case GL_RGB_INTEGER_EXT
:
1415 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1416 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1417 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1420 case GL_RGBA_INTEGER_EXT
:
1422 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1423 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1424 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1425 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1428 case GL_BGR_INTEGER_EXT
:
1430 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1431 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1432 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1435 case GL_BGRA_INTEGER_EXT
:
1437 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1438 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1439 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1440 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1443 case GL_LUMINANCE_INTEGER_EXT
:
1445 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1448 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1451 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1453 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1459 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1465 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1466 switch (dstFormat
) {
1469 dst
[i
] = rgba
[i
][RCOMP
];
1473 dst
[i
] = rgba
[i
][GCOMP
];
1477 dst
[i
] = rgba
[i
][BCOMP
];
1481 dst
[i
] = rgba
[i
][ACOMP
];
1485 dst
[i
] = luminance
[i
];
1487 case GL_LUMINANCE_ALPHA
:
1489 dst
[i
*2+0] = luminance
[i
];
1490 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1495 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1496 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1501 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1502 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1503 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1508 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1509 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1510 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1511 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1516 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1517 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1518 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1523 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1524 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1525 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1526 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1531 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1532 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1533 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1534 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1540 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1541 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1545 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1549 case GL_HALF_FLOAT_ARB
:
1551 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1552 switch (dstFormat
) {
1555 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1559 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1563 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1567 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1571 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1573 case GL_LUMINANCE_ALPHA
:
1575 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1576 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1581 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1582 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1587 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1588 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1589 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1594 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1595 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1596 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1597 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1602 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1603 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1604 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1609 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1610 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1611 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1612 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1617 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1618 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1619 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1620 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1626 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1627 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1631 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1635 case GL_UNSIGNED_BYTE_3_3_2
:
1636 if (dstFormat
== GL_RGB
) {
1637 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1639 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1640 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1641 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1645 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1646 if (dstFormat
== GL_RGB
) {
1647 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1649 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1650 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1651 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1655 case GL_UNSIGNED_SHORT_5_6_5
:
1656 if (dstFormat
== GL_RGB
) {
1657 GLushort
*dst
= (GLushort
*) dstAddr
;
1659 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1660 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1661 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1665 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1666 if (dstFormat
== GL_RGB
) {
1667 GLushort
*dst
= (GLushort
*) dstAddr
;
1669 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1670 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1671 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1675 case GL_UNSIGNED_SHORT_4_4_4_4
:
1676 if (dstFormat
== GL_RGBA
) {
1677 GLushort
*dst
= (GLushort
*) dstAddr
;
1679 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1680 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1681 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1682 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1685 else if (dstFormat
== GL_BGRA
) {
1686 GLushort
*dst
= (GLushort
*) dstAddr
;
1688 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1689 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1690 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1691 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1694 else if (dstFormat
== GL_ABGR_EXT
) {
1695 GLushort
*dst
= (GLushort
*) dstAddr
;
1697 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1698 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1699 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1700 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1704 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1705 if (dstFormat
== GL_RGBA
) {
1706 GLushort
*dst
= (GLushort
*) dstAddr
;
1708 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1709 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1710 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1711 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1714 else if (dstFormat
== GL_BGRA
) {
1715 GLushort
*dst
= (GLushort
*) dstAddr
;
1717 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1718 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1719 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1720 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1723 else if (dstFormat
== GL_ABGR_EXT
) {
1724 GLushort
*dst
= (GLushort
*) dstAddr
;
1726 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1727 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1728 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1729 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1733 case GL_UNSIGNED_SHORT_5_5_5_1
:
1734 if (dstFormat
== GL_RGBA
) {
1735 GLushort
*dst
= (GLushort
*) dstAddr
;
1737 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1738 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1739 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1740 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1743 else if (dstFormat
== GL_BGRA
) {
1744 GLushort
*dst
= (GLushort
*) dstAddr
;
1746 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1747 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1748 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1749 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1752 else if (dstFormat
== GL_ABGR_EXT
) {
1753 GLushort
*dst
= (GLushort
*) dstAddr
;
1755 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1756 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1757 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1758 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1762 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1763 if (dstFormat
== GL_RGBA
) {
1764 GLushort
*dst
= (GLushort
*) dstAddr
;
1766 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1767 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1768 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1769 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1772 else if (dstFormat
== GL_BGRA
) {
1773 GLushort
*dst
= (GLushort
*) dstAddr
;
1775 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1776 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1777 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1778 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1781 else if (dstFormat
== GL_ABGR_EXT
) {
1782 GLushort
*dst
= (GLushort
*) dstAddr
;
1784 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1785 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1786 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1787 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1791 case GL_UNSIGNED_INT_8_8_8_8
:
1792 if (dstFormat
== GL_RGBA
) {
1793 GLuint
*dst
= (GLuint
*) dstAddr
;
1795 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1796 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1797 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1798 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1801 else if (dstFormat
== GL_BGRA
) {
1802 GLuint
*dst
= (GLuint
*) dstAddr
;
1804 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1805 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1806 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1807 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1810 else if (dstFormat
== GL_ABGR_EXT
) {
1811 GLuint
*dst
= (GLuint
*) dstAddr
;
1813 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1814 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1815 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1816 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1820 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1821 if (dstFormat
== GL_RGBA
) {
1822 GLuint
*dst
= (GLuint
*) dstAddr
;
1824 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1825 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1826 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1827 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1830 else if (dstFormat
== GL_BGRA
) {
1831 GLuint
*dst
= (GLuint
*) dstAddr
;
1833 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1834 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1835 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1836 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1839 else if (dstFormat
== GL_ABGR_EXT
) {
1840 GLuint
*dst
= (GLuint
*) dstAddr
;
1842 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1843 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1844 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1845 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1849 case GL_UNSIGNED_INT_10_10_10_2
:
1850 if (dstFormat
== GL_RGBA
) {
1851 GLuint
*dst
= (GLuint
*) dstAddr
;
1853 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1854 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1855 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1856 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1859 else if (dstFormat
== GL_BGRA
) {
1860 GLuint
*dst
= (GLuint
*) dstAddr
;
1862 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1863 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1864 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1865 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1868 else if (dstFormat
== GL_ABGR_EXT
) {
1869 GLuint
*dst
= (GLuint
*) dstAddr
;
1871 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1872 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1873 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1874 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1878 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1879 if (dstFormat
== GL_RGBA
) {
1880 GLuint
*dst
= (GLuint
*) dstAddr
;
1882 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1883 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1884 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1885 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1888 else if (dstFormat
== GL_BGRA
) {
1889 GLuint
*dst
= (GLuint
*) dstAddr
;
1891 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1892 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1893 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1894 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1897 else if (dstFormat
== GL_ABGR_EXT
) {
1898 GLuint
*dst
= (GLuint
*) dstAddr
;
1900 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1901 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1902 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1903 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1908 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1912 if (dstPacking
->SwapBytes
) {
1913 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1914 if (swapSize
== 2) {
1915 if (dstPacking
->SwapBytes
) {
1916 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1919 else if (swapSize
== 4) {
1920 if (dstPacking
->SwapBytes
) {
1921 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1931 #define SWAP2BYTE(VALUE) \
1933 GLubyte *bytes = (GLubyte *) &(VALUE); \
1934 GLubyte tmp = bytes[0]; \
1935 bytes[0] = bytes[1]; \
1939 #define SWAP4BYTE(VALUE) \
1941 GLubyte *bytes = (GLubyte *) &(VALUE); \
1942 GLubyte tmp = bytes[0]; \
1943 bytes[0] = bytes[3]; \
1946 bytes[1] = bytes[2]; \
1952 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1953 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1954 const struct gl_pixelstore_attrib
*unpack
)
1956 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1958 ASSERT(srcType
== GL_BITMAP
||
1959 srcType
== GL_UNSIGNED_BYTE
||
1960 srcType
== GL_BYTE
||
1961 srcType
== GL_UNSIGNED_SHORT
||
1962 srcType
== GL_SHORT
||
1963 srcType
== GL_UNSIGNED_INT
||
1964 srcType
== GL_INT
||
1965 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1966 srcType
== GL_HALF_FLOAT_ARB
||
1967 srcType
== GL_FLOAT
);
1972 GLubyte
*ubsrc
= (GLubyte
*) src
;
1973 if (unpack
->LsbFirst
) {
1974 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1976 for (i
= 0; i
< n
; i
++) {
1977 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1988 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1990 for (i
= 0; i
< n
; i
++) {
1991 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
2003 case GL_UNSIGNED_BYTE
:
2006 const GLubyte
*s
= (const GLubyte
*) src
;
2007 for (i
= 0; i
< n
; i
++)
2014 const GLbyte
*s
= (const GLbyte
*) src
;
2015 for (i
= 0; i
< n
; i
++)
2019 case GL_UNSIGNED_SHORT
:
2022 const GLushort
*s
= (const GLushort
*) src
;
2023 if (unpack
->SwapBytes
) {
2024 for (i
= 0; i
< n
; i
++) {
2025 GLushort value
= s
[i
];
2031 for (i
= 0; i
< n
; i
++)
2039 const GLshort
*s
= (const GLshort
*) src
;
2040 if (unpack
->SwapBytes
) {
2041 for (i
= 0; i
< n
; i
++) {
2042 GLshort value
= s
[i
];
2048 for (i
= 0; i
< n
; i
++)
2053 case GL_UNSIGNED_INT
:
2056 const GLuint
*s
= (const GLuint
*) src
;
2057 if (unpack
->SwapBytes
) {
2058 for (i
= 0; i
< n
; i
++) {
2059 GLuint value
= s
[i
];
2065 for (i
= 0; i
< n
; i
++)
2073 const GLint
*s
= (const GLint
*) src
;
2074 if (unpack
->SwapBytes
) {
2075 for (i
= 0; i
< n
; i
++) {
2082 for (i
= 0; i
< n
; i
++)
2090 const GLfloat
*s
= (const GLfloat
*) src
;
2091 if (unpack
->SwapBytes
) {
2092 for (i
= 0; i
< n
; i
++) {
2093 GLfloat value
= s
[i
];
2095 indexes
[i
] = (GLuint
) value
;
2099 for (i
= 0; i
< n
; i
++)
2100 indexes
[i
] = (GLuint
) s
[i
];
2104 case GL_HALF_FLOAT_ARB
:
2107 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2108 if (unpack
->SwapBytes
) {
2109 for (i
= 0; i
< n
; i
++) {
2110 GLhalfARB value
= s
[i
];
2112 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2116 for (i
= 0; i
< n
; i
++)
2117 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2121 case GL_UNSIGNED_INT_24_8_EXT
:
2124 const GLuint
*s
= (const GLuint
*) src
;
2125 if (unpack
->SwapBytes
) {
2126 for (i
= 0; i
< n
; i
++) {
2127 GLuint value
= s
[i
];
2129 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2133 for (i
= 0; i
< n
; i
++)
2134 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2140 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2147 * Return source/dest RGBA indexes for unpacking pixels.
2150 get_component_mapping(GLenum format
,
2162 case GL_RED_INTEGER_EXT
:
2164 *gSrc
= *bSrc
= *aSrc
= -1;
2167 case GL_GREEN_INTEGER_EXT
:
2169 *rSrc
= *bSrc
= *aSrc
= -1;
2172 case GL_BLUE_INTEGER_EXT
:
2174 *rSrc
= *gSrc
= *aSrc
= -1;
2177 case GL_ALPHA_INTEGER_EXT
:
2178 *rSrc
= *gSrc
= *bSrc
= -1;
2182 case GL_LUMINANCE_INTEGER_EXT
:
2183 *rSrc
= *gSrc
= *bSrc
= 0;
2186 case GL_LUMINANCE_ALPHA
:
2187 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2188 *rSrc
= *gSrc
= *bSrc
= 0;
2192 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2206 case GL_RGB_INTEGER
:
2227 case GL_RGBA_INTEGER
:
2265 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2266 _mesa_lookup_enum_by_nr(format
));
2274 * This function extracts floating point RGBA values from arbitrary
2275 * image data. srcFormat and srcType are the format and type parameters
2276 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2278 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2279 * implements the "Conversion to floating point", "Conversion to RGB",
2280 * and "Final Expansion to RGBA" operations.
2282 * Args: n - number of pixels
2283 * rgba - output colors
2284 * srcFormat - format of incoming data
2285 * srcType - data type of incoming data
2286 * src - source data pointer
2287 * swapBytes - perform byteswapping of incoming data?
2290 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2291 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2292 GLboolean swapBytes
)
2294 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2296 GLint rDst
, bDst
, gDst
, aDst
;
2297 GLboolean intFormat
;
2298 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2300 ASSERT(srcFormat
== GL_RED
||
2301 srcFormat
== GL_GREEN
||
2302 srcFormat
== GL_BLUE
||
2303 srcFormat
== GL_ALPHA
||
2304 srcFormat
== GL_LUMINANCE
||
2305 srcFormat
== GL_LUMINANCE_ALPHA
||
2306 srcFormat
== GL_INTENSITY
||
2307 srcFormat
== GL_RG
||
2308 srcFormat
== GL_RGB
||
2309 srcFormat
== GL_BGR
||
2310 srcFormat
== GL_RGBA
||
2311 srcFormat
== GL_BGRA
||
2312 srcFormat
== GL_ABGR_EXT
||
2313 srcFormat
== GL_DU8DV8_ATI
||
2314 srcFormat
== GL_DUDV_ATI
||
2315 srcFormat
== GL_RED_INTEGER_EXT
||
2316 srcFormat
== GL_GREEN_INTEGER_EXT
||
2317 srcFormat
== GL_BLUE_INTEGER_EXT
||
2318 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2319 srcFormat
== GL_RGB_INTEGER_EXT
||
2320 srcFormat
== GL_RGBA_INTEGER_EXT
||
2321 srcFormat
== GL_BGR_INTEGER_EXT
||
2322 srcFormat
== GL_BGRA_INTEGER_EXT
||
2323 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2324 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2326 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2327 srcType
== GL_BYTE
||
2328 srcType
== GL_UNSIGNED_SHORT
||
2329 srcType
== GL_SHORT
||
2330 srcType
== GL_UNSIGNED_INT
||
2331 srcType
== GL_INT
||
2332 srcType
== GL_HALF_FLOAT_ARB
||
2333 srcType
== GL_FLOAT
||
2334 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2335 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2336 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2337 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2338 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2339 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2340 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2341 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2342 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2343 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2344 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2345 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2347 get_component_mapping(srcFormat
,
2348 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2349 &rDst
, &gDst
, &bDst
, &aDst
);
2351 stride
= _mesa_components_in_format(srcFormat
);
2353 intFormat
= _mesa_is_integer_format(srcFormat
);
2355 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2356 if ((SRC_INDEX) < 0) { \
2359 for (i = 0; i < n; i++) { \
2360 rgba[i][DST_INDEX] = DEFAULT_INT; \
2364 for (i = 0; i < n; i++) { \
2365 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2369 else if (swapBytes) { \
2370 const TYPE *s = (const TYPE *) src; \
2372 for (i = 0; i < n; i++) { \
2373 TYPE value = s[SRC_INDEX]; \
2374 if (sizeof(TYPE) == 2) { \
2377 else if (sizeof(TYPE) == 4) { \
2381 rgba[i][DST_INDEX] = (GLfloat) value; \
2383 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2388 const TYPE *s = (const TYPE *) src; \
2391 for (i = 0; i < n; i++) { \
2392 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2397 for (i = 0; i < n; i++) { \
2398 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2405 case GL_UNSIGNED_BYTE
:
2406 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2407 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2408 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2409 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2412 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2413 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2414 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2415 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2417 case GL_UNSIGNED_SHORT
:
2418 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2419 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2420 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2421 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2424 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2425 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2426 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2427 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2429 case GL_UNSIGNED_INT
:
2430 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2431 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2432 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2433 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2436 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2437 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2438 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2439 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2442 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2443 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2444 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2445 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2447 case GL_HALF_FLOAT_ARB
:
2448 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2449 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2450 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2451 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2453 case GL_UNSIGNED_BYTE_3_3_2
:
2455 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2462 for (i
= 0; i
< n
; i
++) {
2463 GLubyte p
= ubsrc
[i
];
2464 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2465 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2466 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2467 rgba
[i
][aDst
] = 1.0F
;
2471 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2473 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2480 for (i
= 0; i
< n
; i
++) {
2481 GLubyte p
= ubsrc
[i
];
2482 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2483 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2484 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2485 rgba
[i
][aDst
] = 1.0F
;
2489 case GL_UNSIGNED_SHORT_5_6_5
:
2496 const GLushort
*ussrc
= (const GLushort
*) src
;
2498 for (i
= 0; i
< n
; i
++) {
2499 GLushort p
= ussrc
[i
];
2501 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2502 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2503 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2504 rgba
[i
][aDst
] = 1.0F
;
2508 const GLushort
*ussrc
= (const GLushort
*) src
;
2510 for (i
= 0; i
< n
; i
++) {
2511 GLushort p
= ussrc
[i
];
2512 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2513 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2514 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2515 rgba
[i
][aDst
] = 1.0F
;
2519 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2526 const GLushort
*ussrc
= (const GLushort
*) src
;
2528 for (i
= 0; i
< n
; i
++) {
2529 GLushort p
= ussrc
[i
];
2531 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2532 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2533 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2534 rgba
[i
][aDst
] = 1.0F
;
2538 const GLushort
*ussrc
= (const GLushort
*) src
;
2540 for (i
= 0; i
< n
; i
++) {
2541 GLushort p
= ussrc
[i
];
2542 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2543 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2544 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2545 rgba
[i
][aDst
] = 1.0F
;
2549 case GL_UNSIGNED_SHORT_4_4_4_4
:
2551 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2554 const GLushort
*ussrc
= (const GLushort
*) src
;
2556 for (i
= 0; i
< n
; i
++) {
2557 GLushort p
= ussrc
[i
];
2559 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2560 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2561 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2562 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2566 const GLushort
*ussrc
= (const GLushort
*) src
;
2568 for (i
= 0; i
< n
; i
++) {
2569 GLushort p
= ussrc
[i
];
2570 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2571 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2572 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2573 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2577 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2579 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2582 const GLushort
*ussrc
= (const GLushort
*) src
;
2584 for (i
= 0; i
< n
; i
++) {
2585 GLushort p
= ussrc
[i
];
2587 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2588 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2589 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2590 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2594 const GLushort
*ussrc
= (const GLushort
*) src
;
2596 for (i
= 0; i
< n
; i
++) {
2597 GLushort p
= ussrc
[i
];
2598 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2599 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2600 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2601 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2605 case GL_UNSIGNED_SHORT_5_5_5_1
:
2607 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2610 const GLushort
*ussrc
= (const GLushort
*) src
;
2612 for (i
= 0; i
< n
; i
++) {
2613 GLushort p
= ussrc
[i
];
2615 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2616 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2617 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2618 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2622 const GLushort
*ussrc
= (const GLushort
*) src
;
2624 for (i
= 0; i
< n
; i
++) {
2625 GLushort p
= ussrc
[i
];
2626 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2627 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2628 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2629 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2633 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2635 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2638 const GLushort
*ussrc
= (const GLushort
*) src
;
2640 for (i
= 0; i
< n
; i
++) {
2641 GLushort p
= ussrc
[i
];
2643 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2644 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2645 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2646 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2650 const GLushort
*ussrc
= (const GLushort
*) src
;
2652 for (i
= 0; i
< n
; i
++) {
2653 GLushort p
= ussrc
[i
];
2654 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2655 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2656 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2657 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2661 case GL_UNSIGNED_INT_8_8_8_8
:
2663 const GLuint
*uisrc
= (const GLuint
*) src
;
2666 for (i
= 0; i
< n
; i
++) {
2667 GLuint p
= uisrc
[i
];
2668 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2669 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2670 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2671 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2675 for (i
= 0; i
< n
; i
++) {
2676 GLuint p
= uisrc
[i
];
2677 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2678 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2679 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2680 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2685 const GLuint
*uisrc
= (const GLuint
*) src
;
2688 for (i
= 0; i
< n
; i
++) {
2689 GLuint p
= uisrc
[i
];
2690 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2691 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2692 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2693 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2697 for (i
= 0; i
< n
; i
++) {
2698 GLuint p
= uisrc
[i
];
2699 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2700 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2701 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2702 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2707 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2709 const GLuint
*uisrc
= (const GLuint
*) src
;
2712 for (i
= 0; i
< n
; i
++) {
2713 GLuint p
= uisrc
[i
];
2714 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2715 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2716 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2717 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2721 for (i
= 0; i
< n
; i
++) {
2722 GLuint p
= uisrc
[i
];
2723 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2724 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2725 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2726 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2731 const GLuint
*uisrc
= (const GLuint
*) src
;
2734 for (i
= 0; i
< n
; i
++) {
2735 GLuint p
= uisrc
[i
];
2736 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2737 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2738 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2739 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2743 for (i
= 0; i
< n
; i
++) {
2744 GLuint p
= uisrc
[i
];
2745 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2746 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2747 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2748 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2753 case GL_UNSIGNED_INT_10_10_10_2
:
2755 rs
= 1.0F
/ 1023.0F
;
2756 gs
= 1.0F
/ 1023.0F
;
2757 bs
= 1.0F
/ 1023.0F
;
2761 const GLuint
*uisrc
= (const GLuint
*) src
;
2763 for (i
= 0; i
< n
; i
++) {
2764 GLuint p
= uisrc
[i
];
2766 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2767 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2768 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2769 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2773 const GLuint
*uisrc
= (const GLuint
*) src
;
2775 for (i
= 0; i
< n
; i
++) {
2776 GLuint p
= uisrc
[i
];
2777 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2778 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2779 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2780 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2784 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2786 rs
= 1.0F
/ 1023.0F
;
2787 gs
= 1.0F
/ 1023.0F
;
2788 bs
= 1.0F
/ 1023.0F
;
2792 const GLuint
*uisrc
= (const GLuint
*) src
;
2794 for (i
= 0; i
< n
; i
++) {
2795 GLuint p
= uisrc
[i
];
2797 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2798 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2799 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2800 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2804 const GLuint
*uisrc
= (const GLuint
*) src
;
2806 for (i
= 0; i
< n
; i
++) {
2807 GLuint p
= uisrc
[i
];
2808 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2809 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2810 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2811 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2816 _mesa_problem(NULL
, "bad srcType in extract float data");
2823 static INLINE GLuint
2824 clamp_byte_to_uint(GLbyte b
)
2826 return b
< 0 ? 0 : b
;
2830 static INLINE GLuint
2831 clamp_short_to_uint(GLshort s
)
2833 return s
< 0 ? 0 : s
;
2837 static INLINE GLuint
2838 clamp_int_to_uint(GLint i
)
2840 return i
< 0 ? 0 : i
;
2844 static INLINE GLuint
2845 clamp_float_to_uint(GLfloat f
)
2847 return f
< 0.0F
? 0 : IROUND(f
);
2851 static INLINE GLuint
2852 clamp_half_to_uint(GLhalfARB h
)
2854 GLfloat f
= _mesa_half_to_float(h
);
2855 return f
< 0.0F
? 0 : IROUND(f
);
2860 * \sa extract_float_rgba()
2863 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2864 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2865 GLboolean swapBytes
)
2867 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2869 GLint rDst
, bDst
, gDst
, aDst
;
2870 GLboolean intFormat
;
2872 ASSERT(srcFormat
== GL_RED
||
2873 srcFormat
== GL_GREEN
||
2874 srcFormat
== GL_BLUE
||
2875 srcFormat
== GL_ALPHA
||
2876 srcFormat
== GL_LUMINANCE
||
2877 srcFormat
== GL_LUMINANCE_ALPHA
||
2878 srcFormat
== GL_INTENSITY
||
2879 srcFormat
== GL_RG
||
2880 srcFormat
== GL_RGB
||
2881 srcFormat
== GL_BGR
||
2882 srcFormat
== GL_RGBA
||
2883 srcFormat
== GL_BGRA
||
2884 srcFormat
== GL_ABGR_EXT
||
2885 srcFormat
== GL_DU8DV8_ATI
||
2886 srcFormat
== GL_DUDV_ATI
||
2887 srcFormat
== GL_RED_INTEGER_EXT
||
2888 srcFormat
== GL_GREEN_INTEGER_EXT
||
2889 srcFormat
== GL_BLUE_INTEGER_EXT
||
2890 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2891 srcFormat
== GL_RGB_INTEGER_EXT
||
2892 srcFormat
== GL_RGBA_INTEGER_EXT
||
2893 srcFormat
== GL_BGR_INTEGER_EXT
||
2894 srcFormat
== GL_BGRA_INTEGER_EXT
||
2895 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2896 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2898 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2899 srcType
== GL_BYTE
||
2900 srcType
== GL_UNSIGNED_SHORT
||
2901 srcType
== GL_SHORT
||
2902 srcType
== GL_UNSIGNED_INT
||
2903 srcType
== GL_INT
||
2904 srcType
== GL_HALF_FLOAT_ARB
||
2905 srcType
== GL_FLOAT
||
2906 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2907 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2908 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2909 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2910 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2911 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2912 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2913 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2914 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2915 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2916 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2917 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2919 get_component_mapping(srcFormat
,
2920 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2921 &rDst
, &gDst
, &bDst
, &aDst
);
2923 stride
= _mesa_components_in_format(srcFormat
);
2925 intFormat
= _mesa_is_integer_format(srcFormat
);
2927 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2928 if ((SRC_INDEX) < 0) { \
2930 for (i = 0; i < n; i++) { \
2931 rgba[i][DST_INDEX] = DEFAULT; \
2934 else if (swapBytes) { \
2935 const TYPE *s = (const TYPE *) src; \
2937 for (i = 0; i < n; i++) { \
2938 TYPE value = s[SRC_INDEX]; \
2939 if (sizeof(TYPE) == 2) { \
2942 else if (sizeof(TYPE) == 4) { \
2945 rgba[i][DST_INDEX] = CONVERSION(value); \
2950 const TYPE *s = (const TYPE *) src; \
2952 for (i = 0; i < n; i++) { \
2953 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2959 case GL_UNSIGNED_BYTE
:
2960 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2961 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2962 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2963 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2966 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2967 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2968 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2969 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2971 case GL_UNSIGNED_SHORT
:
2972 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2973 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2974 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2975 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2978 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2979 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2980 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2981 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2983 case GL_UNSIGNED_INT
:
2984 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2985 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2986 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2987 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2990 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2991 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2992 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2993 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2996 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2997 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2998 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2999 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
3001 case GL_HALF_FLOAT_ARB
:
3002 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3003 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3004 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
3005 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
3007 case GL_UNSIGNED_BYTE_3_3_2
:
3009 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3011 for (i
= 0; i
< n
; i
++) {
3012 GLubyte p
= ubsrc
[i
];
3013 rgba
[i
][rDst
] = ((p
>> 5) );
3014 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3015 rgba
[i
][bDst
] = ((p
) & 0x3);
3020 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3022 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3024 for (i
= 0; i
< n
; i
++) {
3025 GLubyte p
= ubsrc
[i
];
3026 rgba
[i
][rDst
] = ((p
) & 0x7);
3027 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3028 rgba
[i
][bDst
] = ((p
>> 6) );
3033 case GL_UNSIGNED_SHORT_5_6_5
:
3035 const GLushort
*ussrc
= (const GLushort
*) src
;
3037 for (i
= 0; i
< n
; i
++) {
3038 GLushort p
= ussrc
[i
];
3040 rgba
[i
][rDst
] = ((p
>> 11) );
3041 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3042 rgba
[i
][bDst
] = ((p
) & 0x1f);
3047 const GLushort
*ussrc
= (const GLushort
*) src
;
3049 for (i
= 0; i
< n
; i
++) {
3050 GLushort p
= ussrc
[i
];
3051 rgba
[i
][rDst
] = ((p
>> 11) );
3052 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3053 rgba
[i
][bDst
] = ((p
) & 0x1f);
3058 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3060 const GLushort
*ussrc
= (const GLushort
*) src
;
3062 for (i
= 0; i
< n
; i
++) {
3063 GLushort p
= ussrc
[i
];
3065 rgba
[i
][rDst
] = ((p
) & 0x1f);
3066 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3067 rgba
[i
][bDst
] = ((p
>> 11) );
3072 const GLushort
*ussrc
= (const GLushort
*) src
;
3074 for (i
= 0; i
< n
; i
++) {
3075 GLushort p
= ussrc
[i
];
3076 rgba
[i
][rDst
] = ((p
) & 0x1f);
3077 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3078 rgba
[i
][bDst
] = ((p
>> 11) );
3083 case GL_UNSIGNED_SHORT_4_4_4_4
:
3085 const GLushort
*ussrc
= (const GLushort
*) src
;
3087 for (i
= 0; i
< n
; i
++) {
3088 GLushort p
= ussrc
[i
];
3090 rgba
[i
][rDst
] = ((p
>> 12) );
3091 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3092 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3093 rgba
[i
][aDst
] = ((p
) & 0xf);
3097 const GLushort
*ussrc
= (const GLushort
*) src
;
3099 for (i
= 0; i
< n
; i
++) {
3100 GLushort p
= ussrc
[i
];
3101 rgba
[i
][rDst
] = ((p
>> 12) );
3102 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3103 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3104 rgba
[i
][aDst
] = ((p
) & 0xf);
3108 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3110 const GLushort
*ussrc
= (const GLushort
*) src
;
3112 for (i
= 0; i
< n
; i
++) {
3113 GLushort p
= ussrc
[i
];
3115 rgba
[i
][rDst
] = ((p
) & 0xf);
3116 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3117 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3118 rgba
[i
][aDst
] = ((p
>> 12) );
3122 const GLushort
*ussrc
= (const GLushort
*) src
;
3124 for (i
= 0; i
< n
; i
++) {
3125 GLushort p
= ussrc
[i
];
3126 rgba
[i
][rDst
] = ((p
) & 0xf);
3127 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3128 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3129 rgba
[i
][aDst
] = ((p
>> 12) );
3133 case GL_UNSIGNED_SHORT_5_5_5_1
:
3135 const GLushort
*ussrc
= (const GLushort
*) src
;
3137 for (i
= 0; i
< n
; i
++) {
3138 GLushort p
= ussrc
[i
];
3140 rgba
[i
][rDst
] = ((p
>> 11) );
3141 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3142 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3143 rgba
[i
][aDst
] = ((p
) & 0x1 );
3147 const GLushort
*ussrc
= (const GLushort
*) src
;
3149 for (i
= 0; i
< n
; i
++) {
3150 GLushort p
= ussrc
[i
];
3151 rgba
[i
][rDst
] = ((p
>> 11) );
3152 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3153 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3154 rgba
[i
][aDst
] = ((p
) & 0x1 );
3158 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3160 const GLushort
*ussrc
= (const GLushort
*) src
;
3162 for (i
= 0; i
< n
; i
++) {
3163 GLushort p
= ussrc
[i
];
3165 rgba
[i
][rDst
] = ((p
) & 0x1f);
3166 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3167 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3168 rgba
[i
][aDst
] = ((p
>> 15) );
3172 const GLushort
*ussrc
= (const GLushort
*) src
;
3174 for (i
= 0; i
< n
; i
++) {
3175 GLushort p
= ussrc
[i
];
3176 rgba
[i
][rDst
] = ((p
) & 0x1f);
3177 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3178 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3179 rgba
[i
][aDst
] = ((p
>> 15) );
3183 case GL_UNSIGNED_INT_8_8_8_8
:
3185 const GLuint
*uisrc
= (const GLuint
*) src
;
3187 for (i
= 0; i
< n
; i
++) {
3188 GLuint p
= uisrc
[i
];
3189 rgba
[i
][rDst
] = ((p
) & 0xff);
3190 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3191 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3192 rgba
[i
][aDst
] = ((p
>> 24) );
3196 const GLuint
*uisrc
= (const GLuint
*) src
;
3198 for (i
= 0; i
< n
; i
++) {
3199 GLuint p
= uisrc
[i
];
3200 rgba
[i
][rDst
] = ((p
>> 24) );
3201 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3202 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3203 rgba
[i
][aDst
] = ((p
) & 0xff);
3207 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3209 const GLuint
*uisrc
= (const GLuint
*) src
;
3211 for (i
= 0; i
< n
; i
++) {
3212 GLuint p
= uisrc
[i
];
3213 rgba
[i
][rDst
] = ((p
>> 24) );
3214 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3215 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3216 rgba
[i
][aDst
] = ((p
) & 0xff);
3220 const GLuint
*uisrc
= (const GLuint
*) src
;
3222 for (i
= 0; i
< n
; i
++) {
3223 GLuint p
= uisrc
[i
];
3224 rgba
[i
][rDst
] = ((p
) & 0xff);
3225 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3226 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3227 rgba
[i
][aDst
] = ((p
>> 24) );
3231 case GL_UNSIGNED_INT_10_10_10_2
:
3233 const GLuint
*uisrc
= (const GLuint
*) src
;
3235 for (i
= 0; i
< n
; i
++) {
3236 GLuint p
= uisrc
[i
];
3238 rgba
[i
][rDst
] = ((p
>> 22) );
3239 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3240 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3241 rgba
[i
][aDst
] = ((p
) & 0x3 );
3245 const GLuint
*uisrc
= (const GLuint
*) src
;
3247 for (i
= 0; i
< n
; i
++) {
3248 GLuint p
= uisrc
[i
];
3249 rgba
[i
][rDst
] = ((p
>> 22) );
3250 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3251 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3252 rgba
[i
][aDst
] = ((p
) & 0x3 );
3256 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3258 const GLuint
*uisrc
= (const GLuint
*) src
;
3260 for (i
= 0; i
< n
; i
++) {
3261 GLuint p
= uisrc
[i
];
3263 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3264 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3265 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3266 rgba
[i
][aDst
] = ((p
>> 30) );
3270 const GLuint
*uisrc
= (const GLuint
*) src
;
3272 for (i
= 0; i
< n
; i
++) {
3273 GLuint p
= uisrc
[i
];
3274 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3275 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3276 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3277 rgba
[i
][aDst
] = ((p
>> 30) );
3282 _mesa_problem(NULL
, "bad srcType in extract uint data");
3291 * Unpack a row of color image data from a client buffer according to
3292 * the pixel unpacking parameters.
3293 * Return GLchan values in the specified dest image format.
3294 * This is used by glDrawPixels and glTexImage?D().
3295 * \param ctx - the context
3296 * n - number of pixels in the span
3297 * dstFormat - format of destination color array
3298 * dest - the destination color array
3299 * srcFormat - source image format
3300 * srcType - source image data type
3301 * source - source image pointer
3302 * srcPacking - pixel unpacking parameters
3303 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3305 * XXX perhaps expand this to process whole images someday.
3308 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3309 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3310 GLenum srcFormat
, GLenum srcType
,
3311 const GLvoid
*source
,
3312 const struct gl_pixelstore_attrib
*srcPacking
,
3313 GLbitfield transferOps
)
3315 ASSERT(dstFormat
== GL_ALPHA
||
3316 dstFormat
== GL_LUMINANCE
||
3317 dstFormat
== GL_LUMINANCE_ALPHA
||
3318 dstFormat
== GL_INTENSITY
||
3319 dstFormat
== GL_RED
||
3320 dstFormat
== GL_RG
||
3321 dstFormat
== GL_RGB
||
3322 dstFormat
== GL_RGBA
||
3323 dstFormat
== GL_COLOR_INDEX
);
3325 ASSERT(srcFormat
== GL_RED
||
3326 srcFormat
== GL_GREEN
||
3327 srcFormat
== GL_BLUE
||
3328 srcFormat
== GL_ALPHA
||
3329 srcFormat
== GL_LUMINANCE
||
3330 srcFormat
== GL_LUMINANCE_ALPHA
||
3331 srcFormat
== GL_INTENSITY
||
3332 srcFormat
== GL_RG
||
3333 srcFormat
== GL_RGB
||
3334 srcFormat
== GL_BGR
||
3335 srcFormat
== GL_RGBA
||
3336 srcFormat
== GL_BGRA
||
3337 srcFormat
== GL_ABGR_EXT
||
3338 srcFormat
== GL_COLOR_INDEX
);
3340 ASSERT(srcType
== GL_BITMAP
||
3341 srcType
== GL_UNSIGNED_BYTE
||
3342 srcType
== GL_BYTE
||
3343 srcType
== GL_UNSIGNED_SHORT
||
3344 srcType
== GL_SHORT
||
3345 srcType
== GL_UNSIGNED_INT
||
3346 srcType
== GL_INT
||
3347 srcType
== GL_HALF_FLOAT_ARB
||
3348 srcType
== GL_FLOAT
||
3349 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3350 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3351 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3352 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3353 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3354 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3355 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3356 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3357 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3358 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3359 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3360 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3362 /* Try simple cases first */
3363 if (transferOps
== 0) {
3364 if (srcType
== CHAN_TYPE
) {
3365 if (dstFormat
== GL_RGBA
) {
3366 if (srcFormat
== GL_RGBA
) {
3367 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3370 else if (srcFormat
== GL_RGB
) {
3372 const GLchan
*src
= (const GLchan
*) source
;
3374 for (i
= 0; i
< n
; i
++) {
3385 else if (dstFormat
== GL_RGB
) {
3386 if (srcFormat
== GL_RGB
) {
3387 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3390 else if (srcFormat
== GL_RGBA
) {
3392 const GLchan
*src
= (const GLchan
*) source
;
3394 for (i
= 0; i
< n
; i
++) {
3404 else if (dstFormat
== srcFormat
) {
3405 GLint comps
= _mesa_components_in_format(srcFormat
);
3407 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3412 * Common situation, loading 8bit RGBA/RGB source images
3413 * into 16/32 bit destination. (OSMesa16/32)
3415 else if (srcType
== GL_UNSIGNED_BYTE
) {
3416 if (dstFormat
== GL_RGBA
) {
3417 if (srcFormat
== GL_RGB
) {
3419 const GLubyte
*src
= (const GLubyte
*) source
;
3421 for (i
= 0; i
< n
; i
++) {
3422 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3423 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3424 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3431 else if (srcFormat
== GL_RGBA
) {
3433 const GLubyte
*src
= (const GLubyte
*) source
;
3435 for (i
= 0; i
< n
; i
++) {
3436 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3437 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3438 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3439 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3446 else if (dstFormat
== GL_RGB
) {
3447 if (srcFormat
== GL_RGB
) {
3449 const GLubyte
*src
= (const GLubyte
*) source
;
3451 for (i
= 0; i
< n
; i
++) {
3452 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3453 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3454 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3460 else if (srcFormat
== GL_RGBA
) {
3462 const GLubyte
*src
= (const GLubyte
*) source
;
3464 for (i
= 0; i
< n
; i
++) {
3465 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3466 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3467 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3478 /* general solution begins here */
3480 GLint dstComponents
;
3481 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3482 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3485 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3489 dstComponents
= _mesa_components_in_format( dstFormat
);
3490 /* source & dest image formats should have been error checked by now */
3491 assert(dstComponents
> 0);
3494 * Extract image data and convert to RGBA floats
3496 if (srcFormat
== GL_COLOR_INDEX
) {
3497 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3500 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3504 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3507 if (dstFormat
== GL_COLOR_INDEX
) {
3509 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3510 /* convert to GLchan and return */
3511 for (i
= 0; i
< n
; i
++) {
3512 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3519 /* Convert indexes to RGBA */
3520 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3521 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3523 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3526 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3527 * with color indexes.
3529 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3534 /* non-color index data */
3535 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3536 srcPacking
->SwapBytes
);
3539 /* Need to clamp if returning GLubytes or GLushorts */
3540 #if CHAN_TYPE != GL_FLOAT
3541 transferOps
|= IMAGE_CLAMP_BIT
;
3545 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3548 get_component_indexes(dstFormat
,
3549 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3551 /* Now return the GLchan data in the requested dstFormat */
3555 for (i
= 0; i
< n
; i
++) {
3556 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3557 dst
+= dstComponents
;
3564 for (i
= 0; i
< n
; i
++) {
3565 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3566 dst
+= dstComponents
;
3573 for (i
= 0; i
< n
; i
++) {
3574 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3575 dst
+= dstComponents
;
3582 for (i
= 0; i
< n
; i
++) {
3583 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3584 dst
+= dstComponents
;
3592 assert(dstComponents
== 1);
3593 for (i
= 0; i
< n
; i
++) {
3594 /* Intensity comes from red channel */
3595 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3603 for (i
= 0; i
< n
; i
++) {
3604 /* Luminance comes from red channel */
3605 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3606 dst
+= dstComponents
;
3616 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3617 * instead of GLchan.
3620 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3621 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3622 GLenum srcFormat
, GLenum srcType
,
3623 const GLvoid
*source
,
3624 const struct gl_pixelstore_attrib
*srcPacking
,
3625 GLbitfield transferOps
)
3627 ASSERT(dstFormat
== GL_ALPHA
||
3628 dstFormat
== GL_LUMINANCE
||
3629 dstFormat
== GL_LUMINANCE_ALPHA
||
3630 dstFormat
== GL_INTENSITY
||
3631 dstFormat
== GL_RED
||
3632 dstFormat
== GL_RG
||
3633 dstFormat
== GL_RGB
||
3634 dstFormat
== GL_RGBA
||
3635 dstFormat
== GL_COLOR_INDEX
);
3637 ASSERT(srcFormat
== GL_RED
||
3638 srcFormat
== GL_GREEN
||
3639 srcFormat
== GL_BLUE
||
3640 srcFormat
== GL_ALPHA
||
3641 srcFormat
== GL_LUMINANCE
||
3642 srcFormat
== GL_LUMINANCE_ALPHA
||
3643 srcFormat
== GL_INTENSITY
||
3644 srcFormat
== GL_RG
||
3645 srcFormat
== GL_RGB
||
3646 srcFormat
== GL_BGR
||
3647 srcFormat
== GL_RGBA
||
3648 srcFormat
== GL_BGRA
||
3649 srcFormat
== GL_ABGR_EXT
||
3650 srcFormat
== GL_RED_INTEGER_EXT
||
3651 srcFormat
== GL_GREEN_INTEGER_EXT
||
3652 srcFormat
== GL_BLUE_INTEGER_EXT
||
3653 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3654 srcFormat
== GL_RGB_INTEGER_EXT
||
3655 srcFormat
== GL_RGBA_INTEGER_EXT
||
3656 srcFormat
== GL_BGR_INTEGER_EXT
||
3657 srcFormat
== GL_BGRA_INTEGER_EXT
||
3658 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3659 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3660 srcFormat
== GL_COLOR_INDEX
);
3662 ASSERT(srcType
== GL_BITMAP
||
3663 srcType
== GL_UNSIGNED_BYTE
||
3664 srcType
== GL_BYTE
||
3665 srcType
== GL_UNSIGNED_SHORT
||
3666 srcType
== GL_SHORT
||
3667 srcType
== GL_UNSIGNED_INT
||
3668 srcType
== GL_INT
||
3669 srcType
== GL_HALF_FLOAT_ARB
||
3670 srcType
== GL_FLOAT
||
3671 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3672 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3673 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3674 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3675 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3676 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3677 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3678 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3679 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3680 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3681 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3682 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3684 /* general solution, no special cases, yet */
3686 GLint dstComponents
;
3687 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3688 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3691 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3695 dstComponents
= _mesa_components_in_format( dstFormat
);
3696 /* source & dest image formats should have been error checked by now */
3697 assert(dstComponents
> 0);
3700 * Extract image data and convert to RGBA floats
3702 if (srcFormat
== GL_COLOR_INDEX
) {
3703 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3706 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3711 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3714 if (dstFormat
== GL_COLOR_INDEX
) {
3716 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3717 /* convert to GLchan and return */
3718 for (i
= 0; i
< n
; i
++) {
3719 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3726 /* Convert indexes to RGBA */
3727 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3728 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3730 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3733 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3734 * with color indexes.
3736 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3741 /* non-color index data */
3742 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3743 srcPacking
->SwapBytes
);
3747 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3750 get_component_indexes(dstFormat
,
3751 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3753 /* Now pack results in the requested dstFormat */
3755 GLfloat
*dst
= dest
;
3757 for (i
= 0; i
< n
; i
++) {
3758 dst
[rDst
] = rgba
[i
][RCOMP
];
3759 dst
+= dstComponents
;
3764 GLfloat
*dst
= dest
;
3766 for (i
= 0; i
< n
; i
++) {
3767 dst
[gDst
] = rgba
[i
][GCOMP
];
3768 dst
+= dstComponents
;
3773 GLfloat
*dst
= dest
;
3775 for (i
= 0; i
< n
; i
++) {
3776 dst
[bDst
] = rgba
[i
][BCOMP
];
3777 dst
+= dstComponents
;
3782 GLfloat
*dst
= dest
;
3784 for (i
= 0; i
< n
; i
++) {
3785 dst
[aDst
] = rgba
[i
][ACOMP
];
3786 dst
+= dstComponents
;
3791 GLfloat
*dst
= dest
;
3794 assert(dstComponents
== 1);
3795 for (i
= 0; i
< n
; i
++) {
3796 /* Intensity comes from red channel */
3797 dst
[i
] = rgba
[i
][RCOMP
];
3802 GLfloat
*dst
= dest
;
3805 for (i
= 0; i
< n
; i
++) {
3806 /* Luminance comes from red channel */
3807 dst
[0] = rgba
[i
][RCOMP
];
3808 dst
+= dstComponents
;
3818 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3819 * instead of GLchan.
3820 * No pixel transfer ops are applied.
3823 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3824 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3825 GLenum srcFormat
, GLenum srcType
,
3826 const GLvoid
*source
,
3827 const struct gl_pixelstore_attrib
*srcPacking
)
3829 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3832 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3836 ASSERT(dstFormat
== GL_ALPHA
||
3837 dstFormat
== GL_LUMINANCE
||
3838 dstFormat
== GL_LUMINANCE_ALPHA
||
3839 dstFormat
== GL_INTENSITY
||
3840 dstFormat
== GL_RED
||
3841 dstFormat
== GL_RG
||
3842 dstFormat
== GL_RGB
||
3843 dstFormat
== GL_RGBA
);
3845 ASSERT(srcFormat
== GL_RED
||
3846 srcFormat
== GL_GREEN
||
3847 srcFormat
== GL_BLUE
||
3848 srcFormat
== GL_ALPHA
||
3849 srcFormat
== GL_LUMINANCE
||
3850 srcFormat
== GL_LUMINANCE_ALPHA
||
3851 srcFormat
== GL_INTENSITY
||
3852 srcFormat
== GL_RG
||
3853 srcFormat
== GL_RGB
||
3854 srcFormat
== GL_BGR
||
3855 srcFormat
== GL_RGBA
||
3856 srcFormat
== GL_BGRA
||
3857 srcFormat
== GL_ABGR_EXT
||
3858 srcFormat
== GL_RED_INTEGER_EXT
||
3859 srcFormat
== GL_GREEN_INTEGER_EXT
||
3860 srcFormat
== GL_BLUE_INTEGER_EXT
||
3861 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3862 srcFormat
== GL_RGB_INTEGER_EXT
||
3863 srcFormat
== GL_RGBA_INTEGER_EXT
||
3864 srcFormat
== GL_BGR_INTEGER_EXT
||
3865 srcFormat
== GL_BGRA_INTEGER_EXT
||
3866 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3867 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3869 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3870 srcType
== GL_BYTE
||
3871 srcType
== GL_UNSIGNED_SHORT
||
3872 srcType
== GL_SHORT
||
3873 srcType
== GL_UNSIGNED_INT
||
3874 srcType
== GL_INT
||
3875 srcType
== GL_HALF_FLOAT_ARB
||
3876 srcType
== GL_FLOAT
||
3877 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3878 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3879 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3880 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3881 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3882 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3883 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3884 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3885 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3886 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3887 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3888 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3891 /* Extract image data as uint[4] pixels */
3892 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3893 srcPacking
->SwapBytes
);
3895 if (dstFormat
== GL_RGBA
) {
3897 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3901 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3902 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3904 assert(dstComponents
> 0);
3906 get_component_indexes(dstFormat
,
3907 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3909 /* Now pack values in the requested dest format */
3913 for (i
= 0; i
< n
; i
++) {
3914 dst
[rDst
] = rgba
[i
][RCOMP
];
3915 dst
+= dstComponents
;
3922 for (i
= 0; i
< n
; i
++) {
3923 dst
[gDst
] = rgba
[i
][GCOMP
];
3924 dst
+= dstComponents
;
3931 for (i
= 0; i
< n
; i
++) {
3932 dst
[bDst
] = rgba
[i
][BCOMP
];
3933 dst
+= dstComponents
;
3940 for (i
= 0; i
< n
; i
++) {
3941 dst
[aDst
] = rgba
[i
][ACOMP
];
3942 dst
+= dstComponents
;
3950 assert(dstComponents
== 1);
3951 for (i
= 0; i
< n
; i
++) {
3952 /* Intensity comes from red channel */
3953 dst
[i
] = rgba
[i
][RCOMP
];
3961 for (i
= 0; i
< n
; i
++) {
3962 /* Luminance comes from red channel */
3963 dst
[0] = rgba
[i
][RCOMP
];
3964 dst
+= dstComponents
;
3975 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3976 * directly return GLbyte data, no transfer ops apply.
3979 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3980 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3981 GLenum srcFormat
, GLenum srcType
,
3982 const GLvoid
*source
,
3983 const struct gl_pixelstore_attrib
*srcPacking
,
3984 GLbitfield transferOps
)
3986 ASSERT(dstFormat
== GL_DUDV_ATI
);
3987 ASSERT(srcFormat
== GL_DUDV_ATI
);
3989 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3990 srcType
== GL_BYTE
||
3991 srcType
== GL_UNSIGNED_SHORT
||
3992 srcType
== GL_SHORT
||
3993 srcType
== GL_UNSIGNED_INT
||
3994 srcType
== GL_INT
||
3995 srcType
== GL_HALF_FLOAT_ARB
||
3996 srcType
== GL_FLOAT
);
3998 /* general solution */
4000 GLint dstComponents
;
4003 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
4006 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4010 dstComponents
= _mesa_components_in_format( dstFormat
);
4011 /* source & dest image formats should have been error checked by now */
4012 assert(dstComponents
> 0);
4015 * Extract image data and convert to RGBA floats
4017 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4018 srcPacking
->SwapBytes
);
4021 /* Now determine which color channels we need to produce.
4022 * And determine the dest index (offset) within each color tuple.
4025 /* Now pack results in the requested dstFormat */
4026 for (i
= 0; i
< n
; i
++) {
4027 /* not sure - need clamp[-1,1] here? */
4028 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4029 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4030 dst
+= dstComponents
;
4038 * Unpack a row of color index data from a client buffer according to
4039 * the pixel unpacking parameters.
4040 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4042 * Args: ctx - the context
4043 * n - number of pixels
4044 * dstType - destination data type
4045 * dest - destination array
4046 * srcType - source pixel type
4047 * source - source data pointer
4048 * srcPacking - pixel unpacking parameters
4049 * transferOps - the pixel transfer operations to apply
4052 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4053 GLenum dstType
, GLvoid
*dest
,
4054 GLenum srcType
, const GLvoid
*source
,
4055 const struct gl_pixelstore_attrib
*srcPacking
,
4056 GLbitfield transferOps
)
4058 ASSERT(srcType
== GL_BITMAP
||
4059 srcType
== GL_UNSIGNED_BYTE
||
4060 srcType
== GL_BYTE
||
4061 srcType
== GL_UNSIGNED_SHORT
||
4062 srcType
== GL_SHORT
||
4063 srcType
== GL_UNSIGNED_INT
||
4064 srcType
== GL_INT
||
4065 srcType
== GL_HALF_FLOAT_ARB
||
4066 srcType
== GL_FLOAT
);
4068 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4069 dstType
== GL_UNSIGNED_SHORT
||
4070 dstType
== GL_UNSIGNED_INT
);
4073 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4076 * Try simple cases first
4078 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4079 && dstType
== GL_UNSIGNED_BYTE
) {
4080 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4082 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4083 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4084 memcpy(dest
, source
, n
* sizeof(GLuint
));
4090 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4093 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4097 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4101 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4103 /* convert to dest type */
4105 case GL_UNSIGNED_BYTE
:
4107 GLubyte
*dst
= (GLubyte
*) dest
;
4109 for (i
= 0; i
< n
; i
++) {
4110 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4114 case GL_UNSIGNED_SHORT
:
4116 GLuint
*dst
= (GLuint
*) dest
;
4118 for (i
= 0; i
< n
; i
++) {
4119 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4123 case GL_UNSIGNED_INT
:
4124 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4127 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4136 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4137 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4138 const struct gl_pixelstore_attrib
*dstPacking
,
4139 GLbitfield transferOps
)
4141 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4144 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4148 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4150 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4151 /* make a copy of input */
4152 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4153 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4158 case GL_UNSIGNED_BYTE
:
4160 GLubyte
*dst
= (GLubyte
*) dest
;
4162 for (i
= 0; i
< n
; i
++) {
4163 *dst
++ = (GLubyte
) source
[i
];
4169 GLbyte
*dst
= (GLbyte
*) dest
;
4171 for (i
= 0; i
< n
; i
++) {
4172 dst
[i
] = (GLbyte
) source
[i
];
4176 case GL_UNSIGNED_SHORT
:
4178 GLushort
*dst
= (GLushort
*) dest
;
4180 for (i
= 0; i
< n
; i
++) {
4181 dst
[i
] = (GLushort
) source
[i
];
4183 if (dstPacking
->SwapBytes
) {
4184 _mesa_swap2( (GLushort
*) dst
, n
);
4190 GLshort
*dst
= (GLshort
*) dest
;
4192 for (i
= 0; i
< n
; i
++) {
4193 dst
[i
] = (GLshort
) source
[i
];
4195 if (dstPacking
->SwapBytes
) {
4196 _mesa_swap2( (GLushort
*) dst
, n
);
4200 case GL_UNSIGNED_INT
:
4202 GLuint
*dst
= (GLuint
*) dest
;
4204 for (i
= 0; i
< n
; i
++) {
4205 dst
[i
] = (GLuint
) source
[i
];
4207 if (dstPacking
->SwapBytes
) {
4208 _mesa_swap4( (GLuint
*) dst
, n
);
4214 GLint
*dst
= (GLint
*) dest
;
4216 for (i
= 0; i
< n
; i
++) {
4217 dst
[i
] = (GLint
) source
[i
];
4219 if (dstPacking
->SwapBytes
) {
4220 _mesa_swap4( (GLuint
*) dst
, n
);
4226 GLfloat
*dst
= (GLfloat
*) dest
;
4228 for (i
= 0; i
< n
; i
++) {
4229 dst
[i
] = (GLfloat
) source
[i
];
4231 if (dstPacking
->SwapBytes
) {
4232 _mesa_swap4( (GLuint
*) dst
, n
);
4236 case GL_HALF_FLOAT_ARB
:
4238 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4240 for (i
= 0; i
< n
; i
++) {
4241 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4243 if (dstPacking
->SwapBytes
) {
4244 _mesa_swap2( (GLushort
*) dst
, n
);
4249 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4257 * Unpack a row of stencil data from a client buffer according to
4258 * the pixel unpacking parameters.
4259 * This is (or will be) used by glDrawPixels
4261 * Args: ctx - the context
4262 * n - number of pixels
4263 * dstType - destination data type
4264 * dest - destination array
4265 * srcType - source pixel type
4266 * source - source data pointer
4267 * srcPacking - pixel unpacking parameters
4268 * transferOps - apply offset/bias/lookup ops?
4271 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4272 GLenum dstType
, GLvoid
*dest
,
4273 GLenum srcType
, const GLvoid
*source
,
4274 const struct gl_pixelstore_attrib
*srcPacking
,
4275 GLbitfield transferOps
)
4277 ASSERT(srcType
== GL_BITMAP
||
4278 srcType
== GL_UNSIGNED_BYTE
||
4279 srcType
== GL_BYTE
||
4280 srcType
== GL_UNSIGNED_SHORT
||
4281 srcType
== GL_SHORT
||
4282 srcType
== GL_UNSIGNED_INT
||
4283 srcType
== GL_INT
||
4284 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4285 srcType
== GL_HALF_FLOAT_ARB
||
4286 srcType
== GL_FLOAT
);
4288 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4289 dstType
== GL_UNSIGNED_SHORT
||
4290 dstType
== GL_UNSIGNED_INT
);
4292 /* only shift and offset apply to stencil */
4293 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4296 * Try simple cases first
4298 if (transferOps
== 0 &&
4299 !ctx
->Pixel
.MapStencilFlag
&&
4300 srcType
== GL_UNSIGNED_BYTE
&&
4301 dstType
== GL_UNSIGNED_BYTE
) {
4302 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4304 else if (transferOps
== 0 &&
4305 !ctx
->Pixel
.MapStencilFlag
&&
4306 srcType
== GL_UNSIGNED_INT
&&
4307 dstType
== GL_UNSIGNED_INT
&&
4308 !srcPacking
->SwapBytes
) {
4309 memcpy(dest
, source
, n
* sizeof(GLuint
));
4315 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4318 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4322 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4325 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4326 /* shift and offset indexes */
4327 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4330 if (ctx
->Pixel
.MapStencilFlag
) {
4331 /* Apply stencil lookup table */
4332 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4334 for (i
= 0; i
< n
; i
++) {
4335 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4339 /* convert to dest type */
4341 case GL_UNSIGNED_BYTE
:
4343 GLubyte
*dst
= (GLubyte
*) dest
;
4345 for (i
= 0; i
< n
; i
++) {
4346 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4350 case GL_UNSIGNED_SHORT
:
4352 GLuint
*dst
= (GLuint
*) dest
;
4354 for (i
= 0; i
< n
; i
++) {
4355 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4359 case GL_UNSIGNED_INT
:
4360 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4363 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4372 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4373 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4374 const struct gl_pixelstore_attrib
*dstPacking
)
4376 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4379 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4383 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4384 ctx
->Pixel
.MapStencilFlag
) {
4385 /* make a copy of input */
4386 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4387 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4392 case GL_UNSIGNED_BYTE
:
4393 if (sizeof(GLstencil
) == 1) {
4394 memcpy( dest
, source
, n
);
4397 GLubyte
*dst
= (GLubyte
*) dest
;
4400 dst
[i
] = (GLubyte
) source
[i
];
4406 GLbyte
*dst
= (GLbyte
*) dest
;
4409 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4413 case GL_UNSIGNED_SHORT
:
4415 GLushort
*dst
= (GLushort
*) dest
;
4418 dst
[i
] = (GLushort
) source
[i
];
4420 if (dstPacking
->SwapBytes
) {
4421 _mesa_swap2( (GLushort
*) dst
, n
);
4427 GLshort
*dst
= (GLshort
*) dest
;
4430 dst
[i
] = (GLshort
) source
[i
];
4432 if (dstPacking
->SwapBytes
) {
4433 _mesa_swap2( (GLushort
*) dst
, n
);
4437 case GL_UNSIGNED_INT
:
4439 GLuint
*dst
= (GLuint
*) dest
;
4442 dst
[i
] = (GLuint
) source
[i
];
4444 if (dstPacking
->SwapBytes
) {
4445 _mesa_swap4( (GLuint
*) dst
, n
);
4451 GLint
*dst
= (GLint
*) dest
;
4454 dst
[i
] = (GLint
) source
[i
];
4456 if (dstPacking
->SwapBytes
) {
4457 _mesa_swap4( (GLuint
*) dst
, n
);
4463 GLfloat
*dst
= (GLfloat
*) dest
;
4466 dst
[i
] = (GLfloat
) source
[i
];
4468 if (dstPacking
->SwapBytes
) {
4469 _mesa_swap4( (GLuint
*) dst
, n
);
4473 case GL_HALF_FLOAT_ARB
:
4475 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4478 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4480 if (dstPacking
->SwapBytes
) {
4481 _mesa_swap2( (GLushort
*) dst
, n
);
4486 if (dstPacking
->LsbFirst
) {
4487 GLubyte
*dst
= (GLubyte
*) dest
;
4490 for (i
= 0; i
< n
; i
++) {
4493 *dst
|= ((source
[i
] != 0) << shift
);
4502 GLubyte
*dst
= (GLubyte
*) dest
;
4505 for (i
= 0; i
< n
; i
++) {
4508 *dst
|= ((source
[i
] != 0) << shift
);
4518 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4524 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4527 const GLTYPE *src = (const GLTYPE *)source; \
4528 for (i = 0; i < n; i++) { \
4529 GLTYPE value = src[i]; \
4530 if (srcPacking->SwapBytes) { \
4531 if (sizeof(GLTYPE) == 2) { \
4533 } else if (sizeof(GLTYPE) == 4) { \
4537 depthValues[i] = GLTYPE2FLOAT(value); \
4543 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4544 * or GLfloat values.
4545 * The glPixelTransfer (scale/bias) params will be applied.
4547 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4548 * \param depthMax max value for returned GLushort or GLuint values
4549 * (ignored for GLfloat).
4552 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4553 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4554 GLenum srcType
, const GLvoid
*source
,
4555 const struct gl_pixelstore_attrib
*srcPacking
)
4557 GLfloat
*depthTemp
, *depthValues
;
4558 GLboolean needClamp
= GL_FALSE
;
4560 /* Look for special cases first.
4561 * Not only are these faster, they're less prone to numeric conversion
4562 * problems. Otherwise, converting from an int type to a float then
4563 * back to an int type can introduce errors that will show up as
4564 * artifacts in things like depth peeling which uses glCopyTexImage.
4566 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4567 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4568 const GLuint
*src
= (const GLuint
*) source
;
4569 GLushort
*dst
= (GLushort
*) dest
;
4571 for (i
= 0; i
< n
; i
++) {
4572 dst
[i
] = src
[i
] >> 16;
4576 if (srcType
== GL_UNSIGNED_SHORT
4577 && dstType
== GL_UNSIGNED_INT
4578 && depthMax
== 0xffffffff) {
4579 const GLushort
*src
= (const GLushort
*) source
;
4580 GLuint
*dst
= (GLuint
*) dest
;
4582 for (i
= 0; i
< n
; i
++) {
4583 dst
[i
] = src
[i
] | (src
[i
] << 16);
4587 if (srcType
== GL_UNSIGNED_INT_24_8
4588 && dstType
== GL_UNSIGNED_INT
4589 && depthMax
== 0xffffff) {
4590 const GLuint
*src
= (const GLuint
*) source
;
4591 GLuint
*dst
= (GLuint
*) dest
;
4593 for (i
= 0; i
< n
; i
++) {
4594 dst
[i
] = src
[i
] >> 8;
4598 /* XXX may want to add additional cases here someday */
4601 /* general case path follows */
4603 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4605 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4609 if (dstType
== GL_FLOAT
) {
4610 depthValues
= (GLfloat
*) dest
;
4613 depthValues
= depthTemp
;
4616 /* Convert incoming values to GLfloat. Some conversions will require
4621 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4622 needClamp
= GL_TRUE
;
4624 case GL_UNSIGNED_BYTE
:
4625 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4628 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4629 needClamp
= GL_TRUE
;
4631 case GL_UNSIGNED_SHORT
:
4632 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4635 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4636 needClamp
= GL_TRUE
;
4638 case GL_UNSIGNED_INT
:
4639 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4641 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4642 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4643 depthMax
== 0xffffff &&
4644 ctx
->Pixel
.DepthScale
== 1.0 &&
4645 ctx
->Pixel
.DepthBias
== 0.0) {
4646 const GLuint
*src
= (const GLuint
*) source
;
4647 GLuint
*zValues
= (GLuint
*) dest
;
4649 for (i
= 0; i
< n
; i
++) {
4650 GLuint value
= src
[i
];
4651 if (srcPacking
->SwapBytes
) {
4654 zValues
[i
] = value
& 0xffffff00;
4659 const GLuint
*src
= (const GLuint
*) source
;
4660 const GLfloat scale
= 1.0f
/ 0xffffff;
4662 for (i
= 0; i
< n
; i
++) {
4663 GLuint value
= src
[i
];
4664 if (srcPacking
->SwapBytes
) {
4667 depthValues
[i
] = (value
>> 8) * scale
;
4672 DEPTH_VALUES(GLfloat
, 1*);
4673 needClamp
= GL_TRUE
;
4675 case GL_HALF_FLOAT_ARB
:
4678 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4679 for (i
= 0; i
< n
; i
++) {
4680 GLhalfARB value
= src
[i
];
4681 if (srcPacking
->SwapBytes
) {
4684 depthValues
[i
] = _mesa_half_to_float(value
);
4686 needClamp
= GL_TRUE
;
4690 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4695 /* apply depth scale and bias */
4697 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4698 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4699 if (scale
!= 1.0 || bias
!= 0.0) {
4701 for (i
= 0; i
< n
; i
++) {
4702 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4704 needClamp
= GL_TRUE
;
4708 /* clamp to [0, 1] */
4711 for (i
= 0; i
< n
; i
++) {
4712 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4717 * Convert values to dstType
4719 if (dstType
== GL_UNSIGNED_INT
) {
4720 GLuint
*zValues
= (GLuint
*) dest
;
4722 if (depthMax
<= 0xffffff) {
4723 /* no overflow worries */
4724 for (i
= 0; i
< n
; i
++) {
4725 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4729 /* need to use double precision to prevent overflow problems */
4730 for (i
= 0; i
< n
; i
++) {
4731 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4732 if (z
>= (GLdouble
) 0xffffffff)
4733 zValues
[i
] = 0xffffffff;
4735 zValues
[i
] = (GLuint
) z
;
4739 else if (dstType
== GL_UNSIGNED_SHORT
) {
4740 GLushort
*zValues
= (GLushort
*) dest
;
4742 ASSERT(depthMax
<= 0xffff);
4743 for (i
= 0; i
< n
; i
++) {
4744 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4748 ASSERT(dstType
== GL_FLOAT
);
4749 /*ASSERT(depthMax == 1.0F);*/
4757 * Pack an array of depth values. The values are floats in [0,1].
4760 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4761 GLenum dstType
, const GLfloat
*depthSpan
,
4762 const struct gl_pixelstore_attrib
*dstPacking
)
4764 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4766 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4770 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4771 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4772 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4773 depthSpan
= depthCopy
;
4777 case GL_UNSIGNED_BYTE
:
4779 GLubyte
*dst
= (GLubyte
*) dest
;
4781 for (i
= 0; i
< n
; i
++) {
4782 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4788 GLbyte
*dst
= (GLbyte
*) dest
;
4790 for (i
= 0; i
< n
; i
++) {
4791 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4795 case GL_UNSIGNED_SHORT
:
4797 GLushort
*dst
= (GLushort
*) dest
;
4799 for (i
= 0; i
< n
; i
++) {
4800 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4802 if (dstPacking
->SwapBytes
) {
4803 _mesa_swap2( (GLushort
*) dst
, n
);
4809 GLshort
*dst
= (GLshort
*) dest
;
4811 for (i
= 0; i
< n
; i
++) {
4812 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4814 if (dstPacking
->SwapBytes
) {
4815 _mesa_swap2( (GLushort
*) dst
, n
);
4819 case GL_UNSIGNED_INT
:
4821 GLuint
*dst
= (GLuint
*) dest
;
4823 for (i
= 0; i
< n
; i
++) {
4824 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4826 if (dstPacking
->SwapBytes
) {
4827 _mesa_swap4( (GLuint
*) dst
, n
);
4833 GLint
*dst
= (GLint
*) dest
;
4835 for (i
= 0; i
< n
; i
++) {
4836 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4838 if (dstPacking
->SwapBytes
) {
4839 _mesa_swap4( (GLuint
*) dst
, n
);
4845 GLfloat
*dst
= (GLfloat
*) dest
;
4847 for (i
= 0; i
< n
; i
++) {
4848 dst
[i
] = depthSpan
[i
];
4850 if (dstPacking
->SwapBytes
) {
4851 _mesa_swap4( (GLuint
*) dst
, n
);
4855 case GL_HALF_FLOAT_ARB
:
4857 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4859 for (i
= 0; i
< n
; i
++) {
4860 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4862 if (dstPacking
->SwapBytes
) {
4863 _mesa_swap2( (GLushort
*) dst
, n
);
4868 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4877 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4880 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4881 const GLfloat
*depthVals
,
4882 const GLstencil
*stencilVals
,
4883 const struct gl_pixelstore_attrib
*dstPacking
)
4885 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4886 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4889 if (!depthCopy
|| !stencilCopy
) {
4890 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4896 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4897 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4898 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4899 depthVals
= depthCopy
;
4902 if (ctx
->Pixel
.IndexShift
||
4903 ctx
->Pixel
.IndexOffset
||
4904 ctx
->Pixel
.MapStencilFlag
) {
4905 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4906 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4907 stencilVals
= stencilCopy
;
4910 for (i
= 0; i
< n
; i
++) {
4911 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4912 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4915 if (dstPacking
->SwapBytes
) {
4916 _mesa_swap4(dest
, n
);
4927 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4928 * Return all image data in a contiguous block. This is used when we
4929 * compile glDrawPixels, glTexImage, etc into a display list. We
4930 * need a copy of the data in a standard format.
4933 _mesa_unpack_image( GLuint dimensions
,
4934 GLsizei width
, GLsizei height
, GLsizei depth
,
4935 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4936 const struct gl_pixelstore_attrib
*unpack
)
4938 GLint bytesPerRow
, compsPerRow
;
4939 GLboolean flipBytes
, swap2
, swap4
;
4942 return NULL
; /* not necessarily an error */
4944 if (width
<= 0 || height
<= 0 || depth
<= 0)
4945 return NULL
; /* generate error later */
4947 if (type
== GL_BITMAP
) {
4948 bytesPerRow
= (width
+ 7) >> 3;
4949 flipBytes
= unpack
->LsbFirst
;
4950 swap2
= swap4
= GL_FALSE
;
4954 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4955 GLint components
= _mesa_components_in_format(format
);
4958 if (_mesa_type_is_packed(type
))
4961 if (bytesPerPixel
<= 0 || components
<= 0)
4962 return NULL
; /* bad format or type. generate error later */
4963 bytesPerRow
= bytesPerPixel
* width
;
4964 bytesPerComp
= bytesPerPixel
/ components
;
4965 flipBytes
= GL_FALSE
;
4966 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4967 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4968 compsPerRow
= components
* width
;
4969 assert(compsPerRow
>= width
);
4974 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4978 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4981 for (img
= 0; img
< depth
; img
++) {
4982 for (row
= 0; row
< height
; row
++) {
4983 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4984 width
, height
, format
, type
, img
, row
, 0);
4986 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4988 flipBytes
= GL_FALSE
;
4989 if (unpack
->LsbFirst
) {
4990 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4991 GLubyte dstMask
= 128;
4992 const GLubyte
*s
= src
;
4995 for (i
= 0; i
< width
; i
++) {
4999 if (srcMask
== 128) {
5004 srcMask
= srcMask
<< 1;
5012 dstMask
= dstMask
>> 1;
5017 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5018 GLubyte dstMask
= 128;
5019 const GLubyte
*s
= src
;
5022 for (i
= 0; i
< width
; i
++) {
5031 srcMask
= srcMask
>> 1;
5039 dstMask
= dstMask
>> 1;
5045 memcpy(dst
, src
, bytesPerRow
);
5048 /* byte flipping/swapping */
5050 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5053 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5056 _mesa_swap4((GLuint
*) dst
, compsPerRow
);