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 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
512 * Component clamping (besides clamping to [0,1] in
513 * _mesa_apply_rgba_transfer_ops()).
516 /* clamping to dest type's min/max values */
518 if (get_type_min_max(dstType
, &min
, &max
)) {
519 for (i
= 0; i
< n
; i
++) {
520 rgba
[i
][RCOMP
] = CLAMP(rgba
[i
][RCOMP
], min
, max
);
521 rgba
[i
][GCOMP
] = CLAMP(rgba
[i
][GCOMP
], min
, max
);
522 rgba
[i
][BCOMP
] = CLAMP(rgba
[i
][BCOMP
], min
, max
);
523 rgba
[i
][ACOMP
] = CLAMP(rgba
[i
][ACOMP
], min
, max
);
527 else if (dstFormat
== GL_LUMINANCE
|| dstFormat
== GL_LUMINANCE_ALPHA
) {
528 /* compute luminance values */
529 if (transferOps
& IMAGE_CLAMP_BIT
) {
530 for (i
= 0; i
< n
; i
++) {
531 GLfloat sum
= rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
532 luminance
[i
] = CLAMP(sum
, 0.0F
, 1.0F
);
536 for (i
= 0; i
< n
; i
++) {
537 luminance
[i
] = rgba
[i
][RCOMP
] + rgba
[i
][GCOMP
] + rgba
[i
][BCOMP
];
543 * Pack/store the pixels. Ugh! Lots of cases!!!
546 case GL_UNSIGNED_BYTE
:
548 GLubyte
*dst
= (GLubyte
*) dstAddr
;
552 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
556 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
560 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
564 dst
[i
] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
568 dst
[i
] = FLOAT_TO_UBYTE(luminance
[i
]);
570 case GL_LUMINANCE_ALPHA
:
572 dst
[i
*2+0] = FLOAT_TO_UBYTE(luminance
[i
]);
573 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
578 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
579 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
584 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
585 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
586 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
591 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
592 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
593 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
594 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
599 dst
[i
*3+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
600 dst
[i
*3+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
601 dst
[i
*3+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
606 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
607 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
608 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
609 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
614 dst
[i
*4+0] = FLOAT_TO_UBYTE(rgba
[i
][ACOMP
]);
615 dst
[i
*4+1] = FLOAT_TO_UBYTE(rgba
[i
][BCOMP
]);
616 dst
[i
*4+2] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
617 dst
[i
*4+3] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
620 case GL_RED_INTEGER_EXT
:
622 dst
[i
] = (GLubyte
) rgba
[i
][RCOMP
];
625 case GL_GREEN_INTEGER_EXT
:
627 dst
[i
] = (GLubyte
) rgba
[i
][GCOMP
];
630 case GL_BLUE_INTEGER_EXT
:
632 dst
[i
] = (GLubyte
) rgba
[i
][BCOMP
];
635 case GL_ALPHA_INTEGER_EXT
:
637 dst
[i
] = (GLubyte
) rgba
[i
][ACOMP
];
640 case GL_RGB_INTEGER_EXT
:
642 dst
[i
*3+0] = (GLubyte
) rgba
[i
][RCOMP
];
643 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
644 dst
[i
*3+2] = (GLubyte
) rgba
[i
][BCOMP
];
647 case GL_RGBA_INTEGER_EXT
:
649 dst
[i
*4+0] = (GLubyte
) rgba
[i
][RCOMP
];
650 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
651 dst
[i
*4+2] = (GLubyte
) rgba
[i
][BCOMP
];
652 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
655 case GL_BGR_INTEGER_EXT
:
657 dst
[i
*3+0] = (GLubyte
) rgba
[i
][BCOMP
];
658 dst
[i
*3+1] = (GLubyte
) rgba
[i
][GCOMP
];
659 dst
[i
*3+2] = (GLubyte
) rgba
[i
][RCOMP
];
662 case GL_BGRA_INTEGER_EXT
:
664 dst
[i
*4+0] = (GLubyte
) rgba
[i
][BCOMP
];
665 dst
[i
*4+1] = (GLubyte
) rgba
[i
][GCOMP
];
666 dst
[i
*4+2] = (GLubyte
) rgba
[i
][RCOMP
];
667 dst
[i
*4+3] = (GLubyte
) rgba
[i
][ACOMP
];
670 case GL_LUMINANCE_INTEGER_EXT
:
672 dst
[i
*2+0] = (GLubyte
) (rgba
[i
][RCOMP
] +
675 dst
[i
*2+1] = (GLubyte
) rgba
[i
][ACOMP
];
678 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
680 dst
[i
] = (GLubyte
) (rgba
[i
][RCOMP
] +
688 dst
[i
*2+0] = FLOAT_TO_UBYTE(rgba
[i
][RCOMP
]);
689 dst
[i
*2+1] = FLOAT_TO_UBYTE(rgba
[i
][GCOMP
]);
693 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
699 GLbyte
*dst
= (GLbyte
*) dstAddr
;
703 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
707 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
711 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
715 dst
[i
] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
719 dst
[i
] = FLOAT_TO_BYTE(luminance
[i
]);
721 case GL_LUMINANCE_ALPHA
:
723 dst
[i
*2+0] = FLOAT_TO_BYTE(luminance
[i
]);
724 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
729 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
730 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
735 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
736 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
737 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
742 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
743 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
744 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
745 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
750 dst
[i
*3+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
751 dst
[i
*3+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
752 dst
[i
*3+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
757 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
758 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
759 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
760 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
765 dst
[i
*4+0] = FLOAT_TO_BYTE(rgba
[i
][ACOMP
]);
766 dst
[i
*4+1] = FLOAT_TO_BYTE(rgba
[i
][BCOMP
]);
767 dst
[i
*4+2] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
768 dst
[i
*4+3] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
771 case GL_RED_INTEGER_EXT
:
773 dst
[i
] = (GLbyte
) rgba
[i
][RCOMP
];
776 case GL_GREEN_INTEGER_EXT
:
778 dst
[i
] = (GLbyte
) rgba
[i
][GCOMP
];
781 case GL_BLUE_INTEGER_EXT
:
783 dst
[i
] = (GLbyte
) rgba
[i
][BCOMP
];
786 case GL_ALPHA_INTEGER_EXT
:
788 dst
[i
] = (GLbyte
) rgba
[i
][ACOMP
];
791 case GL_RGB_INTEGER_EXT
:
793 dst
[i
*3+0] = (GLbyte
) rgba
[i
][RCOMP
];
794 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
795 dst
[i
*3+2] = (GLbyte
) rgba
[i
][BCOMP
];
798 case GL_RGBA_INTEGER_EXT
:
800 dst
[i
*4+0] = (GLbyte
) rgba
[i
][RCOMP
];
801 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
802 dst
[i
*4+2] = (GLbyte
) rgba
[i
][BCOMP
];
803 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
806 case GL_BGR_INTEGER_EXT
:
808 dst
[i
*3+0] = (GLbyte
) rgba
[i
][BCOMP
];
809 dst
[i
*3+1] = (GLbyte
) rgba
[i
][GCOMP
];
810 dst
[i
*3+2] = (GLbyte
) rgba
[i
][RCOMP
];
813 case GL_BGRA_INTEGER_EXT
:
815 dst
[i
*4+0] = (GLbyte
) rgba
[i
][BCOMP
];
816 dst
[i
*4+1] = (GLbyte
) rgba
[i
][GCOMP
];
817 dst
[i
*4+2] = (GLbyte
) rgba
[i
][RCOMP
];
818 dst
[i
*4+3] = (GLbyte
) rgba
[i
][ACOMP
];
821 case GL_LUMINANCE_INTEGER_EXT
:
823 dst
[i
*2+0] = (GLbyte
) (rgba
[i
][RCOMP
] +
826 dst
[i
*2+1] = (GLbyte
) rgba
[i
][ACOMP
];
829 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
831 dst
[i
] = (GLbyte
) (rgba
[i
][RCOMP
] +
839 dst
[i
*2+0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
840 dst
[i
*2+1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
844 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
848 case GL_UNSIGNED_SHORT
:
850 GLushort
*dst
= (GLushort
*) dstAddr
;
854 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][RCOMP
]);
858 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][GCOMP
]);
862 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][BCOMP
]);
866 CLAMPED_FLOAT_TO_USHORT(dst
[i
], rgba
[i
][ACOMP
]);
870 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
], luminance
[i
]);
872 case GL_LUMINANCE_ALPHA
:
874 UNCLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], luminance
[i
]);
875 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][ACOMP
]);
880 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+0], rgba
[i
][RCOMP
]);
881 CLAMPED_FLOAT_TO_USHORT(dst
[i
*2+1], rgba
[i
][GCOMP
]);
886 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][RCOMP
]);
887 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
888 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][BCOMP
]);
893 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][RCOMP
]);
894 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
895 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][BCOMP
]);
896 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
901 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+0], rgba
[i
][BCOMP
]);
902 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+1], rgba
[i
][GCOMP
]);
903 CLAMPED_FLOAT_TO_USHORT(dst
[i
*3+2], rgba
[i
][RCOMP
]);
908 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][BCOMP
]);
909 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][GCOMP
]);
910 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][RCOMP
]);
911 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][ACOMP
]);
916 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+0], rgba
[i
][ACOMP
]);
917 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+1], rgba
[i
][BCOMP
]);
918 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+2], rgba
[i
][GCOMP
]);
919 CLAMPED_FLOAT_TO_USHORT(dst
[i
*4+3], rgba
[i
][RCOMP
]);
922 case GL_RED_INTEGER_EXT
:
924 dst
[i
] = (GLushort
) rgba
[i
][RCOMP
];
927 case GL_GREEN_INTEGER_EXT
:
929 dst
[i
] = (GLushort
) rgba
[i
][GCOMP
];
932 case GL_BLUE_INTEGER_EXT
:
934 dst
[i
] = (GLushort
) rgba
[i
][BCOMP
];
937 case GL_ALPHA_INTEGER_EXT
:
939 dst
[i
] = (GLushort
) rgba
[i
][ACOMP
];
942 case GL_RGB_INTEGER_EXT
:
944 dst
[i
*3+0] = (GLushort
) rgba
[i
][RCOMP
];
945 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
946 dst
[i
*3+2] = (GLushort
) rgba
[i
][BCOMP
];
949 case GL_RGBA_INTEGER_EXT
:
951 dst
[i
*4+0] = (GLushort
) rgba
[i
][RCOMP
];
952 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
953 dst
[i
*4+2] = (GLushort
) rgba
[i
][BCOMP
];
954 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
957 case GL_BGR_INTEGER_EXT
:
959 dst
[i
*3+0] = (GLushort
) rgba
[i
][BCOMP
];
960 dst
[i
*3+1] = (GLushort
) rgba
[i
][GCOMP
];
961 dst
[i
*3+2] = (GLushort
) rgba
[i
][RCOMP
];
964 case GL_BGRA_INTEGER_EXT
:
966 dst
[i
*4+0] = (GLushort
) rgba
[i
][BCOMP
];
967 dst
[i
*4+1] = (GLushort
) rgba
[i
][GCOMP
];
968 dst
[i
*4+2] = (GLushort
) rgba
[i
][RCOMP
];
969 dst
[i
*4+3] = (GLushort
) rgba
[i
][ACOMP
];
972 case GL_LUMINANCE_INTEGER_EXT
:
974 dst
[i
*2+0] = (GLushort
) (rgba
[i
][RCOMP
] +
977 dst
[i
*2+1] = (GLushort
) rgba
[i
][ACOMP
];
980 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
982 dst
[i
] = (GLushort
) (rgba
[i
][RCOMP
] +
990 dst
[i
*2+0] = FLOAT_TO_USHORT(rgba
[i
][RCOMP
]);
991 dst
[i
*2+1] = FLOAT_TO_USHORT(rgba
[i
][GCOMP
]);
995 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1001 GLshort
*dst
= (GLshort
*) dstAddr
;
1002 switch (dstFormat
) {
1005 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1009 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1013 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1017 dst
[i
] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1021 dst
[i
] = FLOAT_TO_SHORT(luminance
[i
]);
1023 case GL_LUMINANCE_ALPHA
:
1025 dst
[i
*2+0] = FLOAT_TO_SHORT(luminance
[i
]);
1026 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1031 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1032 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1037 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1038 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1039 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1044 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1045 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1046 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1047 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1052 dst
[i
*3+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1053 dst
[i
*3+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1054 dst
[i
*3+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1059 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1060 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1061 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1062 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1067 dst
[i
*4+0] = FLOAT_TO_SHORT(rgba
[i
][ACOMP
]);
1068 dst
[i
*4+1] = FLOAT_TO_SHORT(rgba
[i
][BCOMP
]);
1069 dst
[i
*4+2] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1070 dst
[i
*4+3] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1073 case GL_RED_INTEGER_EXT
:
1075 dst
[i
] = (GLshort
) rgba
[i
][RCOMP
];
1078 case GL_GREEN_INTEGER_EXT
:
1080 dst
[i
] = (GLshort
) rgba
[i
][GCOMP
];
1083 case GL_BLUE_INTEGER_EXT
:
1085 dst
[i
] = (GLshort
) rgba
[i
][BCOMP
];
1088 case GL_ALPHA_INTEGER_EXT
:
1090 dst
[i
] = (GLshort
) rgba
[i
][ACOMP
];
1093 case GL_RGB_INTEGER_EXT
:
1095 dst
[i
*3+0] = (GLshort
) rgba
[i
][RCOMP
];
1096 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1097 dst
[i
*3+2] = (GLshort
) rgba
[i
][BCOMP
];
1100 case GL_RGBA_INTEGER_EXT
:
1102 dst
[i
*4+0] = (GLshort
) rgba
[i
][RCOMP
];
1103 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1104 dst
[i
*4+2] = (GLshort
) rgba
[i
][BCOMP
];
1105 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1108 case GL_BGR_INTEGER_EXT
:
1110 dst
[i
*3+0] = (GLshort
) rgba
[i
][BCOMP
];
1111 dst
[i
*3+1] = (GLshort
) rgba
[i
][GCOMP
];
1112 dst
[i
*3+2] = (GLshort
) rgba
[i
][RCOMP
];
1115 case GL_BGRA_INTEGER_EXT
:
1117 dst
[i
*4+0] = (GLshort
) rgba
[i
][BCOMP
];
1118 dst
[i
*4+1] = (GLshort
) rgba
[i
][GCOMP
];
1119 dst
[i
*4+2] = (GLshort
) rgba
[i
][RCOMP
];
1120 dst
[i
*4+3] = (GLshort
) rgba
[i
][ACOMP
];
1123 case GL_LUMINANCE_INTEGER_EXT
:
1125 dst
[i
*2+0] = (GLshort
) (rgba
[i
][RCOMP
] +
1128 dst
[i
*2+1] = (GLshort
) rgba
[i
][ACOMP
];
1131 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1133 dst
[i
] = (GLshort
) (rgba
[i
][RCOMP
] +
1141 dst
[i
*2+0] = FLOAT_TO_SHORT(rgba
[i
][RCOMP
]);
1142 dst
[i
*2+1] = FLOAT_TO_SHORT(rgba
[i
][GCOMP
]);
1146 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1150 case GL_UNSIGNED_INT
:
1152 GLuint
*dst
= (GLuint
*) dstAddr
;
1153 switch (dstFormat
) {
1156 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1160 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1164 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1168 dst
[i
] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1172 dst
[i
] = FLOAT_TO_UINT(luminance
[i
]);
1174 case GL_LUMINANCE_ALPHA
:
1176 dst
[i
*2+0] = FLOAT_TO_UINT(luminance
[i
]);
1177 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1182 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1183 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1188 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1189 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1190 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1195 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1196 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1197 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1198 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1203 dst
[i
*3+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1204 dst
[i
*3+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1205 dst
[i
*3+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1210 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1211 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1212 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1213 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1218 dst
[i
*4+0] = FLOAT_TO_UINT(rgba
[i
][ACOMP
]);
1219 dst
[i
*4+1] = FLOAT_TO_UINT(rgba
[i
][BCOMP
]);
1220 dst
[i
*4+2] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1221 dst
[i
*4+3] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1224 case GL_RED_INTEGER_EXT
:
1226 dst
[i
] = (GLuint
) rgba
[i
][RCOMP
];
1229 case GL_GREEN_INTEGER_EXT
:
1231 dst
[i
] = (GLuint
) rgba
[i
][GCOMP
];
1234 case GL_BLUE_INTEGER_EXT
:
1236 dst
[i
] = (GLuint
) rgba
[i
][BCOMP
];
1239 case GL_ALPHA_INTEGER_EXT
:
1241 dst
[i
] = (GLuint
) rgba
[i
][ACOMP
];
1244 case GL_RGB_INTEGER_EXT
:
1246 dst
[i
*3+0] = (GLuint
) rgba
[i
][RCOMP
];
1247 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1248 dst
[i
*3+2] = (GLuint
) rgba
[i
][BCOMP
];
1251 case GL_RGBA_INTEGER_EXT
:
1253 dst
[i
*4+0] = (GLuint
) rgba
[i
][RCOMP
];
1254 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1255 dst
[i
*4+2] = (GLuint
) rgba
[i
][BCOMP
];
1256 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1259 case GL_BGR_INTEGER_EXT
:
1261 dst
[i
*3+0] = (GLuint
) rgba
[i
][BCOMP
];
1262 dst
[i
*3+1] = (GLuint
) rgba
[i
][GCOMP
];
1263 dst
[i
*3+2] = (GLuint
) rgba
[i
][RCOMP
];
1266 case GL_BGRA_INTEGER_EXT
:
1268 dst
[i
*4+0] = (GLuint
) rgba
[i
][BCOMP
];
1269 dst
[i
*4+1] = (GLuint
) rgba
[i
][GCOMP
];
1270 dst
[i
*4+2] = (GLuint
) rgba
[i
][RCOMP
];
1271 dst
[i
*4+3] = (GLuint
) rgba
[i
][ACOMP
];
1274 case GL_LUMINANCE_INTEGER_EXT
:
1276 dst
[i
*2+0] = (GLuint
) (rgba
[i
][RCOMP
] +
1279 dst
[i
*2+1] = (GLuint
) rgba
[i
][ACOMP
];
1282 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1284 dst
[i
] = (GLuint
) (rgba
[i
][RCOMP
] +
1292 dst
[i
*2+0] = FLOAT_TO_UINT(rgba
[i
][RCOMP
]);
1293 dst
[i
*2+1] = FLOAT_TO_UINT(rgba
[i
][GCOMP
]);
1297 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1303 GLint
*dst
= (GLint
*) dstAddr
;
1304 switch (dstFormat
) {
1307 dst
[i
] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1311 dst
[i
] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1315 dst
[i
] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1319 dst
[i
] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1323 dst
[i
] = FLOAT_TO_INT(luminance
[i
]);
1325 case GL_LUMINANCE_ALPHA
:
1327 dst
[i
*2+0] = FLOAT_TO_INT(luminance
[i
]);
1328 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1333 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1334 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1339 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1340 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1341 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1346 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1347 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1348 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1349 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1354 dst
[i
*3+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1355 dst
[i
*3+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1356 dst
[i
*3+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1361 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1362 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1363 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1364 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1369 dst
[i
*4+0] = FLOAT_TO_INT(rgba
[i
][ACOMP
]);
1370 dst
[i
*4+1] = FLOAT_TO_INT(rgba
[i
][BCOMP
]);
1371 dst
[i
*4+2] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1372 dst
[i
*4+3] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1378 dst
[i
*2+0] = FLOAT_TO_INT(rgba
[i
][RCOMP
]);
1379 dst
[i
*2+1] = FLOAT_TO_INT(rgba
[i
][GCOMP
]);
1382 case GL_RED_INTEGER_EXT
:
1384 dst
[i
] = (GLint
) rgba
[i
][RCOMP
];
1387 case GL_GREEN_INTEGER_EXT
:
1389 dst
[i
] = (GLint
) rgba
[i
][GCOMP
];
1392 case GL_BLUE_INTEGER_EXT
:
1394 dst
[i
] = (GLint
) rgba
[i
][BCOMP
];
1397 case GL_ALPHA_INTEGER_EXT
:
1399 dst
[i
] = (GLint
) rgba
[i
][ACOMP
];
1402 case GL_RGB_INTEGER_EXT
:
1404 dst
[i
*3+0] = (GLint
) rgba
[i
][RCOMP
];
1405 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1406 dst
[i
*3+2] = (GLint
) rgba
[i
][BCOMP
];
1409 case GL_RGBA_INTEGER_EXT
:
1411 dst
[i
*4+0] = (GLint
) rgba
[i
][RCOMP
];
1412 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1413 dst
[i
*4+2] = (GLint
) rgba
[i
][BCOMP
];
1414 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1417 case GL_BGR_INTEGER_EXT
:
1419 dst
[i
*3+0] = (GLint
) rgba
[i
][BCOMP
];
1420 dst
[i
*3+1] = (GLint
) rgba
[i
][GCOMP
];
1421 dst
[i
*3+2] = (GLint
) rgba
[i
][RCOMP
];
1424 case GL_BGRA_INTEGER_EXT
:
1426 dst
[i
*4+0] = (GLint
) rgba
[i
][BCOMP
];
1427 dst
[i
*4+1] = (GLint
) rgba
[i
][GCOMP
];
1428 dst
[i
*4+2] = (GLint
) rgba
[i
][RCOMP
];
1429 dst
[i
*4+3] = (GLint
) rgba
[i
][ACOMP
];
1432 case GL_LUMINANCE_INTEGER_EXT
:
1434 dst
[i
*2+0] = (GLint
) (rgba
[i
][RCOMP
] +
1437 dst
[i
*2+1] = (GLint
) rgba
[i
][ACOMP
];
1440 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
1442 dst
[i
] = (GLint
) (rgba
[i
][RCOMP
] +
1448 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1454 GLfloat
*dst
= (GLfloat
*) dstAddr
;
1455 switch (dstFormat
) {
1458 dst
[i
] = rgba
[i
][RCOMP
];
1462 dst
[i
] = rgba
[i
][GCOMP
];
1466 dst
[i
] = rgba
[i
][BCOMP
];
1470 dst
[i
] = rgba
[i
][ACOMP
];
1474 dst
[i
] = luminance
[i
];
1476 case GL_LUMINANCE_ALPHA
:
1478 dst
[i
*2+0] = luminance
[i
];
1479 dst
[i
*2+1] = rgba
[i
][ACOMP
];
1484 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1485 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1490 dst
[i
*3+0] = rgba
[i
][RCOMP
];
1491 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1492 dst
[i
*3+2] = rgba
[i
][BCOMP
];
1497 dst
[i
*4+0] = rgba
[i
][RCOMP
];
1498 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1499 dst
[i
*4+2] = rgba
[i
][BCOMP
];
1500 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1505 dst
[i
*3+0] = rgba
[i
][BCOMP
];
1506 dst
[i
*3+1] = rgba
[i
][GCOMP
];
1507 dst
[i
*3+2] = rgba
[i
][RCOMP
];
1512 dst
[i
*4+0] = rgba
[i
][BCOMP
];
1513 dst
[i
*4+1] = rgba
[i
][GCOMP
];
1514 dst
[i
*4+2] = rgba
[i
][RCOMP
];
1515 dst
[i
*4+3] = rgba
[i
][ACOMP
];
1520 dst
[i
*4+0] = rgba
[i
][ACOMP
];
1521 dst
[i
*4+1] = rgba
[i
][BCOMP
];
1522 dst
[i
*4+2] = rgba
[i
][GCOMP
];
1523 dst
[i
*4+3] = rgba
[i
][RCOMP
];
1529 dst
[i
*2+0] = rgba
[i
][RCOMP
];
1530 dst
[i
*2+1] = rgba
[i
][GCOMP
];
1534 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1538 case GL_HALF_FLOAT_ARB
:
1540 GLhalfARB
*dst
= (GLhalfARB
*) dstAddr
;
1541 switch (dstFormat
) {
1544 dst
[i
] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1548 dst
[i
] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1552 dst
[i
] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1556 dst
[i
] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1560 dst
[i
] = _mesa_float_to_half(luminance
[i
]);
1562 case GL_LUMINANCE_ALPHA
:
1564 dst
[i
*2+0] = _mesa_float_to_half(luminance
[i
]);
1565 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1570 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1571 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1576 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1577 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1578 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1583 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1584 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1585 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1586 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1591 dst
[i
*3+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1592 dst
[i
*3+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1593 dst
[i
*3+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1598 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1599 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1600 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1601 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1606 dst
[i
*4+0] = _mesa_float_to_half(rgba
[i
][ACOMP
]);
1607 dst
[i
*4+1] = _mesa_float_to_half(rgba
[i
][BCOMP
]);
1608 dst
[i
*4+2] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1609 dst
[i
*4+3] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1615 dst
[i
*2+0] = _mesa_float_to_half(rgba
[i
][RCOMP
]);
1616 dst
[i
*2+1] = _mesa_float_to_half(rgba
[i
][GCOMP
]);
1620 _mesa_problem(ctx
, "bad format in _mesa_pack_rgba_span\n");
1624 case GL_UNSIGNED_BYTE_3_3_2
:
1625 if (dstFormat
== GL_RGB
) {
1626 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1628 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) << 5)
1629 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 2)
1630 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) );
1634 case GL_UNSIGNED_BYTE_2_3_3_REV
:
1635 if (dstFormat
== GL_RGB
) {
1636 GLubyte
*dst
= (GLubyte
*) dstAddr
;
1638 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 7.0F
) )
1639 | (IROUND(rgba
[i
][GCOMP
] * 7.0F
) << 3)
1640 | (IROUND(rgba
[i
][BCOMP
] * 3.0F
) << 6);
1644 case GL_UNSIGNED_SHORT_5_6_5
:
1645 if (dstFormat
== GL_RGB
) {
1646 GLushort
*dst
= (GLushort
*) dstAddr
;
1648 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1649 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1650 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) );
1654 case GL_UNSIGNED_SHORT_5_6_5_REV
:
1655 if (dstFormat
== GL_RGB
) {
1656 GLushort
*dst
= (GLushort
*) dstAddr
;
1658 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1659 | (IROUND(rgba
[i
][GCOMP
] * 63.0F
) << 5)
1660 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11);
1664 case GL_UNSIGNED_SHORT_4_4_4_4
:
1665 if (dstFormat
== GL_RGBA
) {
1666 GLushort
*dst
= (GLushort
*) dstAddr
;
1668 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12)
1669 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1670 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1671 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1674 else if (dstFormat
== GL_BGRA
) {
1675 GLushort
*dst
= (GLushort
*) dstAddr
;
1677 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 12)
1678 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1679 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 4)
1680 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) );
1683 else if (dstFormat
== GL_ABGR_EXT
) {
1684 GLushort
*dst
= (GLushort
*) dstAddr
;
1686 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12)
1687 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1688 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1689 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) );
1693 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
1694 if (dstFormat
== GL_RGBA
) {
1695 GLushort
*dst
= (GLushort
*) dstAddr
;
1697 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 15.0F
) )
1698 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1699 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 8)
1700 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1703 else if (dstFormat
== GL_BGRA
) {
1704 GLushort
*dst
= (GLushort
*) dstAddr
;
1706 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 15.0F
) )
1707 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 4)
1708 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 8)
1709 | (IROUND(rgba
[i
][ACOMP
] * 15.0F
) << 12);
1712 else if (dstFormat
== GL_ABGR_EXT
) {
1713 GLushort
*dst
= (GLushort
*) dstAddr
;
1715 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 15.0F
) )
1716 | (IROUND(rgba
[i
][BCOMP
] * 15.0F
) << 4)
1717 | (IROUND(rgba
[i
][GCOMP
] * 15.0F
) << 8)
1718 | (IROUND(rgba
[i
][RCOMP
] * 15.0F
) << 12);
1722 case GL_UNSIGNED_SHORT_5_5_5_1
:
1723 if (dstFormat
== GL_RGBA
) {
1724 GLushort
*dst
= (GLushort
*) dstAddr
;
1726 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 11)
1727 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1728 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 1)
1729 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1732 else if (dstFormat
== GL_BGRA
) {
1733 GLushort
*dst
= (GLushort
*) dstAddr
;
1735 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 11)
1736 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 6)
1737 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 1)
1738 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) );
1741 else if (dstFormat
== GL_ABGR_EXT
) {
1742 GLushort
*dst
= (GLushort
*) dstAddr
;
1744 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) << 11)
1745 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 6)
1746 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 1)
1747 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) );
1751 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
1752 if (dstFormat
== GL_RGBA
) {
1753 GLushort
*dst
= (GLushort
*) dstAddr
;
1755 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 31.0F
) )
1756 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1757 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 10)
1758 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1761 else if (dstFormat
== GL_BGRA
) {
1762 GLushort
*dst
= (GLushort
*) dstAddr
;
1764 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 31.0F
) )
1765 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 5)
1766 | (IROUND(rgba
[i
][RCOMP
] * 31.0F
) << 10)
1767 | (IROUND(rgba
[i
][ACOMP
] * 1.0F
) << 15);
1770 else if (dstFormat
== GL_ABGR_EXT
) {
1771 GLushort
*dst
= (GLushort
*) dstAddr
;
1773 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 31.0F
) )
1774 | (IROUND(rgba
[i
][BCOMP
] * 31.0F
) << 5)
1775 | (IROUND(rgba
[i
][GCOMP
] * 31.0F
) << 10)
1776 | (IROUND(rgba
[i
][RCOMP
] * 1.0F
) << 15);
1780 case GL_UNSIGNED_INT_8_8_8_8
:
1781 if (dstFormat
== GL_RGBA
) {
1782 GLuint
*dst
= (GLuint
*) dstAddr
;
1784 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 24)
1785 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1786 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 8)
1787 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1790 else if (dstFormat
== GL_BGRA
) {
1791 GLuint
*dst
= (GLuint
*) dstAddr
;
1793 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 24)
1794 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 16)
1795 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) << 8)
1796 | (IROUND(rgba
[i
][ACOMP
] * 255.F
) );
1799 else if (dstFormat
== GL_ABGR_EXT
) {
1800 GLuint
*dst
= (GLuint
*) dstAddr
;
1802 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.F
) << 24)
1803 | (IROUND(rgba
[i
][BCOMP
] * 255.F
) << 16)
1804 | (IROUND(rgba
[i
][GCOMP
] * 255.F
) << 8)
1805 | (IROUND(rgba
[i
][RCOMP
] * 255.F
) );
1809 case GL_UNSIGNED_INT_8_8_8_8_REV
:
1810 if (dstFormat
== GL_RGBA
) {
1811 GLuint
*dst
= (GLuint
*) dstAddr
;
1813 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 255.0F
) )
1814 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1815 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 16)
1816 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1819 else if (dstFormat
== GL_BGRA
) {
1820 GLuint
*dst
= (GLuint
*) dstAddr
;
1822 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 255.0F
) )
1823 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 8)
1824 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 16)
1825 | (IROUND(rgba
[i
][ACOMP
] * 255.0F
) << 24);
1828 else if (dstFormat
== GL_ABGR_EXT
) {
1829 GLuint
*dst
= (GLuint
*) dstAddr
;
1831 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 255.0F
) )
1832 | (IROUND(rgba
[i
][BCOMP
] * 255.0F
) << 8)
1833 | (IROUND(rgba
[i
][GCOMP
] * 255.0F
) << 16)
1834 | (IROUND(rgba
[i
][RCOMP
] * 255.0F
) << 24);
1838 case GL_UNSIGNED_INT_10_10_10_2
:
1839 if (dstFormat
== GL_RGBA
) {
1840 GLuint
*dst
= (GLuint
*) dstAddr
;
1842 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 22)
1843 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1844 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 2)
1845 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1848 else if (dstFormat
== GL_BGRA
) {
1849 GLuint
*dst
= (GLuint
*) dstAddr
;
1851 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 22)
1852 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 12)
1853 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 2)
1854 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) );
1857 else if (dstFormat
== GL_ABGR_EXT
) {
1858 GLuint
*dst
= (GLuint
*) dstAddr
;
1860 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) << 22)
1861 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 12)
1862 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 2)
1863 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) );
1867 case GL_UNSIGNED_INT_2_10_10_10_REV
:
1868 if (dstFormat
== GL_RGBA
) {
1869 GLuint
*dst
= (GLuint
*) dstAddr
;
1871 dst
[i
] = (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) )
1872 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1873 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 20)
1874 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1877 else if (dstFormat
== GL_BGRA
) {
1878 GLuint
*dst
= (GLuint
*) dstAddr
;
1880 dst
[i
] = (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) )
1881 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 10)
1882 | (IROUND(rgba
[i
][RCOMP
] * 1023.0F
) << 20)
1883 | (IROUND(rgba
[i
][ACOMP
] * 3.0F
) << 30);
1886 else if (dstFormat
== GL_ABGR_EXT
) {
1887 GLuint
*dst
= (GLuint
*) dstAddr
;
1889 dst
[i
] = (IROUND(rgba
[i
][ACOMP
] * 1023.0F
) )
1890 | (IROUND(rgba
[i
][BCOMP
] * 1023.0F
) << 10)
1891 | (IROUND(rgba
[i
][GCOMP
] * 1023.0F
) << 20)
1892 | (IROUND(rgba
[i
][RCOMP
] * 3.0F
) << 30);
1897 _mesa_problem(ctx
, "bad type in _mesa_pack_rgba_span_float");
1901 if (dstPacking
->SwapBytes
) {
1902 GLint swapSize
= _mesa_sizeof_packed_type(dstType
);
1903 if (swapSize
== 2) {
1904 if (dstPacking
->SwapBytes
) {
1905 _mesa_swap2((GLushort
*) dstAddr
, n
* comps
);
1908 else if (swapSize
== 4) {
1909 if (dstPacking
->SwapBytes
) {
1910 _mesa_swap4((GLuint
*) dstAddr
, n
* comps
);
1920 #define SWAP2BYTE(VALUE) \
1922 GLubyte *bytes = (GLubyte *) &(VALUE); \
1923 GLubyte tmp = bytes[0]; \
1924 bytes[0] = bytes[1]; \
1928 #define SWAP4BYTE(VALUE) \
1930 GLubyte *bytes = (GLubyte *) &(VALUE); \
1931 GLubyte tmp = bytes[0]; \
1932 bytes[0] = bytes[3]; \
1935 bytes[1] = bytes[2]; \
1941 extract_uint_indexes(GLuint n
, GLuint indexes
[],
1942 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
1943 const struct gl_pixelstore_attrib
*unpack
)
1945 ASSERT(srcFormat
== GL_COLOR_INDEX
|| srcFormat
== GL_STENCIL_INDEX
);
1947 ASSERT(srcType
== GL_BITMAP
||
1948 srcType
== GL_UNSIGNED_BYTE
||
1949 srcType
== GL_BYTE
||
1950 srcType
== GL_UNSIGNED_SHORT
||
1951 srcType
== GL_SHORT
||
1952 srcType
== GL_UNSIGNED_INT
||
1953 srcType
== GL_INT
||
1954 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
1955 srcType
== GL_HALF_FLOAT_ARB
||
1956 srcType
== GL_FLOAT
);
1961 GLubyte
*ubsrc
= (GLubyte
*) src
;
1962 if (unpack
->LsbFirst
) {
1963 GLubyte mask
= 1 << (unpack
->SkipPixels
& 0x7);
1965 for (i
= 0; i
< n
; i
++) {
1966 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1977 GLubyte mask
= 128 >> (unpack
->SkipPixels
& 0x7);
1979 for (i
= 0; i
< n
; i
++) {
1980 indexes
[i
] = (*ubsrc
& mask
) ? 1 : 0;
1992 case GL_UNSIGNED_BYTE
:
1995 const GLubyte
*s
= (const GLubyte
*) src
;
1996 for (i
= 0; i
< n
; i
++)
2003 const GLbyte
*s
= (const GLbyte
*) src
;
2004 for (i
= 0; i
< n
; i
++)
2008 case GL_UNSIGNED_SHORT
:
2011 const GLushort
*s
= (const GLushort
*) src
;
2012 if (unpack
->SwapBytes
) {
2013 for (i
= 0; i
< n
; i
++) {
2014 GLushort value
= s
[i
];
2020 for (i
= 0; i
< n
; i
++)
2028 const GLshort
*s
= (const GLshort
*) src
;
2029 if (unpack
->SwapBytes
) {
2030 for (i
= 0; i
< n
; i
++) {
2031 GLshort value
= s
[i
];
2037 for (i
= 0; i
< n
; i
++)
2042 case GL_UNSIGNED_INT
:
2045 const GLuint
*s
= (const GLuint
*) src
;
2046 if (unpack
->SwapBytes
) {
2047 for (i
= 0; i
< n
; i
++) {
2048 GLuint value
= s
[i
];
2054 for (i
= 0; i
< n
; i
++)
2062 const GLint
*s
= (const GLint
*) src
;
2063 if (unpack
->SwapBytes
) {
2064 for (i
= 0; i
< n
; i
++) {
2071 for (i
= 0; i
< n
; i
++)
2079 const GLfloat
*s
= (const GLfloat
*) src
;
2080 if (unpack
->SwapBytes
) {
2081 for (i
= 0; i
< n
; i
++) {
2082 GLfloat value
= s
[i
];
2084 indexes
[i
] = (GLuint
) value
;
2088 for (i
= 0; i
< n
; i
++)
2089 indexes
[i
] = (GLuint
) s
[i
];
2093 case GL_HALF_FLOAT_ARB
:
2096 const GLhalfARB
*s
= (const GLhalfARB
*) src
;
2097 if (unpack
->SwapBytes
) {
2098 for (i
= 0; i
< n
; i
++) {
2099 GLhalfARB value
= s
[i
];
2101 indexes
[i
] = (GLuint
) _mesa_half_to_float(value
);
2105 for (i
= 0; i
< n
; i
++)
2106 indexes
[i
] = (GLuint
) _mesa_half_to_float(s
[i
]);
2110 case GL_UNSIGNED_INT_24_8_EXT
:
2113 const GLuint
*s
= (const GLuint
*) src
;
2114 if (unpack
->SwapBytes
) {
2115 for (i
= 0; i
< n
; i
++) {
2116 GLuint value
= s
[i
];
2118 indexes
[i
] = value
& 0xff; /* lower 8 bits */
2122 for (i
= 0; i
< n
; i
++)
2123 indexes
[i
] = s
[i
] & 0xff; /* lower 8 bits */
2129 _mesa_problem(NULL
, "bad srcType in extract_uint_indexes");
2136 * Return source/dest RGBA indexes for unpacking pixels.
2139 get_component_mapping(GLenum format
,
2151 case GL_RED_INTEGER_EXT
:
2153 *gSrc
= *bSrc
= *aSrc
= -1;
2156 case GL_GREEN_INTEGER_EXT
:
2158 *rSrc
= *bSrc
= *aSrc
= -1;
2161 case GL_BLUE_INTEGER_EXT
:
2163 *rSrc
= *gSrc
= *aSrc
= -1;
2166 case GL_ALPHA_INTEGER_EXT
:
2167 *rSrc
= *gSrc
= *bSrc
= -1;
2171 case GL_LUMINANCE_INTEGER_EXT
:
2172 *rSrc
= *gSrc
= *bSrc
= 0;
2175 case GL_LUMINANCE_ALPHA
:
2176 case GL_LUMINANCE_ALPHA_INTEGER_EXT
:
2177 *rSrc
= *gSrc
= *bSrc
= 0;
2181 *rSrc
= *gSrc
= *bSrc
= *aSrc
= 0;
2195 case GL_RGB_INTEGER
:
2216 case GL_RGBA_INTEGER
:
2254 _mesa_problem(NULL
, "bad srcFormat %s in get_component_mapping",
2255 _mesa_lookup_enum_by_nr(format
));
2263 * This function extracts floating point RGBA values from arbitrary
2264 * image data. srcFormat and srcType are the format and type parameters
2265 * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
2267 * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
2268 * implements the "Conversion to floating point", "Conversion to RGB",
2269 * and "Final Expansion to RGBA" operations.
2271 * Args: n - number of pixels
2272 * rgba - output colors
2273 * srcFormat - format of incoming data
2274 * srcType - data type of incoming data
2275 * src - source data pointer
2276 * swapBytes - perform byteswapping of incoming data?
2279 extract_float_rgba(GLuint n
, GLfloat rgba
[][4],
2280 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2281 GLboolean swapBytes
)
2283 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2285 GLint rDst
, bDst
, gDst
, aDst
;
2286 GLboolean intFormat
;
2287 GLfloat rs
= 1.0f
, gs
= 1.0f
, bs
= 1.0f
, as
= 1.0f
; /* scale factors */
2289 ASSERT(srcFormat
== GL_RED
||
2290 srcFormat
== GL_GREEN
||
2291 srcFormat
== GL_BLUE
||
2292 srcFormat
== GL_ALPHA
||
2293 srcFormat
== GL_LUMINANCE
||
2294 srcFormat
== GL_LUMINANCE_ALPHA
||
2295 srcFormat
== GL_INTENSITY
||
2296 srcFormat
== GL_RG
||
2297 srcFormat
== GL_RGB
||
2298 srcFormat
== GL_BGR
||
2299 srcFormat
== GL_RGBA
||
2300 srcFormat
== GL_BGRA
||
2301 srcFormat
== GL_ABGR_EXT
||
2302 srcFormat
== GL_DU8DV8_ATI
||
2303 srcFormat
== GL_DUDV_ATI
||
2304 srcFormat
== GL_RED_INTEGER_EXT
||
2305 srcFormat
== GL_GREEN_INTEGER_EXT
||
2306 srcFormat
== GL_BLUE_INTEGER_EXT
||
2307 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2308 srcFormat
== GL_RGB_INTEGER_EXT
||
2309 srcFormat
== GL_RGBA_INTEGER_EXT
||
2310 srcFormat
== GL_BGR_INTEGER_EXT
||
2311 srcFormat
== GL_BGRA_INTEGER_EXT
||
2312 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2313 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2315 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2316 srcType
== GL_BYTE
||
2317 srcType
== GL_UNSIGNED_SHORT
||
2318 srcType
== GL_SHORT
||
2319 srcType
== GL_UNSIGNED_INT
||
2320 srcType
== GL_INT
||
2321 srcType
== GL_HALF_FLOAT_ARB
||
2322 srcType
== GL_FLOAT
||
2323 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2324 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2325 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2326 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2327 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2328 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2329 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2330 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2331 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2332 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2333 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2334 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2336 get_component_mapping(srcFormat
,
2337 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2338 &rDst
, &gDst
, &bDst
, &aDst
);
2340 stride
= _mesa_components_in_format(srcFormat
);
2342 intFormat
= _mesa_is_integer_format(srcFormat
);
2344 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
2345 if ((SRC_INDEX) < 0) { \
2348 for (i = 0; i < n; i++) { \
2349 rgba[i][DST_INDEX] = DEFAULT_INT; \
2353 for (i = 0; i < n; i++) { \
2354 rgba[i][DST_INDEX] = DEFAULT_FLT; \
2358 else if (swapBytes) { \
2359 const TYPE *s = (const TYPE *) src; \
2361 for (i = 0; i < n; i++) { \
2362 TYPE value = s[SRC_INDEX]; \
2363 if (sizeof(TYPE) == 2) { \
2366 else if (sizeof(TYPE) == 4) { \
2370 rgba[i][DST_INDEX] = (GLfloat) value; \
2372 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value); \
2377 const TYPE *s = (const TYPE *) src; \
2380 for (i = 0; i < n; i++) { \
2381 rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX]; \
2386 for (i = 0; i < n; i++) { \
2387 rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]); \
2394 case GL_UNSIGNED_BYTE
:
2395 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2396 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2397 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLubyte
, UBYTE_TO_FLOAT
);
2398 PROCESS(aSrc
, ACOMP
, 1.0F
, 255, GLubyte
, UBYTE_TO_FLOAT
);
2401 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2402 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2403 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLbyte
, BYTE_TO_FLOAT
);
2404 PROCESS(aSrc
, ACOMP
, 1.0F
, 127, GLbyte
, BYTE_TO_FLOAT
);
2406 case GL_UNSIGNED_SHORT
:
2407 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2408 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2409 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLushort
, USHORT_TO_FLOAT
);
2410 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffff, GLushort
, USHORT_TO_FLOAT
);
2413 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2414 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2415 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLshort
, SHORT_TO_FLOAT
);
2416 PROCESS(aSrc
, ACOMP
, 1.0F
, 32767, GLshort
, SHORT_TO_FLOAT
);
2418 case GL_UNSIGNED_INT
:
2419 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2420 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2421 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLuint
, UINT_TO_FLOAT
);
2422 PROCESS(aSrc
, ACOMP
, 1.0F
, 0xffffffff, GLuint
, UINT_TO_FLOAT
);
2425 PROCESS(rSrc
, RCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2426 PROCESS(gSrc
, GCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2427 PROCESS(bSrc
, BCOMP
, 0.0F
, 0, GLint
, INT_TO_FLOAT
);
2428 PROCESS(aSrc
, ACOMP
, 1.0F
, 2147483647, GLint
, INT_TO_FLOAT
);
2431 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2432 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2433 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLfloat
, (GLfloat
));
2434 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLfloat
, (GLfloat
));
2436 case GL_HALF_FLOAT_ARB
:
2437 PROCESS(rSrc
, RCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2438 PROCESS(gSrc
, GCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2439 PROCESS(bSrc
, BCOMP
, 0.0F
, 0.0F
, GLhalfARB
, _mesa_half_to_float
);
2440 PROCESS(aSrc
, ACOMP
, 1.0F
, 1.0F
, GLhalfARB
, _mesa_half_to_float
);
2442 case GL_UNSIGNED_BYTE_3_3_2
:
2444 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2451 for (i
= 0; i
< n
; i
++) {
2452 GLubyte p
= ubsrc
[i
];
2453 rgba
[i
][rDst
] = ((p
>> 5) ) * rs
;
2454 rgba
[i
][gDst
] = ((p
>> 2) & 0x7) * gs
;
2455 rgba
[i
][bDst
] = ((p
) & 0x3) * bs
;
2456 rgba
[i
][aDst
] = 1.0F
;
2460 case GL_UNSIGNED_BYTE_2_3_3_REV
:
2462 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
2469 for (i
= 0; i
< n
; i
++) {
2470 GLubyte p
= ubsrc
[i
];
2471 rgba
[i
][rDst
] = ((p
) & 0x7) * rs
;
2472 rgba
[i
][gDst
] = ((p
>> 3) & 0x7) * gs
;
2473 rgba
[i
][bDst
] = ((p
>> 6) ) * bs
;
2474 rgba
[i
][aDst
] = 1.0F
;
2478 case GL_UNSIGNED_SHORT_5_6_5
:
2485 const GLushort
*ussrc
= (const GLushort
*) src
;
2487 for (i
= 0; i
< n
; i
++) {
2488 GLushort p
= ussrc
[i
];
2490 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2491 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2492 rgba
[i
][bDst
] = ((p
) & 0x1f) * bs
;
2493 rgba
[i
][aDst
] = 1.0F
;
2497 const GLushort
*ussrc
= (const GLushort
*) src
;
2499 for (i
= 0; i
< n
; i
++) {
2500 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 case GL_UNSIGNED_SHORT_5_6_5_REV
:
2515 const GLushort
*ussrc
= (const GLushort
*) src
;
2517 for (i
= 0; i
< n
; i
++) {
2518 GLushort p
= ussrc
[i
];
2520 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2521 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f) * gs
;
2522 rgba
[i
][bDst
] = ((p
>> 11) ) * bs
;
2523 rgba
[i
][aDst
] = 1.0F
;
2527 const GLushort
*ussrc
= (const GLushort
*) src
;
2529 for (i
= 0; i
< n
; i
++) {
2530 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 case GL_UNSIGNED_SHORT_4_4_4_4
:
2540 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2543 const GLushort
*ussrc
= (const GLushort
*) src
;
2545 for (i
= 0; i
< n
; i
++) {
2546 GLushort p
= ussrc
[i
];
2548 rgba
[i
][rDst
] = ((p
>> 12) ) * rs
;
2549 rgba
[i
][gDst
] = ((p
>> 8) & 0xf) * gs
;
2550 rgba
[i
][bDst
] = ((p
>> 4) & 0xf) * bs
;
2551 rgba
[i
][aDst
] = ((p
) & 0xf) * as
;
2555 const GLushort
*ussrc
= (const GLushort
*) src
;
2557 for (i
= 0; i
< n
; i
++) {
2558 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 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
2568 rs
= gs
= bs
= as
= 1.0F
/ 15.0F
;
2571 const GLushort
*ussrc
= (const GLushort
*) src
;
2573 for (i
= 0; i
< n
; i
++) {
2574 GLushort p
= ussrc
[i
];
2576 rgba
[i
][rDst
] = ((p
) & 0xf) * rs
;
2577 rgba
[i
][gDst
] = ((p
>> 4) & 0xf) * gs
;
2578 rgba
[i
][bDst
] = ((p
>> 8) & 0xf) * bs
;
2579 rgba
[i
][aDst
] = ((p
>> 12) ) * as
;
2583 const GLushort
*ussrc
= (const GLushort
*) src
;
2585 for (i
= 0; i
< n
; i
++) {
2586 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 case GL_UNSIGNED_SHORT_5_5_5_1
:
2596 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2599 const GLushort
*ussrc
= (const GLushort
*) src
;
2601 for (i
= 0; i
< n
; i
++) {
2602 GLushort p
= ussrc
[i
];
2604 rgba
[i
][rDst
] = ((p
>> 11) ) * rs
;
2605 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f) * gs
;
2606 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f) * bs
;
2607 rgba
[i
][aDst
] = ((p
) & 0x1) * as
;
2611 const GLushort
*ussrc
= (const GLushort
*) src
;
2613 for (i
= 0; i
< n
; i
++) {
2614 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 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
2624 rs
= gs
= bs
= 1.0F
/ 31.0F
;
2627 const GLushort
*ussrc
= (const GLushort
*) src
;
2629 for (i
= 0; i
< n
; i
++) {
2630 GLushort p
= ussrc
[i
];
2632 rgba
[i
][rDst
] = ((p
) & 0x1f) * rs
;
2633 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f) * gs
;
2634 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f) * bs
;
2635 rgba
[i
][aDst
] = ((p
>> 15) ) * as
;
2639 const GLushort
*ussrc
= (const GLushort
*) src
;
2641 for (i
= 0; i
< n
; i
++) {
2642 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 case GL_UNSIGNED_INT_8_8_8_8
:
2652 const GLuint
*uisrc
= (const GLuint
*) src
;
2655 for (i
= 0; i
< n
; i
++) {
2656 GLuint p
= uisrc
[i
];
2657 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2658 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2659 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2660 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2664 for (i
= 0; i
< n
; i
++) {
2665 GLuint p
= uisrc
[i
];
2666 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2667 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2668 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2669 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2674 const GLuint
*uisrc
= (const GLuint
*) src
;
2677 for (i
= 0; i
< n
; i
++) {
2678 GLuint p
= uisrc
[i
];
2679 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2680 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2681 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2682 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2686 for (i
= 0; i
< n
; i
++) {
2687 GLuint p
= uisrc
[i
];
2688 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2689 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2690 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2691 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2696 case GL_UNSIGNED_INT_8_8_8_8_REV
:
2698 const GLuint
*uisrc
= (const GLuint
*) src
;
2701 for (i
= 0; i
< n
; i
++) {
2702 GLuint p
= uisrc
[i
];
2703 rgba
[i
][rDst
] = (GLfloat
) ((p
>> 24) );
2704 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2705 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2706 rgba
[i
][aDst
] = (GLfloat
) ((p
) & 0xff);
2710 for (i
= 0; i
< n
; i
++) {
2711 GLuint p
= uisrc
[i
];
2712 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2713 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2714 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2715 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2720 const GLuint
*uisrc
= (const GLuint
*) src
;
2723 for (i
= 0; i
< n
; i
++) {
2724 GLuint p
= uisrc
[i
];
2725 rgba
[i
][rDst
] = (GLfloat
) ((p
) & 0xff);
2726 rgba
[i
][gDst
] = (GLfloat
) ((p
>> 8) & 0xff);
2727 rgba
[i
][bDst
] = (GLfloat
) ((p
>> 16) & 0xff);
2728 rgba
[i
][aDst
] = (GLfloat
) ((p
>> 24) );
2732 for (i
= 0; i
< n
; i
++) {
2733 GLuint p
= uisrc
[i
];
2734 rgba
[i
][rDst
] = UBYTE_TO_FLOAT((p
) & 0xff);
2735 rgba
[i
][gDst
] = UBYTE_TO_FLOAT((p
>> 8) & 0xff);
2736 rgba
[i
][bDst
] = UBYTE_TO_FLOAT((p
>> 16) & 0xff);
2737 rgba
[i
][aDst
] = UBYTE_TO_FLOAT((p
>> 24) );
2742 case GL_UNSIGNED_INT_10_10_10_2
:
2744 rs
= 1.0F
/ 1023.0F
;
2745 gs
= 1.0F
/ 1023.0F
;
2746 bs
= 1.0F
/ 1023.0F
;
2750 const GLuint
*uisrc
= (const GLuint
*) src
;
2752 for (i
= 0; i
< n
; i
++) {
2753 GLuint p
= uisrc
[i
];
2755 rgba
[i
][rDst
] = ((p
>> 22) ) * rs
;
2756 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff) * gs
;
2757 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff) * bs
;
2758 rgba
[i
][aDst
] = ((p
) & 0x3 ) * as
;
2762 const GLuint
*uisrc
= (const GLuint
*) src
;
2764 for (i
= 0; i
< n
; i
++) {
2765 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 case GL_UNSIGNED_INT_2_10_10_10_REV
:
2775 rs
= 1.0F
/ 1023.0F
;
2776 gs
= 1.0F
/ 1023.0F
;
2777 bs
= 1.0F
/ 1023.0F
;
2781 const GLuint
*uisrc
= (const GLuint
*) src
;
2783 for (i
= 0; i
< n
; i
++) {
2784 GLuint p
= uisrc
[i
];
2786 rgba
[i
][rDst
] = ((p
) & 0x3ff) * rs
;
2787 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff) * gs
;
2788 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff) * bs
;
2789 rgba
[i
][aDst
] = ((p
>> 30) ) * as
;
2793 const GLuint
*uisrc
= (const GLuint
*) src
;
2795 for (i
= 0; i
< n
; i
++) {
2796 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
;
2805 _mesa_problem(NULL
, "bad srcType in extract float data");
2812 static INLINE GLuint
2813 clamp_byte_to_uint(GLbyte b
)
2815 return b
< 0 ? 0 : b
;
2819 static INLINE GLuint
2820 clamp_short_to_uint(GLshort s
)
2822 return s
< 0 ? 0 : s
;
2826 static INLINE GLuint
2827 clamp_int_to_uint(GLint i
)
2829 return i
< 0 ? 0 : i
;
2833 static INLINE GLuint
2834 clamp_float_to_uint(GLfloat f
)
2836 return f
< 0.0F
? 0 : IROUND(f
);
2840 static INLINE GLuint
2841 clamp_half_to_uint(GLhalfARB h
)
2843 GLfloat f
= _mesa_half_to_float(h
);
2844 return f
< 0.0F
? 0 : IROUND(f
);
2849 * \sa extract_float_rgba()
2852 extract_uint_rgba(GLuint n
, GLuint rgba
[][4],
2853 GLenum srcFormat
, GLenum srcType
, const GLvoid
*src
,
2854 GLboolean swapBytes
)
2856 GLint rSrc
, gSrc
, bSrc
, aSrc
;
2858 GLint rDst
, bDst
, gDst
, aDst
;
2859 GLboolean intFormat
;
2861 ASSERT(srcFormat
== GL_RED
||
2862 srcFormat
== GL_GREEN
||
2863 srcFormat
== GL_BLUE
||
2864 srcFormat
== GL_ALPHA
||
2865 srcFormat
== GL_LUMINANCE
||
2866 srcFormat
== GL_LUMINANCE_ALPHA
||
2867 srcFormat
== GL_INTENSITY
||
2868 srcFormat
== GL_RG
||
2869 srcFormat
== GL_RGB
||
2870 srcFormat
== GL_BGR
||
2871 srcFormat
== GL_RGBA
||
2872 srcFormat
== GL_BGRA
||
2873 srcFormat
== GL_ABGR_EXT
||
2874 srcFormat
== GL_DU8DV8_ATI
||
2875 srcFormat
== GL_DUDV_ATI
||
2876 srcFormat
== GL_RED_INTEGER_EXT
||
2877 srcFormat
== GL_GREEN_INTEGER_EXT
||
2878 srcFormat
== GL_BLUE_INTEGER_EXT
||
2879 srcFormat
== GL_ALPHA_INTEGER_EXT
||
2880 srcFormat
== GL_RGB_INTEGER_EXT
||
2881 srcFormat
== GL_RGBA_INTEGER_EXT
||
2882 srcFormat
== GL_BGR_INTEGER_EXT
||
2883 srcFormat
== GL_BGRA_INTEGER_EXT
||
2884 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
2885 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
2887 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
2888 srcType
== GL_BYTE
||
2889 srcType
== GL_UNSIGNED_SHORT
||
2890 srcType
== GL_SHORT
||
2891 srcType
== GL_UNSIGNED_INT
||
2892 srcType
== GL_INT
||
2893 srcType
== GL_HALF_FLOAT_ARB
||
2894 srcType
== GL_FLOAT
||
2895 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
2896 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
2897 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
2898 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
2899 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
2900 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
2901 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
2902 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
2903 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
2904 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
2905 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
2906 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
2908 get_component_mapping(srcFormat
,
2909 &rSrc
, &gSrc
, &bSrc
, &aSrc
,
2910 &rDst
, &gDst
, &bDst
, &aDst
);
2912 stride
= _mesa_components_in_format(srcFormat
);
2914 intFormat
= _mesa_is_integer_format(srcFormat
);
2916 #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION) \
2917 if ((SRC_INDEX) < 0) { \
2919 for (i = 0; i < n; i++) { \
2920 rgba[i][DST_INDEX] = DEFAULT; \
2923 else if (swapBytes) { \
2924 const TYPE *s = (const TYPE *) src; \
2926 for (i = 0; i < n; i++) { \
2927 TYPE value = s[SRC_INDEX]; \
2928 if (sizeof(TYPE) == 2) { \
2931 else if (sizeof(TYPE) == 4) { \
2934 rgba[i][DST_INDEX] = CONVERSION(value); \
2939 const TYPE *s = (const TYPE *) src; \
2941 for (i = 0; i < n; i++) { \
2942 rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]); \
2948 case GL_UNSIGNED_BYTE
:
2949 PROCESS(rSrc
, RCOMP
, 0, GLubyte
, (GLuint
));
2950 PROCESS(gSrc
, GCOMP
, 0, GLubyte
, (GLuint
));
2951 PROCESS(bSrc
, BCOMP
, 0, GLubyte
, (GLuint
));
2952 PROCESS(aSrc
, ACOMP
, 1, GLubyte
, (GLuint
));
2955 PROCESS(rSrc
, RCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2956 PROCESS(gSrc
, GCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2957 PROCESS(bSrc
, BCOMP
, 0, GLbyte
, clamp_byte_to_uint
);
2958 PROCESS(aSrc
, ACOMP
, 1, GLbyte
, clamp_byte_to_uint
);
2960 case GL_UNSIGNED_SHORT
:
2961 PROCESS(rSrc
, RCOMP
, 0, GLushort
, (GLuint
));
2962 PROCESS(gSrc
, GCOMP
, 0, GLushort
, (GLuint
));
2963 PROCESS(bSrc
, BCOMP
, 0, GLushort
, (GLuint
));
2964 PROCESS(aSrc
, ACOMP
, 1, GLushort
, (GLuint
));
2967 PROCESS(rSrc
, RCOMP
, 0, GLshort
, clamp_short_to_uint
);
2968 PROCESS(gSrc
, GCOMP
, 0, GLshort
, clamp_short_to_uint
);
2969 PROCESS(bSrc
, BCOMP
, 0, GLshort
, clamp_short_to_uint
);
2970 PROCESS(aSrc
, ACOMP
, 1, GLshort
, clamp_short_to_uint
);
2972 case GL_UNSIGNED_INT
:
2973 PROCESS(rSrc
, RCOMP
, 0, GLuint
, (GLuint
));
2974 PROCESS(gSrc
, GCOMP
, 0, GLuint
, (GLuint
));
2975 PROCESS(bSrc
, BCOMP
, 0, GLuint
, (GLuint
));
2976 PROCESS(aSrc
, ACOMP
, 1, GLuint
, (GLuint
));
2979 PROCESS(rSrc
, RCOMP
, 0, GLint
, clamp_int_to_uint
);
2980 PROCESS(gSrc
, GCOMP
, 0, GLint
, clamp_int_to_uint
);
2981 PROCESS(bSrc
, BCOMP
, 0, GLint
, clamp_int_to_uint
);
2982 PROCESS(aSrc
, ACOMP
, 1, GLint
, clamp_int_to_uint
);
2985 PROCESS(rSrc
, RCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2986 PROCESS(gSrc
, GCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2987 PROCESS(bSrc
, BCOMP
, 0, GLfloat
, clamp_float_to_uint
);
2988 PROCESS(aSrc
, ACOMP
, 1, GLfloat
, clamp_float_to_uint
);
2990 case GL_HALF_FLOAT_ARB
:
2991 PROCESS(rSrc
, RCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2992 PROCESS(gSrc
, GCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2993 PROCESS(bSrc
, BCOMP
, 0, GLhalfARB
, clamp_half_to_uint
);
2994 PROCESS(aSrc
, ACOMP
, 1, GLhalfARB
, clamp_half_to_uint
);
2996 case GL_UNSIGNED_BYTE_3_3_2
:
2998 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3000 for (i
= 0; i
< n
; i
++) {
3001 GLubyte p
= ubsrc
[i
];
3002 rgba
[i
][rDst
] = ((p
>> 5) );
3003 rgba
[i
][gDst
] = ((p
>> 2) & 0x7);
3004 rgba
[i
][bDst
] = ((p
) & 0x3);
3009 case GL_UNSIGNED_BYTE_2_3_3_REV
:
3011 const GLubyte
*ubsrc
= (const GLubyte
*) src
;
3013 for (i
= 0; i
< n
; i
++) {
3014 GLubyte p
= ubsrc
[i
];
3015 rgba
[i
][rDst
] = ((p
) & 0x7);
3016 rgba
[i
][gDst
] = ((p
>> 3) & 0x7);
3017 rgba
[i
][bDst
] = ((p
>> 6) );
3022 case GL_UNSIGNED_SHORT_5_6_5
:
3024 const GLushort
*ussrc
= (const GLushort
*) src
;
3026 for (i
= 0; i
< n
; i
++) {
3027 GLushort p
= ussrc
[i
];
3029 rgba
[i
][rDst
] = ((p
>> 11) );
3030 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3031 rgba
[i
][bDst
] = ((p
) & 0x1f);
3036 const GLushort
*ussrc
= (const GLushort
*) src
;
3038 for (i
= 0; i
< n
; i
++) {
3039 GLushort p
= ussrc
[i
];
3040 rgba
[i
][rDst
] = ((p
>> 11) );
3041 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3042 rgba
[i
][bDst
] = ((p
) & 0x1f);
3047 case GL_UNSIGNED_SHORT_5_6_5_REV
:
3049 const GLushort
*ussrc
= (const GLushort
*) src
;
3051 for (i
= 0; i
< n
; i
++) {
3052 GLushort p
= ussrc
[i
];
3054 rgba
[i
][rDst
] = ((p
) & 0x1f);
3055 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3056 rgba
[i
][bDst
] = ((p
>> 11) );
3061 const GLushort
*ussrc
= (const GLushort
*) src
;
3063 for (i
= 0; i
< n
; i
++) {
3064 GLushort p
= ussrc
[i
];
3065 rgba
[i
][rDst
] = ((p
) & 0x1f);
3066 rgba
[i
][gDst
] = ((p
>> 5) & 0x3f);
3067 rgba
[i
][bDst
] = ((p
>> 11) );
3072 case GL_UNSIGNED_SHORT_4_4_4_4
:
3074 const GLushort
*ussrc
= (const GLushort
*) src
;
3076 for (i
= 0; i
< n
; i
++) {
3077 GLushort p
= ussrc
[i
];
3079 rgba
[i
][rDst
] = ((p
>> 12) );
3080 rgba
[i
][gDst
] = ((p
>> 8) & 0xf);
3081 rgba
[i
][bDst
] = ((p
>> 4) & 0xf);
3082 rgba
[i
][aDst
] = ((p
) & 0xf);
3086 const GLushort
*ussrc
= (const GLushort
*) src
;
3088 for (i
= 0; i
< n
; i
++) {
3089 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 case GL_UNSIGNED_SHORT_4_4_4_4_REV
:
3099 const GLushort
*ussrc
= (const GLushort
*) src
;
3101 for (i
= 0; i
< n
; i
++) {
3102 GLushort p
= ussrc
[i
];
3104 rgba
[i
][rDst
] = ((p
) & 0xf);
3105 rgba
[i
][gDst
] = ((p
>> 4) & 0xf);
3106 rgba
[i
][bDst
] = ((p
>> 8) & 0xf);
3107 rgba
[i
][aDst
] = ((p
>> 12) );
3111 const GLushort
*ussrc
= (const GLushort
*) src
;
3113 for (i
= 0; i
< n
; i
++) {
3114 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 case GL_UNSIGNED_SHORT_5_5_5_1
:
3124 const GLushort
*ussrc
= (const GLushort
*) src
;
3126 for (i
= 0; i
< n
; i
++) {
3127 GLushort p
= ussrc
[i
];
3129 rgba
[i
][rDst
] = ((p
>> 11) );
3130 rgba
[i
][gDst
] = ((p
>> 6) & 0x1f);
3131 rgba
[i
][bDst
] = ((p
>> 1) & 0x1f);
3132 rgba
[i
][aDst
] = ((p
) & 0x1 );
3136 const GLushort
*ussrc
= (const GLushort
*) src
;
3138 for (i
= 0; i
< n
; i
++) {
3139 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 case GL_UNSIGNED_SHORT_1_5_5_5_REV
:
3149 const GLushort
*ussrc
= (const GLushort
*) src
;
3151 for (i
= 0; i
< n
; i
++) {
3152 GLushort p
= ussrc
[i
];
3154 rgba
[i
][rDst
] = ((p
) & 0x1f);
3155 rgba
[i
][gDst
] = ((p
>> 5) & 0x1f);
3156 rgba
[i
][bDst
] = ((p
>> 10) & 0x1f);
3157 rgba
[i
][aDst
] = ((p
>> 15) );
3161 const GLushort
*ussrc
= (const GLushort
*) src
;
3163 for (i
= 0; i
< n
; i
++) {
3164 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 case GL_UNSIGNED_INT_8_8_8_8
:
3174 const GLuint
*uisrc
= (const GLuint
*) src
;
3176 for (i
= 0; i
< n
; i
++) {
3177 GLuint p
= uisrc
[i
];
3178 rgba
[i
][rDst
] = ((p
) & 0xff);
3179 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3180 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3181 rgba
[i
][aDst
] = ((p
>> 24) );
3185 const GLuint
*uisrc
= (const GLuint
*) src
;
3187 for (i
= 0; i
< n
; i
++) {
3188 GLuint p
= uisrc
[i
];
3189 rgba
[i
][rDst
] = ((p
>> 24) );
3190 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3191 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3192 rgba
[i
][aDst
] = ((p
) & 0xff);
3196 case GL_UNSIGNED_INT_8_8_8_8_REV
:
3198 const GLuint
*uisrc
= (const GLuint
*) src
;
3200 for (i
= 0; i
< n
; i
++) {
3201 GLuint p
= uisrc
[i
];
3202 rgba
[i
][rDst
] = ((p
>> 24) );
3203 rgba
[i
][gDst
] = ((p
>> 16) & 0xff);
3204 rgba
[i
][bDst
] = ((p
>> 8) & 0xff);
3205 rgba
[i
][aDst
] = ((p
) & 0xff);
3209 const GLuint
*uisrc
= (const GLuint
*) src
;
3211 for (i
= 0; i
< n
; i
++) {
3212 GLuint p
= uisrc
[i
];
3213 rgba
[i
][rDst
] = ((p
) & 0xff);
3214 rgba
[i
][gDst
] = ((p
>> 8) & 0xff);
3215 rgba
[i
][bDst
] = ((p
>> 16) & 0xff);
3216 rgba
[i
][aDst
] = ((p
>> 24) );
3220 case GL_UNSIGNED_INT_10_10_10_2
:
3222 const GLuint
*uisrc
= (const GLuint
*) src
;
3224 for (i
= 0; i
< n
; i
++) {
3225 GLuint p
= uisrc
[i
];
3227 rgba
[i
][rDst
] = ((p
>> 22) );
3228 rgba
[i
][gDst
] = ((p
>> 12) & 0x3ff);
3229 rgba
[i
][bDst
] = ((p
>> 2) & 0x3ff);
3230 rgba
[i
][aDst
] = ((p
) & 0x3 );
3234 const GLuint
*uisrc
= (const GLuint
*) src
;
3236 for (i
= 0; i
< n
; i
++) {
3237 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 case GL_UNSIGNED_INT_2_10_10_10_REV
:
3247 const GLuint
*uisrc
= (const GLuint
*) src
;
3249 for (i
= 0; i
< n
; i
++) {
3250 GLuint p
= uisrc
[i
];
3252 rgba
[i
][rDst
] = ((p
) & 0x3ff);
3253 rgba
[i
][gDst
] = ((p
>> 10) & 0x3ff);
3254 rgba
[i
][bDst
] = ((p
>> 20) & 0x3ff);
3255 rgba
[i
][aDst
] = ((p
>> 30) );
3259 const GLuint
*uisrc
= (const GLuint
*) src
;
3261 for (i
= 0; i
< n
; i
++) {
3262 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) );
3271 _mesa_problem(NULL
, "bad srcType in extract uint data");
3280 * Unpack a row of color image data from a client buffer according to
3281 * the pixel unpacking parameters.
3282 * Return GLchan values in the specified dest image format.
3283 * This is used by glDrawPixels and glTexImage?D().
3284 * \param ctx - the context
3285 * n - number of pixels in the span
3286 * dstFormat - format of destination color array
3287 * dest - the destination color array
3288 * srcFormat - source image format
3289 * srcType - source image data type
3290 * source - source image pointer
3291 * srcPacking - pixel unpacking parameters
3292 * transferOps - bitmask of IMAGE_*_BIT values of operations to apply
3294 * XXX perhaps expand this to process whole images someday.
3297 _mesa_unpack_color_span_chan( struct gl_context
*ctx
,
3298 GLuint n
, GLenum dstFormat
, GLchan dest
[],
3299 GLenum srcFormat
, GLenum srcType
,
3300 const GLvoid
*source
,
3301 const struct gl_pixelstore_attrib
*srcPacking
,
3302 GLbitfield transferOps
)
3304 ASSERT(dstFormat
== GL_ALPHA
||
3305 dstFormat
== GL_LUMINANCE
||
3306 dstFormat
== GL_LUMINANCE_ALPHA
||
3307 dstFormat
== GL_INTENSITY
||
3308 dstFormat
== GL_RED
||
3309 dstFormat
== GL_RG
||
3310 dstFormat
== GL_RGB
||
3311 dstFormat
== GL_RGBA
||
3312 dstFormat
== GL_COLOR_INDEX
);
3314 ASSERT(srcFormat
== GL_RED
||
3315 srcFormat
== GL_GREEN
||
3316 srcFormat
== GL_BLUE
||
3317 srcFormat
== GL_ALPHA
||
3318 srcFormat
== GL_LUMINANCE
||
3319 srcFormat
== GL_LUMINANCE_ALPHA
||
3320 srcFormat
== GL_INTENSITY
||
3321 srcFormat
== GL_RG
||
3322 srcFormat
== GL_RGB
||
3323 srcFormat
== GL_BGR
||
3324 srcFormat
== GL_RGBA
||
3325 srcFormat
== GL_BGRA
||
3326 srcFormat
== GL_ABGR_EXT
||
3327 srcFormat
== GL_COLOR_INDEX
);
3329 ASSERT(srcType
== GL_BITMAP
||
3330 srcType
== GL_UNSIGNED_BYTE
||
3331 srcType
== GL_BYTE
||
3332 srcType
== GL_UNSIGNED_SHORT
||
3333 srcType
== GL_SHORT
||
3334 srcType
== GL_UNSIGNED_INT
||
3335 srcType
== GL_INT
||
3336 srcType
== GL_HALF_FLOAT_ARB
||
3337 srcType
== GL_FLOAT
||
3338 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3339 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3340 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3341 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3342 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3343 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3344 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3345 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3346 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3347 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3348 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3349 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3351 /* Try simple cases first */
3352 if (transferOps
== 0) {
3353 if (srcType
== CHAN_TYPE
) {
3354 if (dstFormat
== GL_RGBA
) {
3355 if (srcFormat
== GL_RGBA
) {
3356 memcpy( dest
, source
, n
* 4 * sizeof(GLchan
) );
3359 else if (srcFormat
== GL_RGB
) {
3361 const GLchan
*src
= (const GLchan
*) source
;
3363 for (i
= 0; i
< n
; i
++) {
3374 else if (dstFormat
== GL_RGB
) {
3375 if (srcFormat
== GL_RGB
) {
3376 memcpy( dest
, source
, n
* 3 * sizeof(GLchan
) );
3379 else if (srcFormat
== GL_RGBA
) {
3381 const GLchan
*src
= (const GLchan
*) source
;
3383 for (i
= 0; i
< n
; i
++) {
3393 else if (dstFormat
== srcFormat
) {
3394 GLint comps
= _mesa_components_in_format(srcFormat
);
3396 memcpy( dest
, source
, n
* comps
* sizeof(GLchan
) );
3401 * Common situation, loading 8bit RGBA/RGB source images
3402 * into 16/32 bit destination. (OSMesa16/32)
3404 else if (srcType
== GL_UNSIGNED_BYTE
) {
3405 if (dstFormat
== GL_RGBA
) {
3406 if (srcFormat
== GL_RGB
) {
3408 const GLubyte
*src
= (const GLubyte
*) source
;
3410 for (i
= 0; i
< n
; i
++) {
3411 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3412 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3413 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3420 else if (srcFormat
== GL_RGBA
) {
3422 const GLubyte
*src
= (const GLubyte
*) source
;
3424 for (i
= 0; i
< n
; i
++) {
3425 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3426 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3427 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3428 dst
[3] = UBYTE_TO_CHAN(src
[3]);
3435 else if (dstFormat
== GL_RGB
) {
3436 if (srcFormat
== GL_RGB
) {
3438 const GLubyte
*src
= (const GLubyte
*) source
;
3440 for (i
= 0; i
< n
; i
++) {
3441 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3442 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3443 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3449 else if (srcFormat
== GL_RGBA
) {
3451 const GLubyte
*src
= (const GLubyte
*) source
;
3453 for (i
= 0; i
< n
; i
++) {
3454 dst
[0] = UBYTE_TO_CHAN(src
[0]);
3455 dst
[1] = UBYTE_TO_CHAN(src
[1]);
3456 dst
[2] = UBYTE_TO_CHAN(src
[2]);
3467 /* general solution begins here */
3469 GLint dstComponents
;
3470 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3471 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3474 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3478 dstComponents
= _mesa_components_in_format( dstFormat
);
3479 /* source & dest image formats should have been error checked by now */
3480 assert(dstComponents
> 0);
3483 * Extract image data and convert to RGBA floats
3485 if (srcFormat
== GL_COLOR_INDEX
) {
3486 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3489 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3493 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3496 if (dstFormat
== GL_COLOR_INDEX
) {
3498 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3499 /* convert to GLchan and return */
3500 for (i
= 0; i
< n
; i
++) {
3501 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3508 /* Convert indexes to RGBA */
3509 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3510 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3512 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3515 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3516 * with color indexes.
3518 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3523 /* non-color index data */
3524 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3525 srcPacking
->SwapBytes
);
3528 /* Need to clamp if returning GLubytes or GLushorts */
3529 #if CHAN_TYPE != GL_FLOAT
3530 transferOps
|= IMAGE_CLAMP_BIT
;
3534 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3537 get_component_indexes(dstFormat
,
3538 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3540 /* Now return the GLchan data in the requested dstFormat */
3544 for (i
= 0; i
< n
; i
++) {
3545 CLAMPED_FLOAT_TO_CHAN(dst
[rDst
], rgba
[i
][RCOMP
]);
3546 dst
+= dstComponents
;
3553 for (i
= 0; i
< n
; i
++) {
3554 CLAMPED_FLOAT_TO_CHAN(dst
[gDst
], rgba
[i
][GCOMP
]);
3555 dst
+= dstComponents
;
3562 for (i
= 0; i
< n
; i
++) {
3563 CLAMPED_FLOAT_TO_CHAN(dst
[bDst
], rgba
[i
][BCOMP
]);
3564 dst
+= dstComponents
;
3571 for (i
= 0; i
< n
; i
++) {
3572 CLAMPED_FLOAT_TO_CHAN(dst
[aDst
], rgba
[i
][ACOMP
]);
3573 dst
+= dstComponents
;
3581 assert(dstComponents
== 1);
3582 for (i
= 0; i
< n
; i
++) {
3583 /* Intensity comes from red channel */
3584 CLAMPED_FLOAT_TO_CHAN(dst
[i
], rgba
[i
][RCOMP
]);
3592 for (i
= 0; i
< n
; i
++) {
3593 /* Luminance comes from red channel */
3594 CLAMPED_FLOAT_TO_CHAN(dst
[0], rgba
[i
][RCOMP
]);
3595 dst
+= dstComponents
;
3605 * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
3606 * instead of GLchan.
3609 _mesa_unpack_color_span_float( struct gl_context
*ctx
,
3610 GLuint n
, GLenum dstFormat
, GLfloat dest
[],
3611 GLenum srcFormat
, GLenum srcType
,
3612 const GLvoid
*source
,
3613 const struct gl_pixelstore_attrib
*srcPacking
,
3614 GLbitfield transferOps
)
3616 ASSERT(dstFormat
== GL_ALPHA
||
3617 dstFormat
== GL_LUMINANCE
||
3618 dstFormat
== GL_LUMINANCE_ALPHA
||
3619 dstFormat
== GL_INTENSITY
||
3620 dstFormat
== GL_RED
||
3621 dstFormat
== GL_RG
||
3622 dstFormat
== GL_RGB
||
3623 dstFormat
== GL_RGBA
||
3624 dstFormat
== GL_COLOR_INDEX
);
3626 ASSERT(srcFormat
== GL_RED
||
3627 srcFormat
== GL_GREEN
||
3628 srcFormat
== GL_BLUE
||
3629 srcFormat
== GL_ALPHA
||
3630 srcFormat
== GL_LUMINANCE
||
3631 srcFormat
== GL_LUMINANCE_ALPHA
||
3632 srcFormat
== GL_INTENSITY
||
3633 srcFormat
== GL_RG
||
3634 srcFormat
== GL_RGB
||
3635 srcFormat
== GL_BGR
||
3636 srcFormat
== GL_RGBA
||
3637 srcFormat
== GL_BGRA
||
3638 srcFormat
== GL_ABGR_EXT
||
3639 srcFormat
== GL_RED_INTEGER_EXT
||
3640 srcFormat
== GL_GREEN_INTEGER_EXT
||
3641 srcFormat
== GL_BLUE_INTEGER_EXT
||
3642 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3643 srcFormat
== GL_RGB_INTEGER_EXT
||
3644 srcFormat
== GL_RGBA_INTEGER_EXT
||
3645 srcFormat
== GL_BGR_INTEGER_EXT
||
3646 srcFormat
== GL_BGRA_INTEGER_EXT
||
3647 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3648 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
||
3649 srcFormat
== GL_COLOR_INDEX
);
3651 ASSERT(srcType
== GL_BITMAP
||
3652 srcType
== GL_UNSIGNED_BYTE
||
3653 srcType
== GL_BYTE
||
3654 srcType
== GL_UNSIGNED_SHORT
||
3655 srcType
== GL_SHORT
||
3656 srcType
== GL_UNSIGNED_INT
||
3657 srcType
== GL_INT
||
3658 srcType
== GL_HALF_FLOAT_ARB
||
3659 srcType
== GL_FLOAT
||
3660 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3661 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3662 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3663 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3664 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3665 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3666 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3667 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3668 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3669 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3670 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3671 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3673 /* general solution, no special cases, yet */
3675 GLint dstComponents
;
3676 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3677 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3680 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3684 dstComponents
= _mesa_components_in_format( dstFormat
);
3685 /* source & dest image formats should have been error checked by now */
3686 assert(dstComponents
> 0);
3689 * Extract image data and convert to RGBA floats
3691 if (srcFormat
== GL_COLOR_INDEX
) {
3692 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
3695 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3700 extract_uint_indexes(n
, indexes
, srcFormat
, srcType
, source
,
3703 if (dstFormat
== GL_COLOR_INDEX
) {
3705 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
3706 /* convert to GLchan and return */
3707 for (i
= 0; i
< n
; i
++) {
3708 dest
[i
] = (GLchan
) (indexes
[i
] & 0xff);
3715 /* Convert indexes to RGBA */
3716 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
3717 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
3719 _mesa_map_ci_to_rgba(ctx
, n
, indexes
, rgba
);
3722 /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
3723 * with color indexes.
3725 transferOps
&= ~(IMAGE_SCALE_BIAS_BIT
| IMAGE_MAP_COLOR_BIT
);
3730 /* non-color index data */
3731 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3732 srcPacking
->SwapBytes
);
3736 _mesa_apply_rgba_transfer_ops(ctx
, transferOps
, n
, rgba
);
3739 get_component_indexes(dstFormat
,
3740 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3742 /* Now pack results in the requested dstFormat */
3744 GLfloat
*dst
= dest
;
3746 for (i
= 0; i
< n
; i
++) {
3747 dst
[rDst
] = rgba
[i
][RCOMP
];
3748 dst
+= dstComponents
;
3753 GLfloat
*dst
= dest
;
3755 for (i
= 0; i
< n
; i
++) {
3756 dst
[gDst
] = rgba
[i
][GCOMP
];
3757 dst
+= dstComponents
;
3762 GLfloat
*dst
= dest
;
3764 for (i
= 0; i
< n
; i
++) {
3765 dst
[bDst
] = rgba
[i
][BCOMP
];
3766 dst
+= dstComponents
;
3771 GLfloat
*dst
= dest
;
3773 for (i
= 0; i
< n
; i
++) {
3774 dst
[aDst
] = rgba
[i
][ACOMP
];
3775 dst
+= dstComponents
;
3780 GLfloat
*dst
= dest
;
3783 assert(dstComponents
== 1);
3784 for (i
= 0; i
< n
; i
++) {
3785 /* Intensity comes from red channel */
3786 dst
[i
] = rgba
[i
][RCOMP
];
3791 GLfloat
*dst
= dest
;
3794 for (i
= 0; i
< n
; i
++) {
3795 /* Luminance comes from red channel */
3796 dst
[0] = rgba
[i
][RCOMP
];
3797 dst
+= dstComponents
;
3807 * Same as _mesa_unpack_color_span_chan(), but return GLuint data
3808 * instead of GLchan.
3809 * No pixel transfer ops are applied.
3812 _mesa_unpack_color_span_uint(struct gl_context
*ctx
,
3813 GLuint n
, GLenum dstFormat
, GLuint
*dest
,
3814 GLenum srcFormat
, GLenum srcType
,
3815 const GLvoid
*source
,
3816 const struct gl_pixelstore_attrib
*srcPacking
)
3818 GLuint (*rgba
)[4] = (GLuint (*)[4]) malloc(n
* 4 * sizeof(GLfloat
));
3821 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
3825 ASSERT(dstFormat
== GL_ALPHA
||
3826 dstFormat
== GL_LUMINANCE
||
3827 dstFormat
== GL_LUMINANCE_ALPHA
||
3828 dstFormat
== GL_INTENSITY
||
3829 dstFormat
== GL_RED
||
3830 dstFormat
== GL_RG
||
3831 dstFormat
== GL_RGB
||
3832 dstFormat
== GL_RGBA
);
3834 ASSERT(srcFormat
== GL_RED
||
3835 srcFormat
== GL_GREEN
||
3836 srcFormat
== GL_BLUE
||
3837 srcFormat
== GL_ALPHA
||
3838 srcFormat
== GL_LUMINANCE
||
3839 srcFormat
== GL_LUMINANCE_ALPHA
||
3840 srcFormat
== GL_INTENSITY
||
3841 srcFormat
== GL_RG
||
3842 srcFormat
== GL_RGB
||
3843 srcFormat
== GL_BGR
||
3844 srcFormat
== GL_RGBA
||
3845 srcFormat
== GL_BGRA
||
3846 srcFormat
== GL_ABGR_EXT
||
3847 srcFormat
== GL_RED_INTEGER_EXT
||
3848 srcFormat
== GL_GREEN_INTEGER_EXT
||
3849 srcFormat
== GL_BLUE_INTEGER_EXT
||
3850 srcFormat
== GL_ALPHA_INTEGER_EXT
||
3851 srcFormat
== GL_RGB_INTEGER_EXT
||
3852 srcFormat
== GL_RGBA_INTEGER_EXT
||
3853 srcFormat
== GL_BGR_INTEGER_EXT
||
3854 srcFormat
== GL_BGRA_INTEGER_EXT
||
3855 srcFormat
== GL_LUMINANCE_INTEGER_EXT
||
3856 srcFormat
== GL_LUMINANCE_ALPHA_INTEGER_EXT
);
3858 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3859 srcType
== GL_BYTE
||
3860 srcType
== GL_UNSIGNED_SHORT
||
3861 srcType
== GL_SHORT
||
3862 srcType
== GL_UNSIGNED_INT
||
3863 srcType
== GL_INT
||
3864 srcType
== GL_HALF_FLOAT_ARB
||
3865 srcType
== GL_FLOAT
||
3866 srcType
== GL_UNSIGNED_BYTE_3_3_2
||
3867 srcType
== GL_UNSIGNED_BYTE_2_3_3_REV
||
3868 srcType
== GL_UNSIGNED_SHORT_5_6_5
||
3869 srcType
== GL_UNSIGNED_SHORT_5_6_5_REV
||
3870 srcType
== GL_UNSIGNED_SHORT_4_4_4_4
||
3871 srcType
== GL_UNSIGNED_SHORT_4_4_4_4_REV
||
3872 srcType
== GL_UNSIGNED_SHORT_5_5_5_1
||
3873 srcType
== GL_UNSIGNED_SHORT_1_5_5_5_REV
||
3874 srcType
== GL_UNSIGNED_INT_8_8_8_8
||
3875 srcType
== GL_UNSIGNED_INT_8_8_8_8_REV
||
3876 srcType
== GL_UNSIGNED_INT_10_10_10_2
||
3877 srcType
== GL_UNSIGNED_INT_2_10_10_10_REV
);
3880 /* Extract image data as uint[4] pixels */
3881 extract_uint_rgba(n
, rgba
, srcFormat
, srcType
, source
,
3882 srcPacking
->SwapBytes
);
3884 if (dstFormat
== GL_RGBA
) {
3886 memcpy(dest
, rgba
, 4 * sizeof(GLuint
) * n
);
3890 GLint rDst
, gDst
, bDst
, aDst
, lDst
, iDst
;
3891 GLint dstComponents
= _mesa_components_in_format( dstFormat
);
3893 assert(dstComponents
> 0);
3895 get_component_indexes(dstFormat
,
3896 &rDst
, &gDst
, &bDst
, &aDst
, &lDst
, &iDst
);
3898 /* Now pack values in the requested dest format */
3902 for (i
= 0; i
< n
; i
++) {
3903 dst
[rDst
] = rgba
[i
][RCOMP
];
3904 dst
+= dstComponents
;
3911 for (i
= 0; i
< n
; i
++) {
3912 dst
[gDst
] = rgba
[i
][GCOMP
];
3913 dst
+= dstComponents
;
3920 for (i
= 0; i
< n
; i
++) {
3921 dst
[bDst
] = rgba
[i
][BCOMP
];
3922 dst
+= dstComponents
;
3929 for (i
= 0; i
< n
; i
++) {
3930 dst
[aDst
] = rgba
[i
][ACOMP
];
3931 dst
+= dstComponents
;
3939 assert(dstComponents
== 1);
3940 for (i
= 0; i
< n
; i
++) {
3941 /* Intensity comes from red channel */
3942 dst
[i
] = rgba
[i
][RCOMP
];
3950 for (i
= 0; i
< n
; i
++) {
3951 /* Luminance comes from red channel */
3952 dst
[0] = rgba
[i
][RCOMP
];
3953 dst
+= dstComponents
;
3964 * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
3965 * directly return GLbyte data, no transfer ops apply.
3968 _mesa_unpack_dudv_span_byte( struct gl_context
*ctx
,
3969 GLuint n
, GLenum dstFormat
, GLbyte dest
[],
3970 GLenum srcFormat
, GLenum srcType
,
3971 const GLvoid
*source
,
3972 const struct gl_pixelstore_attrib
*srcPacking
,
3973 GLbitfield transferOps
)
3975 ASSERT(dstFormat
== GL_DUDV_ATI
);
3976 ASSERT(srcFormat
== GL_DUDV_ATI
||
3977 srcFormat
== GL_DU8DV8_ATI
);
3979 ASSERT(srcType
== GL_UNSIGNED_BYTE
||
3980 srcType
== GL_BYTE
||
3981 srcType
== GL_UNSIGNED_SHORT
||
3982 srcType
== GL_SHORT
||
3983 srcType
== GL_UNSIGNED_INT
||
3984 srcType
== GL_INT
||
3985 srcType
== GL_HALF_FLOAT_ARB
||
3986 srcType
== GL_FLOAT
);
3988 /* general solution */
3990 GLint dstComponents
;
3993 GLfloat (*rgba
)[4] = (GLfloat (*)[4]) malloc(4 * n
* sizeof(GLfloat
));
3996 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4000 dstComponents
= _mesa_components_in_format( dstFormat
);
4001 /* source & dest image formats should have been error checked by now */
4002 assert(dstComponents
> 0);
4005 * Extract image data and convert to RGBA floats
4007 extract_float_rgba(n
, rgba
, srcFormat
, srcType
, source
,
4008 srcPacking
->SwapBytes
);
4011 /* Now determine which color channels we need to produce.
4012 * And determine the dest index (offset) within each color tuple.
4015 /* Now pack results in the requested dstFormat */
4016 for (i
= 0; i
< n
; i
++) {
4017 /* not sure - need clamp[-1,1] here? */
4018 dst
[0] = FLOAT_TO_BYTE(rgba
[i
][RCOMP
]);
4019 dst
[1] = FLOAT_TO_BYTE(rgba
[i
][GCOMP
]);
4020 dst
+= dstComponents
;
4028 * Unpack a row of color index data from a client buffer according to
4029 * the pixel unpacking parameters.
4030 * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
4032 * Args: ctx - the context
4033 * n - number of pixels
4034 * dstType - destination data type
4035 * dest - destination array
4036 * srcType - source pixel type
4037 * source - source data pointer
4038 * srcPacking - pixel unpacking parameters
4039 * transferOps - the pixel transfer operations to apply
4042 _mesa_unpack_index_span( struct gl_context
*ctx
, GLuint n
,
4043 GLenum dstType
, GLvoid
*dest
,
4044 GLenum srcType
, const GLvoid
*source
,
4045 const struct gl_pixelstore_attrib
*srcPacking
,
4046 GLbitfield transferOps
)
4048 ASSERT(srcType
== GL_BITMAP
||
4049 srcType
== GL_UNSIGNED_BYTE
||
4050 srcType
== GL_BYTE
||
4051 srcType
== GL_UNSIGNED_SHORT
||
4052 srcType
== GL_SHORT
||
4053 srcType
== GL_UNSIGNED_INT
||
4054 srcType
== GL_INT
||
4055 srcType
== GL_HALF_FLOAT_ARB
||
4056 srcType
== GL_FLOAT
);
4058 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4059 dstType
== GL_UNSIGNED_SHORT
||
4060 dstType
== GL_UNSIGNED_INT
);
4063 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4066 * Try simple cases first
4068 if (transferOps
== 0 && srcType
== GL_UNSIGNED_BYTE
4069 && dstType
== GL_UNSIGNED_BYTE
) {
4070 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4072 else if (transferOps
== 0 && srcType
== GL_UNSIGNED_INT
4073 && dstType
== GL_UNSIGNED_INT
&& !srcPacking
->SwapBytes
) {
4074 memcpy(dest
, source
, n
* sizeof(GLuint
));
4080 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4083 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4087 extract_uint_indexes(n
, indexes
, GL_COLOR_INDEX
, srcType
, source
,
4091 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4093 /* convert to dest type */
4095 case GL_UNSIGNED_BYTE
:
4097 GLubyte
*dst
= (GLubyte
*) dest
;
4099 for (i
= 0; i
< n
; i
++) {
4100 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4104 case GL_UNSIGNED_SHORT
:
4106 GLuint
*dst
= (GLuint
*) dest
;
4108 for (i
= 0; i
< n
; i
++) {
4109 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4113 case GL_UNSIGNED_INT
:
4114 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4117 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_index_span");
4126 _mesa_pack_index_span( struct gl_context
*ctx
, GLuint n
,
4127 GLenum dstType
, GLvoid
*dest
, const GLuint
*source
,
4128 const struct gl_pixelstore_attrib
*dstPacking
,
4129 GLbitfield transferOps
)
4131 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4134 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4138 transferOps
&= (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
);
4140 if (transferOps
& (IMAGE_MAP_COLOR_BIT
| IMAGE_SHIFT_OFFSET_BIT
)) {
4141 /* make a copy of input */
4142 memcpy(indexes
, source
, n
* sizeof(GLuint
));
4143 _mesa_apply_ci_transfer_ops(ctx
, transferOps
, n
, indexes
);
4148 case GL_UNSIGNED_BYTE
:
4150 GLubyte
*dst
= (GLubyte
*) dest
;
4152 for (i
= 0; i
< n
; i
++) {
4153 *dst
++ = (GLubyte
) source
[i
];
4159 GLbyte
*dst
= (GLbyte
*) dest
;
4161 for (i
= 0; i
< n
; i
++) {
4162 dst
[i
] = (GLbyte
) source
[i
];
4166 case GL_UNSIGNED_SHORT
:
4168 GLushort
*dst
= (GLushort
*) dest
;
4170 for (i
= 0; i
< n
; i
++) {
4171 dst
[i
] = (GLushort
) source
[i
];
4173 if (dstPacking
->SwapBytes
) {
4174 _mesa_swap2( (GLushort
*) dst
, n
);
4180 GLshort
*dst
= (GLshort
*) dest
;
4182 for (i
= 0; i
< n
; i
++) {
4183 dst
[i
] = (GLshort
) source
[i
];
4185 if (dstPacking
->SwapBytes
) {
4186 _mesa_swap2( (GLushort
*) dst
, n
);
4190 case GL_UNSIGNED_INT
:
4192 GLuint
*dst
= (GLuint
*) dest
;
4194 for (i
= 0; i
< n
; i
++) {
4195 dst
[i
] = (GLuint
) source
[i
];
4197 if (dstPacking
->SwapBytes
) {
4198 _mesa_swap4( (GLuint
*) dst
, n
);
4204 GLint
*dst
= (GLint
*) dest
;
4206 for (i
= 0; i
< n
; i
++) {
4207 dst
[i
] = (GLint
) source
[i
];
4209 if (dstPacking
->SwapBytes
) {
4210 _mesa_swap4( (GLuint
*) dst
, n
);
4216 GLfloat
*dst
= (GLfloat
*) dest
;
4218 for (i
= 0; i
< n
; i
++) {
4219 dst
[i
] = (GLfloat
) source
[i
];
4221 if (dstPacking
->SwapBytes
) {
4222 _mesa_swap4( (GLuint
*) dst
, n
);
4226 case GL_HALF_FLOAT_ARB
:
4228 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4230 for (i
= 0; i
< n
; i
++) {
4231 dst
[i
] = _mesa_float_to_half((GLfloat
) source
[i
]);
4233 if (dstPacking
->SwapBytes
) {
4234 _mesa_swap2( (GLushort
*) dst
, n
);
4239 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4247 * Unpack a row of stencil data from a client buffer according to
4248 * the pixel unpacking parameters.
4249 * This is (or will be) used by glDrawPixels
4251 * Args: ctx - the context
4252 * n - number of pixels
4253 * dstType - destination data type
4254 * dest - destination array
4255 * srcType - source pixel type
4256 * source - source data pointer
4257 * srcPacking - pixel unpacking parameters
4258 * transferOps - apply offset/bias/lookup ops?
4261 _mesa_unpack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4262 GLenum dstType
, GLvoid
*dest
,
4263 GLenum srcType
, const GLvoid
*source
,
4264 const struct gl_pixelstore_attrib
*srcPacking
,
4265 GLbitfield transferOps
)
4267 ASSERT(srcType
== GL_BITMAP
||
4268 srcType
== GL_UNSIGNED_BYTE
||
4269 srcType
== GL_BYTE
||
4270 srcType
== GL_UNSIGNED_SHORT
||
4271 srcType
== GL_SHORT
||
4272 srcType
== GL_UNSIGNED_INT
||
4273 srcType
== GL_INT
||
4274 srcType
== GL_UNSIGNED_INT_24_8_EXT
||
4275 srcType
== GL_HALF_FLOAT_ARB
||
4276 srcType
== GL_FLOAT
);
4278 ASSERT(dstType
== GL_UNSIGNED_BYTE
||
4279 dstType
== GL_UNSIGNED_SHORT
||
4280 dstType
== GL_UNSIGNED_INT
);
4282 /* only shift and offset apply to stencil */
4283 transferOps
&= IMAGE_SHIFT_OFFSET_BIT
;
4286 * Try simple cases first
4288 if (transferOps
== 0 &&
4289 !ctx
->Pixel
.MapStencilFlag
&&
4290 srcType
== GL_UNSIGNED_BYTE
&&
4291 dstType
== GL_UNSIGNED_BYTE
) {
4292 memcpy(dest
, source
, n
* sizeof(GLubyte
));
4294 else if (transferOps
== 0 &&
4295 !ctx
->Pixel
.MapStencilFlag
&&
4296 srcType
== GL_UNSIGNED_INT
&&
4297 dstType
== GL_UNSIGNED_INT
&&
4298 !srcPacking
->SwapBytes
) {
4299 memcpy(dest
, source
, n
* sizeof(GLuint
));
4305 GLuint
*indexes
= (GLuint
*) malloc(n
* sizeof(GLuint
));
4308 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil unpacking");
4312 extract_uint_indexes(n
, indexes
, GL_STENCIL_INDEX
, srcType
, source
,
4315 if (transferOps
& IMAGE_SHIFT_OFFSET_BIT
) {
4316 /* shift and offset indexes */
4317 _mesa_shift_and_offset_ci(ctx
, n
, indexes
);
4320 if (ctx
->Pixel
.MapStencilFlag
) {
4321 /* Apply stencil lookup table */
4322 const GLuint mask
= ctx
->PixelMaps
.StoS
.Size
- 1;
4324 for (i
= 0; i
< n
; i
++) {
4325 indexes
[i
] = (GLuint
)ctx
->PixelMaps
.StoS
.Map
[ indexes
[i
] & mask
];
4329 /* convert to dest type */
4331 case GL_UNSIGNED_BYTE
:
4333 GLubyte
*dst
= (GLubyte
*) dest
;
4335 for (i
= 0; i
< n
; i
++) {
4336 dst
[i
] = (GLubyte
) (indexes
[i
] & 0xff);
4340 case GL_UNSIGNED_SHORT
:
4342 GLuint
*dst
= (GLuint
*) dest
;
4344 for (i
= 0; i
< n
; i
++) {
4345 dst
[i
] = (GLushort
) (indexes
[i
] & 0xffff);
4349 case GL_UNSIGNED_INT
:
4350 memcpy(dest
, indexes
, n
* sizeof(GLuint
));
4353 _mesa_problem(ctx
, "bad dstType in _mesa_unpack_stencil_span");
4362 _mesa_pack_stencil_span( struct gl_context
*ctx
, GLuint n
,
4363 GLenum dstType
, GLvoid
*dest
, const GLstencil
*source
,
4364 const struct gl_pixelstore_attrib
*dstPacking
)
4366 GLstencil
*stencil
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4369 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "stencil packing");
4373 if (ctx
->Pixel
.IndexShift
|| ctx
->Pixel
.IndexOffset
||
4374 ctx
->Pixel
.MapStencilFlag
) {
4375 /* make a copy of input */
4376 memcpy(stencil
, source
, n
* sizeof(GLstencil
));
4377 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencil
);
4382 case GL_UNSIGNED_BYTE
:
4383 if (sizeof(GLstencil
) == 1) {
4384 memcpy( dest
, source
, n
);
4387 GLubyte
*dst
= (GLubyte
*) dest
;
4390 dst
[i
] = (GLubyte
) source
[i
];
4396 GLbyte
*dst
= (GLbyte
*) dest
;
4399 dst
[i
] = (GLbyte
) (source
[i
] & 0x7f);
4403 case GL_UNSIGNED_SHORT
:
4405 GLushort
*dst
= (GLushort
*) dest
;
4408 dst
[i
] = (GLushort
) source
[i
];
4410 if (dstPacking
->SwapBytes
) {
4411 _mesa_swap2( (GLushort
*) dst
, n
);
4417 GLshort
*dst
= (GLshort
*) dest
;
4420 dst
[i
] = (GLshort
) source
[i
];
4422 if (dstPacking
->SwapBytes
) {
4423 _mesa_swap2( (GLushort
*) dst
, n
);
4427 case GL_UNSIGNED_INT
:
4429 GLuint
*dst
= (GLuint
*) dest
;
4432 dst
[i
] = (GLuint
) source
[i
];
4434 if (dstPacking
->SwapBytes
) {
4435 _mesa_swap4( (GLuint
*) dst
, n
);
4441 GLint
*dst
= (GLint
*) dest
;
4444 dst
[i
] = (GLint
) source
[i
];
4446 if (dstPacking
->SwapBytes
) {
4447 _mesa_swap4( (GLuint
*) dst
, n
);
4453 GLfloat
*dst
= (GLfloat
*) dest
;
4456 dst
[i
] = (GLfloat
) source
[i
];
4458 if (dstPacking
->SwapBytes
) {
4459 _mesa_swap4( (GLuint
*) dst
, n
);
4463 case GL_HALF_FLOAT_ARB
:
4465 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4468 dst
[i
] = _mesa_float_to_half( (float) source
[i
] );
4470 if (dstPacking
->SwapBytes
) {
4471 _mesa_swap2( (GLushort
*) dst
, n
);
4476 if (dstPacking
->LsbFirst
) {
4477 GLubyte
*dst
= (GLubyte
*) dest
;
4480 for (i
= 0; i
< n
; i
++) {
4483 *dst
|= ((source
[i
] != 0) << shift
);
4492 GLubyte
*dst
= (GLubyte
*) dest
;
4495 for (i
= 0; i
< n
; i
++) {
4498 *dst
|= ((source
[i
] != 0) << shift
);
4508 _mesa_problem(ctx
, "bad type in _mesa_pack_index_span");
4514 #define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT) \
4517 const GLTYPE *src = (const GLTYPE *)source; \
4518 for (i = 0; i < n; i++) { \
4519 GLTYPE value = src[i]; \
4520 if (srcPacking->SwapBytes) { \
4521 if (sizeof(GLTYPE) == 2) { \
4523 } else if (sizeof(GLTYPE) == 4) { \
4527 depthValues[i] = GLTYPE2FLOAT(value); \
4533 * Unpack a row of depth/z values from memory, returning GLushort, GLuint
4534 * or GLfloat values.
4535 * The glPixelTransfer (scale/bias) params will be applied.
4537 * \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
4538 * \param depthMax max value for returned GLushort or GLuint values
4539 * (ignored for GLfloat).
4542 _mesa_unpack_depth_span( struct gl_context
*ctx
, GLuint n
,
4543 GLenum dstType
, GLvoid
*dest
, GLuint depthMax
,
4544 GLenum srcType
, const GLvoid
*source
,
4545 const struct gl_pixelstore_attrib
*srcPacking
)
4547 GLfloat
*depthTemp
, *depthValues
;
4548 GLboolean needClamp
= GL_FALSE
;
4550 /* Look for special cases first.
4551 * Not only are these faster, they're less prone to numeric conversion
4552 * problems. Otherwise, converting from an int type to a float then
4553 * back to an int type can introduce errors that will show up as
4554 * artifacts in things like depth peeling which uses glCopyTexImage.
4556 if (ctx
->Pixel
.DepthScale
== 1.0 && ctx
->Pixel
.DepthBias
== 0.0) {
4557 if (srcType
== GL_UNSIGNED_INT
&& dstType
== GL_UNSIGNED_SHORT
) {
4558 const GLuint
*src
= (const GLuint
*) source
;
4559 GLushort
*dst
= (GLushort
*) dest
;
4561 for (i
= 0; i
< n
; i
++) {
4562 dst
[i
] = src
[i
] >> 16;
4566 if (srcType
== GL_UNSIGNED_SHORT
4567 && dstType
== GL_UNSIGNED_INT
4568 && depthMax
== 0xffffffff) {
4569 const GLushort
*src
= (const GLushort
*) source
;
4570 GLuint
*dst
= (GLuint
*) dest
;
4572 for (i
= 0; i
< n
; i
++) {
4573 dst
[i
] = src
[i
] | (src
[i
] << 16);
4577 if (srcType
== GL_UNSIGNED_INT_24_8
4578 && dstType
== GL_UNSIGNED_INT
4579 && depthMax
== 0xffffff) {
4580 const GLuint
*src
= (const GLuint
*) source
;
4581 GLuint
*dst
= (GLuint
*) dest
;
4583 for (i
= 0; i
< n
; i
++) {
4584 dst
[i
] = src
[i
] >> 8;
4588 /* XXX may want to add additional cases here someday */
4591 /* general case path follows */
4593 depthTemp
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4595 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel unpacking");
4599 if (dstType
== GL_FLOAT
) {
4600 depthValues
= (GLfloat
*) dest
;
4603 depthValues
= depthTemp
;
4606 /* Convert incoming values to GLfloat. Some conversions will require
4611 DEPTH_VALUES(GLbyte
, BYTE_TO_FLOAT
);
4612 needClamp
= GL_TRUE
;
4614 case GL_UNSIGNED_BYTE
:
4615 DEPTH_VALUES(GLubyte
, UBYTE_TO_FLOAT
);
4618 DEPTH_VALUES(GLshort
, SHORT_TO_FLOAT
);
4619 needClamp
= GL_TRUE
;
4621 case GL_UNSIGNED_SHORT
:
4622 DEPTH_VALUES(GLushort
, USHORT_TO_FLOAT
);
4625 DEPTH_VALUES(GLint
, INT_TO_FLOAT
);
4626 needClamp
= GL_TRUE
;
4628 case GL_UNSIGNED_INT
:
4629 DEPTH_VALUES(GLuint
, UINT_TO_FLOAT
);
4631 case GL_UNSIGNED_INT_24_8_EXT
: /* GL_EXT_packed_depth_stencil */
4632 if (dstType
== GL_UNSIGNED_INT_24_8_EXT
&&
4633 depthMax
== 0xffffff &&
4634 ctx
->Pixel
.DepthScale
== 1.0 &&
4635 ctx
->Pixel
.DepthBias
== 0.0) {
4636 const GLuint
*src
= (const GLuint
*) source
;
4637 GLuint
*zValues
= (GLuint
*) dest
;
4639 for (i
= 0; i
< n
; i
++) {
4640 GLuint value
= src
[i
];
4641 if (srcPacking
->SwapBytes
) {
4644 zValues
[i
] = value
& 0xffffff00;
4649 const GLuint
*src
= (const GLuint
*) source
;
4650 const GLfloat scale
= 1.0f
/ 0xffffff;
4652 for (i
= 0; i
< n
; i
++) {
4653 GLuint value
= src
[i
];
4654 if (srcPacking
->SwapBytes
) {
4657 depthValues
[i
] = (value
>> 8) * scale
;
4662 DEPTH_VALUES(GLfloat
, 1*);
4663 needClamp
= GL_TRUE
;
4665 case GL_HALF_FLOAT_ARB
:
4668 const GLhalfARB
*src
= (const GLhalfARB
*) source
;
4669 for (i
= 0; i
< n
; i
++) {
4670 GLhalfARB value
= src
[i
];
4671 if (srcPacking
->SwapBytes
) {
4674 depthValues
[i
] = _mesa_half_to_float(value
);
4676 needClamp
= GL_TRUE
;
4680 _mesa_problem(NULL
, "bad type in _mesa_unpack_depth_span()");
4685 /* apply depth scale and bias */
4687 const GLfloat scale
= ctx
->Pixel
.DepthScale
;
4688 const GLfloat bias
= ctx
->Pixel
.DepthBias
;
4689 if (scale
!= 1.0 || bias
!= 0.0) {
4691 for (i
= 0; i
< n
; i
++) {
4692 depthValues
[i
] = depthValues
[i
] * scale
+ bias
;
4694 needClamp
= GL_TRUE
;
4698 /* clamp to [0, 1] */
4701 for (i
= 0; i
< n
; i
++) {
4702 depthValues
[i
] = (GLfloat
)CLAMP(depthValues
[i
], 0.0, 1.0);
4707 * Convert values to dstType
4709 if (dstType
== GL_UNSIGNED_INT
) {
4710 GLuint
*zValues
= (GLuint
*) dest
;
4712 if (depthMax
<= 0xffffff) {
4713 /* no overflow worries */
4714 for (i
= 0; i
< n
; i
++) {
4715 zValues
[i
] = (GLuint
) (depthValues
[i
] * (GLfloat
) depthMax
);
4719 /* need to use double precision to prevent overflow problems */
4720 for (i
= 0; i
< n
; i
++) {
4721 GLdouble z
= depthValues
[i
] * (GLfloat
) depthMax
;
4722 if (z
>= (GLdouble
) 0xffffffff)
4723 zValues
[i
] = 0xffffffff;
4725 zValues
[i
] = (GLuint
) z
;
4729 else if (dstType
== GL_UNSIGNED_SHORT
) {
4730 GLushort
*zValues
= (GLushort
*) dest
;
4732 ASSERT(depthMax
<= 0xffff);
4733 for (i
= 0; i
< n
; i
++) {
4734 zValues
[i
] = (GLushort
) (depthValues
[i
] * (GLfloat
) depthMax
);
4738 ASSERT(dstType
== GL_FLOAT
);
4739 /*ASSERT(depthMax == 1.0F);*/
4747 * Pack an array of depth values. The values are floats in [0,1].
4750 _mesa_pack_depth_span( struct gl_context
*ctx
, GLuint n
, GLvoid
*dest
,
4751 GLenum dstType
, const GLfloat
*depthSpan
,
4752 const struct gl_pixelstore_attrib
*dstPacking
)
4754 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4756 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4760 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4761 memcpy(depthCopy
, depthSpan
, n
* sizeof(GLfloat
));
4762 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4763 depthSpan
= depthCopy
;
4767 case GL_UNSIGNED_BYTE
:
4769 GLubyte
*dst
= (GLubyte
*) dest
;
4771 for (i
= 0; i
< n
; i
++) {
4772 dst
[i
] = FLOAT_TO_UBYTE( depthSpan
[i
] );
4778 GLbyte
*dst
= (GLbyte
*) dest
;
4780 for (i
= 0; i
< n
; i
++) {
4781 dst
[i
] = FLOAT_TO_BYTE( depthSpan
[i
] );
4785 case GL_UNSIGNED_SHORT
:
4787 GLushort
*dst
= (GLushort
*) dest
;
4789 for (i
= 0; i
< n
; i
++) {
4790 CLAMPED_FLOAT_TO_USHORT(dst
[i
], depthSpan
[i
]);
4792 if (dstPacking
->SwapBytes
) {
4793 _mesa_swap2( (GLushort
*) dst
, n
);
4799 GLshort
*dst
= (GLshort
*) dest
;
4801 for (i
= 0; i
< n
; i
++) {
4802 dst
[i
] = FLOAT_TO_SHORT( depthSpan
[i
] );
4804 if (dstPacking
->SwapBytes
) {
4805 _mesa_swap2( (GLushort
*) dst
, n
);
4809 case GL_UNSIGNED_INT
:
4811 GLuint
*dst
= (GLuint
*) dest
;
4813 for (i
= 0; i
< n
; i
++) {
4814 dst
[i
] = FLOAT_TO_UINT( depthSpan
[i
] );
4816 if (dstPacking
->SwapBytes
) {
4817 _mesa_swap4( (GLuint
*) dst
, n
);
4823 GLint
*dst
= (GLint
*) dest
;
4825 for (i
= 0; i
< n
; i
++) {
4826 dst
[i
] = FLOAT_TO_INT( depthSpan
[i
] );
4828 if (dstPacking
->SwapBytes
) {
4829 _mesa_swap4( (GLuint
*) dst
, n
);
4835 GLfloat
*dst
= (GLfloat
*) dest
;
4837 for (i
= 0; i
< n
; i
++) {
4838 dst
[i
] = depthSpan
[i
];
4840 if (dstPacking
->SwapBytes
) {
4841 _mesa_swap4( (GLuint
*) dst
, n
);
4845 case GL_HALF_FLOAT_ARB
:
4847 GLhalfARB
*dst
= (GLhalfARB
*) dest
;
4849 for (i
= 0; i
< n
; i
++) {
4850 dst
[i
] = _mesa_float_to_half(depthSpan
[i
]);
4852 if (dstPacking
->SwapBytes
) {
4853 _mesa_swap2( (GLushort
*) dst
, n
);
4858 _mesa_problem(ctx
, "bad type in _mesa_pack_depth_span");
4867 * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
4870 _mesa_pack_depth_stencil_span(struct gl_context
*ctx
, GLuint n
, GLuint
*dest
,
4871 const GLfloat
*depthVals
,
4872 const GLstencil
*stencilVals
,
4873 const struct gl_pixelstore_attrib
*dstPacking
)
4875 GLfloat
*depthCopy
= (GLfloat
*) malloc(n
* sizeof(GLfloat
));
4876 GLstencil
*stencilCopy
= (GLstencil
*) malloc(n
* sizeof(GLstencil
));
4879 if (!depthCopy
|| !stencilCopy
) {
4880 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "pixel packing");
4886 if (ctx
->Pixel
.DepthScale
!= 1.0 || ctx
->Pixel
.DepthBias
!= 0.0) {
4887 memcpy(depthCopy
, depthVals
, n
* sizeof(GLfloat
));
4888 _mesa_scale_and_bias_depth(ctx
, n
, depthCopy
);
4889 depthVals
= depthCopy
;
4892 if (ctx
->Pixel
.IndexShift
||
4893 ctx
->Pixel
.IndexOffset
||
4894 ctx
->Pixel
.MapStencilFlag
) {
4895 memcpy(stencilCopy
, stencilVals
, n
* sizeof(GLstencil
));
4896 _mesa_apply_stencil_transfer_ops(ctx
, n
, stencilCopy
);
4897 stencilVals
= stencilCopy
;
4900 for (i
= 0; i
< n
; i
++) {
4901 GLuint z
= (GLuint
) (depthVals
[i
] * 0xffffff);
4902 dest
[i
] = (z
<< 8) | (stencilVals
[i
] & 0xff);
4905 if (dstPacking
->SwapBytes
) {
4906 _mesa_swap4(dest
, n
);
4917 * Unpack image data. Apply byte swapping, byte flipping (bitmap).
4918 * Return all image data in a contiguous block. This is used when we
4919 * compile glDrawPixels, glTexImage, etc into a display list. We
4920 * need a copy of the data in a standard format.
4923 _mesa_unpack_image( GLuint dimensions
,
4924 GLsizei width
, GLsizei height
, GLsizei depth
,
4925 GLenum format
, GLenum type
, const GLvoid
*pixels
,
4926 const struct gl_pixelstore_attrib
*unpack
)
4928 GLint bytesPerRow
, compsPerRow
;
4929 GLboolean flipBytes
, swap2
, swap4
;
4932 return NULL
; /* not necessarily an error */
4934 if (width
<= 0 || height
<= 0 || depth
<= 0)
4935 return NULL
; /* generate error later */
4937 if (type
== GL_BITMAP
) {
4938 bytesPerRow
= (width
+ 7) >> 3;
4939 flipBytes
= unpack
->LsbFirst
;
4940 swap2
= swap4
= GL_FALSE
;
4944 const GLint bytesPerPixel
= _mesa_bytes_per_pixel(format
, type
);
4945 GLint components
= _mesa_components_in_format(format
);
4948 if (_mesa_type_is_packed(type
))
4951 if (bytesPerPixel
<= 0 || components
<= 0)
4952 return NULL
; /* bad format or type. generate error later */
4953 bytesPerRow
= bytesPerPixel
* width
;
4954 bytesPerComp
= bytesPerPixel
/ components
;
4955 flipBytes
= GL_FALSE
;
4956 swap2
= (bytesPerComp
== 2) && unpack
->SwapBytes
;
4957 swap4
= (bytesPerComp
== 4) && unpack
->SwapBytes
;
4958 compsPerRow
= components
* width
;
4959 assert(compsPerRow
>= width
);
4964 = (GLubyte
*) malloc(bytesPerRow
* height
* depth
);
4968 return NULL
; /* generate GL_OUT_OF_MEMORY later */
4971 for (img
= 0; img
< depth
; img
++) {
4972 for (row
= 0; row
< height
; row
++) {
4973 const GLvoid
*src
= _mesa_image_address(dimensions
, unpack
, pixels
,
4974 width
, height
, format
, type
, img
, row
, 0);
4976 if ((type
== GL_BITMAP
) && (unpack
->SkipPixels
& 0x7)) {
4978 flipBytes
= GL_FALSE
;
4979 if (unpack
->LsbFirst
) {
4980 GLubyte srcMask
= 1 << (unpack
->SkipPixels
& 0x7);
4981 GLubyte dstMask
= 128;
4982 const GLubyte
*s
= src
;
4985 for (i
= 0; i
< width
; i
++) {
4989 if (srcMask
== 128) {
4994 srcMask
= srcMask
<< 1;
5002 dstMask
= dstMask
>> 1;
5007 GLubyte srcMask
= 128 >> (unpack
->SkipPixels
& 0x7);
5008 GLubyte dstMask
= 128;
5009 const GLubyte
*s
= src
;
5012 for (i
= 0; i
< width
; i
++) {
5021 srcMask
= srcMask
>> 1;
5029 dstMask
= dstMask
>> 1;
5035 memcpy(dst
, src
, bytesPerRow
);
5038 /* byte flipping/swapping */
5040 flip_bytes((GLubyte
*) dst
, bytesPerRow
);
5043 _mesa_swap2((GLushort
*) dst
, compsPerRow
);
5046 _mesa_swap4((GLuint
*) dst
, compsPerRow
);